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

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

上传

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


  
  1. @RestController
  2. public class FileUpload {
  3. @Value("${commonfile}")
  4. private String commonfile;
  5. /**
  6. * 使用Spring MVC的multipartFile 类作为参数
  7. *
  8. * @param multipartFile
  9. * @return
  10. */
  11. @PostMapping("/upload")
  12. @ResponseBody
  13. @ArchivesLog(operationName = "上传")
  14. public Result<FileMessage> uploadMultipartFile(@RequestParam("file") MultipartFile multipartFile) {
  15. Result<FileMessage> result = new Result<FileMessage>();
  16. FileMessage fileMessageVO = new FileMessage();
  17. String fileName = multipartFile.getOriginalFilename();
  18. try {
  19. // 获取文件字节数组
  20. byte[] bytes = multipartFile.getBytes();
  21. // 文件存储路径(/fileupload1/ 这样会在根目录下创建问价夹)
  22. File pfile = new File(commonfile);
  23. // 判断文件夹是否存在
  24. if (!pfile.exists()) {
  25. // 不存在时,创建文件夹
  26. pfile.mkdirs();
  27. }
  28. // 创建文件
  29. File file = new File(pfile, fileName);
  30. // 写入指定文件夹
  31. OutputStream out = new FileOutputStream(file);
  32. out.write(bytes);
  33. // 组装对象
  34. fileMessageVO.setFileName(fileName);
  35. fileMessageVO.setFileRoute(commonfile);
  36. fileMessageVO.setFileDownloadUri(commonfile + fileName);
  37. fileMessageVO.setSize(getPrintSize(file.length()));
  38. fileMessageVO.setFileType(fileName.substring(fileName.lastIndexOf(".") + 1));
  39. result.setData(fileMessageVO);
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }
  43. return result;
  44. }
  45. public static String getPrintSize(long size) {
  46. // 如果字节数少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义
  47. if (size < 1024) {
  48. return String.valueOf(size) + "B";
  49. } else {
  50. size = size / 1024;
  51. }
  52. // 如果原字节数除于1024之后,少于1024,则可以直接以KB作为单位
  53. // 因为还没有到达要使用另一个单位的时候
  54. // 接下去以此类推
  55. if (size < 1024) {
  56. return String.valueOf(size) + "KB";
  57. } else {
  58. size = size / 1024;
  59. }
  60. if (size < 1024) {
  61. // 因为如果以MB为单位的话,要保留最后1位小数,
  62. // 因此,把此数乘以100之后再取余
  63. size = size * 100;
  64. return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "MB";
  65. } else {
  66. // 否则如果要以GB为单位的,先除于1024再作同样的处理
  67. size = size * 100 / 1024;
  68. return String.valueOf((size / 100)) + "." + String.valueOf((size % 100)) + "GB";
  69. }
  70. }
  71. }

实体类


  
  1. public class FileMessage {
  2. /**
  3. * 文件名称
  4. */
  5. private String fileName;
  6. /**
  7. * 文件路径
  8. */
  9. private String fileRoute;
  10. /**
  11. * 下载地址
  12. */
  13. private String fileDownloadUri;
  14. /**
  15. * 文件类型
  16. */
  17. private String fileType;
  18. /**
  19. * 文件大小
  20. */
  21. private String size;
  22. }

下载


  
  1. @RestController
  2. public class FileDownload {
  3. @Value("${commonfile}")
  4. private String commonfile;
  5. @GetMapping("/download")
  6. public String downloadFile(FileMessage fileMessage) throws UnsupportedEncodingException {
  7. // 获取HttpServletResponse
  8. HttpServletResponse response =
  9. ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
  10. String fileName = fileMessage.getFileName();// 文件名
  11. if (fileName != null) {
  12. // 设置文件路径
  13. File file = new File(commonfile + fileName);
  14. if (file.exists()) {
  15. RequestAttributes requsetAttributes = RequestContextHolder.currentRequestAttributes();
  16. HttpServletRequest request = ((ServletRequestAttributes)requsetAttributes).getRequest();
  17. // 获得浏览器代理信息
  18. final String userAgent = request.getHeader("USER-AGENT");
  19. // 判断浏览器代理并分别设置响应给浏览器的编码格式
  20. if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
  21. // IE浏览器
  22. fileName = URLEncoder.encode(fileName, "UTF-8");
  23. } else if (StringUtils.contains(userAgent, "Mozilla")) {
  24. // google,火狐浏览器
  25. fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
  26. } else {
  27. // 其他浏览器
  28. fileName = URLEncoder.encode(fileName, "UTF-8");// 其他浏览器
  29. }
  30. // 设置HTTP响应头
  31. response.reset();
  32. // 重置 如果不在页面上显示而是下载下来 则放开注释
  33. // response.setContentType("application/octet-stream");// 告知浏览器下载文件,而不是直接打开,浏览器默认为打开
  34. // response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");// 下载文件的名称
  35. try {
  36. OutputStream os = response.getOutputStream();
  37. // 读取文件
  38. InputStream in = new FileInputStream(file);
  39. // copy文件
  40. IOUtils.copy(in, os);
  41. in.close();
  42. os.close();
  43. return "下载成功";
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. }
  49. return "下载失败";
  50. }
  51. }

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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