- 项目里会遇到需要上传下载文件的情况。记录下简单的文件上传下载功能的实现。文件上传类用到了MultipartFile类来处理多文件上传。同时可以实现HandlerExceptionResolver接口去重写resolveException方法控制全局单个文件上传的大小。
- 以下是代码实现,上传文件–前端代码:
-
上传文件–后端代码
@RestController public class UpandDownController extends HttpServlet { @RequestMapping(value = "/uploadfile", method = RequestMethod.POST) String info = ""; String savePath = "C:/savapath"; File file = new File(savePath); //如果文件夹不存在创建一个 if (!file.exists() && !file.isDirectory()) { file.mkdir(); } if (myfiles != null && myfiles.length > 0) { for (int i = 0; i < myfiles.length; i++) { MultipartFile files = myfiles[i]; boolean re = SaveFile(files, savePath); if (re) { res.setInfo("文件上传成功!"); res.setCode(200); } else { res.setInfo(files.getOriginalFilename() + "上传失败!"); res.setCode(400); return res; } } } else { res.setInfo("文件上传失败!"); res.setCode(400); } return res; } public boolean SaveFile(MultipartFile file, String path) { boolean res = false; if (file != null) { try { String savepath = path + "/" + file.getOriginalFilename(); File file1 = new File(savepath); if (file1.exists()) { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHhhss"); String dateString = formatter.format(currentTime); savepath = path + "/" + UUID.randomUUID().toString() + "_" + file.getOriginalFilename(); } //保存文件到指定路径 file.transferTo(new File(savepath)); res = true; } catch (Exception ex) { return false; } } return res; } }
-
下载文件–前端代码:
-
下载文件–后端代码:
@RestController public class UpandDownController extends HttpServlet { @RequestMapping("/get/download") public Res DownLoad(String path, HttpServletResponse response) { Res res = new Res(); File file = new File(path); if (file.exists()) { String filename = file.getName(); response.setContentType("application/force-download");//强制下载打开 response.setHeader("Content-Disposition", "attachment;fileName=" + filename); byte[] bytes = new byte[1024]; FileInputStream inputStream = null; BufferedInputStream bufferedInputStream = null; try { //先将文件输入流拿出来 inputStream = new FileInputStream(file); //放到缓冲区 bufferedInputStream = new BufferedInputStream(inputStream); //输出流 OutputStream outputStream = response.getOutputStream(); int i = bufferedInputStream.read(bytes); //每次只读1024个字节,读完i是-1 while (i != -1) { //每次写1024个字节,从0个开始写到i个结束 outputStream.write(bytes, 0, i); outputStream.flush(); //i从缓冲区继续读字节 i = bufferedInputStream.read(bytes); } res.setCode(200); res.setInfo("下载成功!"); return res; } catch (Exception ex) { log("文件下载错误日志", ex); } finally { if (bufferedInputStream != null) { try { bufferedInputStream.close(); } catch (IOException ex) { log("关闭缓冲区错误日志", ex); } } if (inputStream != null) { try { inputStream.close(); } catch (IOException ex) { log("关闭输入流错误日志", ex); } } } } return res; } }
-
限制全局文件上传大小,applications.properties的配置
#单个文件的最大上限
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=50MB
#单个请求的文件总大小上限
spring.servlet.multipart.max-request-size=50MB
-
捕获文件过大异常,文件超过规定大小返回异常,正常继续操作
@Configuration
public class ExceptionHandler implements HandlerExceptionResolver {
//重写方法判断异常输出错误信息
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mv=new ModelAndView();
if(ex instanceof MaxUploadSizeExceededException){
mv.addObject(“uploadmessge”,“上传的文件过大”);
}else {
return null;
}
return mv;
}
}
总结:所有关于IO流操作了,异常或者结束的时候都要关闭。其实这里的前端多个文件上传不应该是用多个form表单去上传,现在处理多个文件上传是前端合并上传,或者文件过大时分片上传。有关于这个以后继续学习下。刚刚听同事讨论上传下载,有这样的需求,勾选多个文件压缩成一个包下载,前端以post请求获取后端的文件流回到前台处理。这个等他写好了偷看下代码呀。