当前位置:   article > 正文

Spring MVC异步上传、跨服务器上传和文件下载_文件异步上传

文件异步上传

一、异步上传

之前的上传方案,在上传成功后都会跳转页面。而在实际开发中,很多情况下上传后不进行跳转,而是进行页面的局部刷新,比如:上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。

1.1 JSP页面

编写JSP页面,引入jQuery和jQuery表单上传工具jquery.form.js【该js文件已经上传到我的资源,有需要的小伙伴可以自行下载】

upload4.jsp 

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>上传</title>
  5. <script src="/js/jquery-2.1.1.min.js"></script>
  6. <script src="/js/jquery.form.js"></script>
  7. </head>
  8. <body>
  9. <h3>文件上传</h3>
  10. <form id="ajaxForm" enctype="multipart/form-data">
  11. <input type="file" name="file"/>
  12. <%-- 按钮类型不能是submit,否则会刷新页面 --%>
  13. <input type="button" value="上传头像" id="btn"/>
  14. <!-- 上传头像后展示的位置 -->
  15. <img src="/" width="100" id="img">
  16. <script>
  17. $(function () {
  18. $("#btn").click(function () {
  19. // 异步提交表单
  20. $("#ajaxForm").ajaxSubmit({
  21. url: "/fileUpload4",
  22. type: "post",
  23. success: function (data) {
  24. $("#img").attr("src", data);
  25. console.log(data);
  26. }
  27. })
  28. })
  29. })
  30. </script>
  31. </form>
  32. </body>
  33. </html>

1.2 控制器方法

  1. // 接收异步上传请求
  2. @RequestMapping("/fileUpload4")
  3. // 不进行页面跳转
  4. @ResponseBody
  5. public String upload3(HttpServletRequest request,MultipartFile file) throws Exception{
  6. // 1.设置上传文件保存的文件夹,存放上传的文件
  7. String realPath = request.getSession().getServletContext().getRealPath("/upload");
  8. File dir = new File(realPath);
  9. if(!dir.exists()){
  10. dir.mkdirs();
  11. }
  12. // 拿到上传文件名
  13. String filename = file.getOriginalFilename();
  14. filename = UUID.randomUUID()+"_"+filename;
  15. // 创建空文件
  16. File newFile = new File(dir,filename);
  17. // 将上传的文件写到空文件中
  18. file.transferTo(newFile);
  19. System.out.println("/upload/"+filename);
  20. return "/upload/"+filename;
  21. }

1.3 测试结果

访问路径:http://localhost:8080/upload4.jsp

OK,我们可以看得出来确实只刷新了头像那一部分的页面。本次案例成功实现 

二、跨服务器上传

由于文件占据磁盘空间较大,在实际开发中往往会将文件上传到其他服务器中,此时需要使用跨服务器上传文件。

2.1 修改tomcat的部分配置

1. 解压tomcat作为图片服务器,在tomcat的webapps下创建upload目录作为文件上传目录。

这是我自己的tomcat安装目录,新建一个upload文件夹。 

2. 修改tomcat的 conf/web.xml 文件,支持跨服上传。

  1. <servlet>  
  2.   <init-param>    
  3.     <param-name>readonly</param-name>
  4.     <param-value>false</param-value>
  5.   </init-param>
  6. </servlet>

3. 修改tomcat的 conf/server.xml 文件,修改tomcat端口,修改完开启tomcat服务器,如下图:

<Connector port="8081" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443" />

 

 双击运行

出现该页面,不要关闭这个页面!!! 

2.2 JSP页面

这里的内容和上面的JSP没有区别!只是响应的路径不一样。

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>上传</title>
  5. <script src="/js/jquery-2.1.1.min.js"></script>
  6. <script src="/js/jquery.form.js"></script>
  7. </head>
  8. <body>
  9. <h3>文件上传</h3>
  10. <form id="ajaxForm" enctype="multipart/form-data">
  11. <input type="file" name="file"/>
  12. <%-- 按钮类型不能是submit,否则会刷新页面 --%>
  13. <input type="button" value="上传头像" id="btn"/>
  14. <!-- 上传头像后展示的位置 -->
  15. <img src="/" width="100" id="img">
  16. <script>
  17. $(function () {
  18. $("#btn").click(function () {
  19. // 异步提交表单
  20. $("#ajaxForm").ajaxSubmit({
  21. url: "/fileUpload5",
  22. type: "post",
  23. success: function (data) {
  24. $("#img").attr("src", data);
  25. console.log(data);
  26. }
  27. })
  28. })
  29. })
  30. </script>
  31. </form>
  32. </body>
  33. </html>

2.3 添加依赖

这里我们需要在pom.xml添加跨服上传依赖

  1. <!-- 跨服上传 -->
  2. <dependency>
  3. <groupId>com.sun.jersey</groupId>
  4. <artifactId>jersey-core</artifactId>
  5. <version>1.18.1</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.sun.jersey</groupId>
  9. <artifactId>jersey-client</artifactId>
  10. <version>1.18.1</version>

2.4 控制器方法

创建控制器方法,该方法在接受到上传请求后将文件保存到其他服务器上。

  1. // 该方法接收到上传请求后将文件保存到其他服务器上
  2. @RequestMapping("/fileUpload5")
  3. @ResponseBody
  4. public String upload4(HttpServletRequest request,MultipartFile file) throws Exception{
  5. // 设置跨服上传的服务器路径
  6. String path = "http://localhost:8081/upload/";
  7. // 获取上传的文件名
  8. String filename = file.getOriginalFilename();
  9. filename = UUID.randomUUID()+"_"+filename;
  10. // 跨服上传:
  11. // 1.创建客户端对象
  12. Client client = Client.create();
  13. // 2.使用客户端对象连接图片服务器
  14. WebResource resource = client.resource(path+filename);
  15. // 3.传输数据
  16. resource.put(file.getBytes());
  17. System.out.println(path+filename);
  18. return path+filename;
  19. }

2.5 测试结果 

访问路径:http://localhost:8080/upload5.jsp

可以看得到确实成功上传到了服务器上面的upload目录下

三、文件下载

将文件上传到服务器后,有时我们需要让用户下载上传的文件,接下来我们编写文件下载功能:

3.1 查询可下载文件方法

编写控制器方法,查询所有可下载的文件(我这里是查询存放在/webapps/upload/目录下的图片),并跳转到下载页面

  1. // 查询可下载的文件
  2. @RequestMapping("/showFiles")
  3. public String showFileDown(HttpServletRequest request, Model model){
  4. // 1.获取下载文件路径集合。注:跨服务器上传中,网络路径无法获取文件列表。
  5. String path = request.getSession().getServletContext().getRealPath("/upload");
  6. File file = new File(path);
  7. String [] files = file.list();
  8. // 2.将路径放入模型中,跳转到JSP页面
  9. model.addAttribute("files",files);
  10. return "download";
  11. }

3.2 添加JSTL依赖

  1. <!-- 添加JSTL依赖 -->
  2. <dependency>
  3. <groupId>org.apache.taglibs</groupId>
  4. <artifactId>taglibs-standard-spec</artifactId>
  5. <version>1.2.5</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.taglibs</groupId>
  9. <artifactId>taglibs-standard-impl</artifactId>
  10. <version>1.2.5</version>
  11. </dependency>

3.3 编写下载页面

  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>下载</title>
  6. </head>
  7. <body>
  8. <h3>文件下载</h3>
  9. <%-- 遍历文件集合 --%>
  10. <c:forEach items="${files}" var="file">
  11. <a href="/download?fileName=${file}">${file}</a><br/>
  12. </c:forEach>
  13. </body>
  14. </html>

3.4 下载控制器方法

  1. // 文件下载
  2. @RequestMapping("/download")
  3. public void fileDown(HttpServletRequest request, HttpServletResponse response,String fileName) throws Exception{
  4. // 设置响应头
  5. response.setHeader("Content-Disposition","attachment;filename="+fileName);
  6. // 获取文件路径
  7. String path = request.getSession().getServletContext().getRealPath("/upload");
  8. File file = new File(path,fileName);
  9. // 获取字节输出流
  10. ServletOutputStream os = response.getOutputStream();
  11. // 使用输出流写出文件
  12. os.write(FileUtils.readFileToByteArray(file));
  13. os.flush();
  14. os.close();
  15. }

3.5 测试结果

OK,我们先来访问http://localhost:8080/showFiles

查询出所有可以下载的文件:然后点击下载也是可以成功下载,文件的上传和下载就学习到这里了。

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章

4. Spring MVC系列专栏文章   

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/262040
推荐阅读
相关标签
  

闽ICP备14008679号