前端表单
<form action="/upload/file" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input name="type" value="orther">
<button type="submit">提交</button>
</form>
- SpringMVC上传
import com.shangge.frameWork.config.DrivingConfig;
import com.shangge.frameWork.config.ServerConfig;
import com.shangge.frameWork.enums.PicType;
import com.shangge.frameWork.model.JsonBackData;
import com.shangge.util.FileUploadUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Controller
@RequestMapping("upload")
public class FileController {
@Autowired
private ServerConfig serverConfig;
/**
* 单一上传图片
* @param file
* @param type 上传图片的类型 例如头像等
* @return
* @throws IOException
*/
@RequestMapping("/file")
@ResponseBody
public JsonBackData uploadFile(@RequestParam(value = "file") MultipartFile file,
@RequestParam(value = "type")String type) throws IOException {
JsonBackData json = new JsonBackData();
//上传后返回的相对路径
String path ="";
//上传的图片路径
String pic = "/upload/img";
path = FileUploadUtils.upload(pic,file);
Map<String,String> map = new HashMap<String,String>();
map.put("path",path);//相对路径
map.put("fullPath",serverConfig.getUrl() + path);//全路径
json.setData(map);
return json;
}
}
import java.io.*;
import java.time.LocalDateTime;
import java.util.UUID;
import com.shangge.frameWork.config.DrivingConfig;
import com.shangge.frameWork.exception.FileSizeLimitException;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
/**
* 文件上传工具类
*/
@Slf4j
public class FileUploadUtils {
/**
* 根据文件路径上传
* @param baseDir 相对应用的基目录
* @param file 上传的文件
* @return 返回上传成功的文件名
* @throws FileSizeLimitException 超出最大大小
* @throws IOException 读写文件出错
*/
public static final String upload(String baseDir, MultipartFile file)
throws FileSizeLimitException, IOException {
try{
String pathFileName = "";//返回的路劲
//重命名文件名
String orgFileName = file.getOriginalFilename();
String dataUuid = DateUtil.formatYMTime(LocalDateTime.now())+"/" +UUID.randomUUID().toString().replaceAll("-","");
String type = FilenameUtils.getExtension(orgFileName);
String fileMaster = dataUuid + "." + type; //主图地址
File masterFile = getAbsoluteFile(baseDir, fileMaster);
if(isImage(type)) {//如果是图片上传 再上传三种格式200x200 500x500 700x700
String small = dataUuid+"_s"+"."+type;
File sFile = getAbsoluteFile(baseDir, small);
compressPicForSize(sFile,file.getBytes(),200);
File mFile = getAbsoluteFile(baseDir, dataUuid+"_m"+"."+type);
compressPicForSize(mFile,file.getBytes(),500);
File lFile = getAbsoluteFile(baseDir, dataUuid+"_l"+"."+type);
compressPicForSize(lFile,file.getBytes(),700);
pathFileName = getPathFileName(baseDir, small);
} else{//不是图片上传是其他文件上传例如pdf excel
pathFileName = getPathFileName(baseDir, fileMaster);
}
file.transferTo(masterFile);//上传主文件地址
return pathFileName;
}
catch (Exception e) {
log.info(e.getMessage());
throw new IOException(e.getMessage(), e);
}
}
/**
* 创建文件目录
* @param uploadDir
* @param fileName
* @return
* @throws IOException
*/
private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
{
File file = new File(uploadDir + File.separator + fileName);
if (!file.getParentFile().exists())
{
file.getParentFile().mkdirs();
}
if (!file.exists())
{
file.createNewFile();
}
return file;
}
/**
* 返回相对路径
* @param uploadDir
* @param fileName
* @return
*/
private static final String getPathFileName(String uploadDir, String fileName) {
int dirLastIndex = DrivingConfig.getProfile().length() + 1;
String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
String pathFileName = DrivingConfig.getResourcePrefix() + "/" + currentDir + "/" + fileName;
return pathFileName;
}
/**
* 图片判断
* @param type
* @return
*/
public static boolean isImage(String type) {
String[] imageExtension = new String[]{"jpeg", "jpg", "gif", "bmp", "png"};
for (String e : imageExtension)
if (type.toLowerCase().equals(e))
return true;
return false;
}
/**
*
* @param file 图片文件
* @param imageBytes
* @param size 图片大小
*/
public static void compressPicForSize(File file,byte[] imageBytes,int size) {
try {
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
Thumbnails.of(inputStream)
.size(size, size)
.toOutputStream(outputStream);
imageBytes = outputStream.toByteArray();
FileUtils.writeByteArrayToFile(file, imageBytes);
} catch (Exception e) {
log.error("【图片压缩】msg=图片压缩失败!", e);
}
}
}
- servlet上传图片
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import com.angroid.js.JsonBackData;
import com.angroid.oa.module.ConfigHelper;
import com.angroid.oa.module.PicType;
import com.angroid.util.DateX;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
@SuppressWarnings("serial")
public class UploadServlet extends HttpServlet{
public String type ="";
public String pic;
public String path;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
JsonBackData<String> json = new JsonBackData<String>();
//解决乱码问题
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter out = null;
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//设置缓冲区大小为10kb
diskFileItemFactory.setSizeThreshold(10240);
//创建上传组件
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//设置单个文件上传大小限制
servletFileUpload.setFileSizeMax(50*10240);
long maxSize = 50*10240;
try {
List<FileItem> list = servletFileUpload.parseRequest(request);
//System.out.println(list);
Iterator itr = list.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
if(item.isFormField()) {//文本
type = item.getString();//取得上传的文件类别属性值 比如 头像 合同之类的
} else {//检验是否上传文件 与限制大小
if (item.getSize() == 0) {
System.out.println("请正确上传文件");
json.setCode(400);
json.setMsg("请正确上传文件");
out = response.getWriter();
out.write(json.toString());
out.flush();
out.close();
return ;
}
if (item.getSize() > maxSize) {
System.out.println("文件大小不能超过50M");
json.setCode(400);
json.setMsg("文件大小不能超过50M");
out = response.getWriter();
out.write(json.toString());
out.flush();
out.close();
return ;
}
}
}
try {
pic = "/upload/img";
}catch (Exception e) {
json.setCode(400);
json.setMsg("程序出错了");
e.printStackTrace();
out = response.getWriter();
out.write(json.toString());
out.flush();
out.close();
return ;
}
for(FileItem item : list){
//对item进行判断
if(item.isFormField()){ //如果是普通文本表单字段,返回一个true否则返回一个false。因此可以用该方法判断是否是普通表单域还是文件上传表单域。
//不做处理
//请上传文件
// name = item.getFieldName();//文本的name属性 type
}else{
path = pic;
//获取输出流
pic = request.getServletContext().getRealPath("/")+pic;
File dirFile = new File(pic);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
String fileExt = item.getName().substring(item.getName().lastIndexOf("."));
fileExt = DateX.geMonthtime()+fileExt;
path = path +"/"+fileExt;//全路径
pic = pic+"/"+fileExt;//返回给前端的相对路径
json.setData(path);
OutputStream os = new FileOutputStream(new File(pic));
//将文件保存下来
IOUtils.copy(item.getInputStream(),os);
}
}
json.setCode(200);
json.setMsg("上传成功");
out = response.getWriter();
out.write(json.toString());
out.flush();
out.close();
} catch (FileUploadException e) {
json.setCode(400);
json.setMsg("程序出错了");
e.printStackTrace();
out = response.getWriter();
out.write(json.toString());
out.flush();
out.close();
return ;
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
<!-- web.xml配置 -->
<servlet>
<servlet-name>upServlet</servlet-name>
<servlet-class>xxx.UploadServlet</servlet-class> <!-- 包路径 -->
</servlet>
<servlet-mapping>
<servlet-name>upServlet</servlet-name>
<url-pattern>/upload/file</url-pattern>
</servlet-mapping>
所需2个包 commons-fileupload-1.4 commons-io-2.8.0