springboot业务功能实战(十六)文件服务器的上传下载接口

举报
小鲍侃java 发表于 2021/09/10 00:03:36 2021/09/10
5.5k+ 0 0
【摘要】 上传 这里有一个实体 用于存放文件信息 存放路径commonfile在配置文件中配置 @RestControllerpublic class FileUpload { @Value("${commonfile}") private String commonfile; /** * 使用Spring MV...

上传

这里有一个实体 用于存放文件信息 存放路径commonfile在配置文件中配置


      @RestController
      public class FileUpload {
         @Value("${commonfile}")
         private String commonfile;
         /**
       * 使用Spring MVC的multipartFile 类作为参数
       *
       * @param multipartFile
       * @return
       */
         @PostMapping("/upload")
         @ResponseBody
         @ArchivesLog(operationName = "上传")
         public Result<FileMessage> uploadMultipartFile(@RequestParam("file") MultipartFile multipartFile) {
              Result<FileMessage> result = new Result<FileMessage>();
              FileMessage fileMessageVO = new FileMessage();
             String fileName = multipartFile.getOriginalFilename();
             try {
                 // 获取文件字节数组
                  byte[] bytes = multipartFile.getBytes();
                 // 文件存储路径(/fileupload1/ 这样会在根目录下创建问价夹)
                  File pfile = new File(commonfile);
                 // 判断文件夹是否存在
                 if (!pfile.exists()) {
                     // 不存在时,创建文件夹
                      pfile.mkdirs();
                  }
                 // 创建文件
                  File file = new File(pfile, fileName);
                 // 写入指定文件夹
                  OutputStream out = new FileOutputStream(file);
                  out.write(bytes);
                 // 组装对象
                  fileMessageVO.setFileName(fileName);
                  fileMessageVO.setFileRoute(commonfile);
                  fileMessageVO.setFileDownloadUri(commonfile + fileName);
                  fileMessageVO.setSize(getPrintSize(file.length()));
                  fileMessageVO.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
                  result.setData(fileMessageVO);
              } catch (Exception e) {
                  e.printStackTrace();
              }
             return result;
          }
         public static String getPrintSize(long size) {
             // 如果字节数少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义
             if (size < 1024) {
                 return String.valueOf(size) + "B";
              } else {
                  size = size / 1024;
              }
             // 如果原字节数除于1024之后,少于1024,则可以直接以KB作为单位
             // 因为还没有到达要使用另一个单位的时候
             // 接下去以此类推
             if (size < 1024) {
                 return String.valueOf(size) + "KB";
              } else {
                  size = size / 1024;
              }
             if (size < 1024) {
                 // 因为如果以MB为单位的话,要保留最后1位小数,
                 // 因此,把此数乘以100之后再取余
                  size = size * 100;
                 return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "MB";
              } else {
                 // 否则如果要以GB为单位的,先除于1024再作同样的处理
                  size = size * 100 / 1024;
                 return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "GB";
              }
          }
      }
  
 

实体类


      public class FileMessage {
         /**
       * 文件名称
       */
         private String fileName;
         /**
       * 文件路径
       */
         private String fileRoute;
         /**
       * 下载地址
       */
         private String fileDownloadUri;
         /**
       * 文件类型
       */
         private String fileType;
         /**
       * 文件大小
       */
         private String size;
      }
  
 

下载


      @RestController
      public class FileDownload {
          @Value("${commonfile}")
         private String commonfile;
          @GetMapping("/download")
         public String downloadFile(FileMessage fileMessage) throws UnsupportedEncodingException {
             // 获取HttpServletResponse
              HttpServletResponse response =
                  ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
             String fileName = fileMessage.getFileName();// 文件名
             if (fileName != null) {
                 // 设置文件路径
                  File file = new File(commonfile + fileName);
                 if (file.exists()) {
                      RequestAttributes requsetAttributes = RequestContextHolder.currentRequestAttributes();
                      HttpServletRequest request = ((ServletRequestAttributes)requsetAttributes).getRequest();
                     // 获得浏览器代理信息
                     final String userAgent = request.getHeader("USER-AGENT");
                     // 判断浏览器代理并分别设置响应给浏览器的编码格式
                     if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
                         // IE浏览器
                          fileName = URLEncoder.encode(fileName, "UTF-8");
                      } else if (StringUtils.contains(userAgent, "Mozilla")) {
                         // google,火狐浏览器
                          fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
                      } else {
                         // 其他浏览器
                          fileName = URLEncoder.encode(fileName, "UTF-8");// 其他浏览器
                      }
                     // 设置HTTP响应头
                      response.reset();
                     // 重置 如果不在页面上显示而是下载下来 则放开注释
                     // response.setContentType("application/octet-stream");// 告知浏览器下载文件,而不是直接打开,浏览器默认为打开
                     // response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");// 下载文件的名称
                     try {
                          OutputStream os = response.getOutputStream();
                         // 读取文件
                          InputStream in = new FileInputStream(file);
                         // copy文件
                          IOUtils.copy(in, os);
                          in.close();
                          os.close();
                         return "下载成功";
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              }
             return "下载失败";
          }
      }
  
 

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/106129270

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。