文件上传下载的功能

  • 项目里会遇到需要上传下载文件的情况。记录下简单的文件上传下载功能的实现。文件上传类用到了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;
     }
     }
    
  • 下载文件–前端代码:
    download

在这里插入图片描述

  • 下载文件–后端代码:

    @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请求获取后端的文件流回到前台处理。这个等他写好了偷看下代码呀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值