以流的方式对文件上传下载,并保存指定位置

简介: 以流的方式对文件上传下载,并保存指定位置


image.png

本方法是将文件以流的方式,下载到指定的路径。

1.java代码

1. @Controller
2. public class FileController {
3. 
4. @RequestMapping(value = "/fileuploads")
5. public String toFileUpload() {
6. return "fileupload";
7.     }
8. 
9. @RequestMapping(value = "/fileupload")
10. public String fileUpload(@RequestParam(value = "file") List<MultipartFile> files, HttpServletRequest request) {
11. String msg = "";
12. // 判断文件是否上传
13. if (!files.isEmpty()) {
14. // 设置上传文件的保存目录
15. String basePath = request.getServletContext().getRealPath("/upload/");
16. // 判断文件目录是否存在
17. File uploadFile = new File(basePath);
18. if (!uploadFile.exists()) {
19.                 uploadFile.mkdirs();
20.             }
21. for (MultipartFile file : files) {
22. String originalFilename = file.getOriginalFilename();
23. if (originalFilename != null && !originalFilename.equals("")) {
24. try {
25. // 对文件名做加UUID值处理
26.                         originalFilename = UUID.randomUUID() + "_" + originalFilename;
27.                         file.transferTo(new File(basePath + originalFilename));
28.                     } catch (IOException e) {
29.                         e.printStackTrace();
30.                         msg = "文件上传失败!";
31.                     }
32.                 } else {
33.                     msg = "上传的文件为空!";
34.                 }
35.             }
36.             msg = "文件上传成功!";
37.         } else {
38.             msg = "没有文件被上传!";
39.         }
40.         request.setAttribute("msg", msg);
41. return "chatroom";
42.     }
43. 
44. @ExceptionHandler(MaxUploadSizeExceededException.class)
45. public String handException(MaxUploadSizeExceededException e, HttpServletRequest request) {
46. //        System.out.println("我捕获了异常");
47.         request.setAttribute("msg", "文件超过了指定大小,上传失败!");
48. return "fileupload";
49.     }
50. 
51. 
52. @RequestMapping(value = "/filedownload")
53. public String toFileDownload(HttpServletRequest request) {
54. return "filedownload";
55.     }
56. 
57. @RequestMapping(value = "/fileList")
58. @ResponseBody
59. public String fileList(HttpServletRequest request) {
60. String baseDir = request.getServletContext().getRealPath("/upload");
61. File baseFile = new File(baseDir);
62.         List<String> fileList = null;
63. if (baseFile.exists()) {
64.             File[] files = baseFile.listFiles();
65.             fileList = new ArrayList<>(files.length);
66. for (File file : files) {
67.                 fileList.add(file.getName());
68.             }
69.         }
70. //        System.out.println(fileList.toString());
71. String json = JSON.toJSONString(fileList);
72. return json;
73.     }
74. 
75. 
76. @RequestMapping(value = "/download")
77. public ResponseEntity<byte[]> fileDownload(String filename, HttpServletRequest request) throws IOException {
78. String path = request.getServletContext().getRealPath("/upload/");
79. File file = new File(path + filename);
80.         System.out.println("转码前" + filename);
81.         filename = this.getFilename(request, filename);
82.         System.out.println("转码后" + filename);
83. // 设置响应头通知浏览器下载
84. HttpHeaders headers = new HttpHeaders();
85. // 将对文件做的特殊处理还原
86.         filename = filename.substring(filename.indexOf("_") + 1);
87.         headers.setContentDispositionFormData("attachment", filename);
88.         headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
89. return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
90.     }
91. 
92. // 根据不同的浏览器进行编码设置,返回编码后的文件名
93. public String getFilename(HttpServletRequest request, String filename) throws UnsupportedEncodingException {
94.         String[] IEBrowerKeyWords = {"MSIE", "Trident", "Edge"};
95. String userAgent = request.getHeader("User-Agent");
96. for (String keyword : IEBrowerKeyWords) {
97. if (userAgent.contains(keyword)) {
98. return URLEncoder.encode(filename, "UTF-8");
99.             }
100.         }
101. return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
102.     }
103. 
104. 
105. }
1. $(function(){
2.    var targer = $("#main2")
3.    $.ajax({
4.      url: "fileList",
5.      dataType: "json",
6.      success: function (data) {
7.        for (var i in data) {
8.          var a = $("<a></a><br>").text(data[i].substring(data[i].indexOf("_")+1))
9.          a.attr("href", "${pageContext.request.contextPath}/download?filename="+encodeURIComponent(data[i]))
10.           targer.append(a)
11.           alert(targer)
12.         }
13.       }
14.     })
15.   }

2.js代码

1. function check() {
2.    var file = document.getElementById("file");
3.    if (file.value == "") {
4.      alert("上传的文件为空")
5.      return false;
6.    }
7.    return true;
8.  }

3.jsp代码

1. <div id="main" style="width:500px; margin: 0 auto;">
2.        <form action="fileupload" method="post" enctype="multipart/form-data" onsubmit="return check()">
3.          <input type="file" name="file" id="file" multiple="multiple"><br>
4.          <input type="submit" value="上传">
5.        </form>
6.      </div>
7. 
8.      <div id="main2" style="width:500px; margin: 0 auto;">
9. 
10.       </div>


相关文章
文件覆盖写入和追加写入:使用场景、命令和技巧详解
文件覆盖写入和追加写入:使用场景、命令和技巧详解
1121 0
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
52 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
4月前
分享:根据批量的图片文件名,如何在电脑里一次性查找多张图片,复制并保存到新的文件夹
本文介绍了一款批量文件处理软件,用于快速查找和管理大量图片。通过下载链接提供软件,用户可执行以下操作:搜索并复制特定文件名的图片,从大型图库中筛选目标图片至指定位置,或按文件名批量删除图片。软件支持完全匹配、模糊查找和格式限定等查找方式。使用后能显著提升图片整理效率,节省时间。
517 3
|
4月前
|
Web App开发
PanTools v1.0.27 多网盘批量管理、遍历分享、转存、重命名、复制...
一款针对多个热门网盘的文件管理、批量分享、批量转存、批量重命名、批量复制、批量链接检测、跨账号移动文件、多账号文件搜索等,支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者、网盘拉新等,对于管理名下具有多个网盘多个账号具有实用的效果。
111 0
|
12月前
|
JSON 算法 Java
项目中不同位置资源文件读取的几种方式
项目中不同位置资源文件读取的几种方式
49 0
|
JavaScript
用nodejs实现向文件的固定位置插入内容
用nodejs实现向文件的固定位置插入内容
107 0
|
存储 Java
Java实现文件上传到本地(自定义保存路径)
Java实现文件上传到本地(自定义保存路径)
777 0
Navicat保存下来的查询放在哪个位置
保存后的查询文件查找位置:
1048 0
Navicat保存下来的查询放在哪个位置
|
小程序 C#
C#释放内嵌的资源文件到指定位置(几种情况的讨论)
C#释放内嵌的资源文件到指定位置(几种情况的讨论)
458 0
|
存储 JSON 前端开发
只需百来行代码,为你的Web页面增加本地文件操作能力,确定不试试吗?
笔者开源了一个`Web`思维导图[mind-map](https://github.com/wanglin2/mind-map),数据默认是存储在`localstorage`里,如果想保存到本地文件,需要使用导出功能,下次打开再使用导入功能,编辑完如果又想保存到文件,那么又需要从重新导出覆盖原来的文件,不得不说,可以但不优雅,所以最近增加了直接编辑本地文件的能力,体验了一下,还是不错的,并且就是调调`API`的事情,很简单,何乐而不为。
217 0