• SpringMVC入门宝典(七)SpringMVC文件上传(下)


    目录

    一.异步上传

    二.跨服务器上传

    三.文件下载


    一.异步上传

    之前的上传方案,在上传成功后都会跳转页面。而在实际开发中,很多情况下上传后不进行跳转,而是进行页面的局部刷新 ,比如: 上传头像成功后将头像显示在网页中。这时候就需要使用异步文件 上传。
    1
    1.编写 JSP 页面,引入 jQuery jQuery 表单上传工具jquery.form.js
    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. </form>
    15. <%-- 头像预览图 --%>
    16. <img src="/" width="100" id="header" />
    17. <script>
    18. $(function (){
    19. $("#btn").click(function (){
    20. // 异步提交表单
    21. $("#ajaxForm").ajaxSubmit({
    22. url:"/fileUpload4",
    23. type:"post",
    24. success:function (data){
    25. $("#header").attr("src",data);
    26. }
    27. })
    28. })
    29. })
    30. </script>
    31. </body>
    32. </html>
    2.编写控制器接收异步上传请求
    1. // MultipartFile参数名必须和JSP文件空间的name属性一致
    2. @RequestMapping("/fileUpload4")
    3. @ResponseBody
    4. public String upload4(MultipartFile file,HttpServletRequest request) throws IOException {
    5. // 创建文件夹,存放上传文件
    6. String realPath = request.getSession().getServletContext().getRealPath("/upload");
    7. File dir = new File(realPath);
    8. if(!dir.exists()){
    9. dir.mkdirs();
    10. }
    11. // 将上传的数据写到文件夹的文件中
    12. // 1.拿到上传的文件名
    13. String filename = file.getOriginalFilename();
    14. filename = UUID.randomUUID()+"_"+filename;
    15. // 2.创建空文件
    16. File newFile = new File(dir,filename);
    17. // 3.将数据写入空文件中
    18. file.transferTo(newFile);
    19. // 返回文件路径,赋给img标签的src属性
    20. return "/upload/"+filename;
    21. }

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

    点击上传头像,实现了异步更新与上传(页面没有跳转)

     

    二.跨服务器上传

    由于文件占据磁盘空间较大,在实际开发中往往会将文件上传到其他服务器中,此时需要使用跨服务器上传文件。
    1
    1.准备一个文件服务器:解压 tomcat(使用之前学服务器时安装的tomcat即可) 作为图片服务器,在 tomcat webapps 下创建 upload 目录作为文件上传目录。
    2
    2.修改 tomcat conf/web.xml 文件,支持跨服上传。
    即关闭只读,使可以往服务器上传输文件。

     需添加内容(即红框部分):

    1. <init-param>        
    2. <param-name>readonly</param-name>
    3. <param-value>false</param-value>  
    4. </init-param>
    3. 修改 tomcat conf/server.xml 文件,修改 tomcat 端口,修改完开启 tomcat 服务器(bin下的startup.bat)
    1. <Connector port="8081" protocol="HTTP/1.1"
    2. connectionTimeout="20000"
    3. redirectPort="8443" />

    修改端口号为8081

    4.编写 JSP 上传表单upload5.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. </form>
    15. <%-- 头像预览图 --%>
    16. <img src="/" width="100" id="header" />
    17. <script>
    18. $(function (){
    19. $("#btn").click(function (){
    20. // 异步提交表单
    21. $("#ajaxForm").ajaxSubmit({
    22. url:"/fileUpload5",
    23. type:"post",
    24. success:function (data){
    25. $("#header").attr("src",data);
    26. }
    27. })
    28. })
    29. })
    30. </script>
    31. </body>
    32. </html>
    5.添加跨服上传依赖
    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>
    11. </dependency>

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

    1. @RequestMapping("/fileUpload5")
    2. @ResponseBody
    3. public String upload5(MultipartFile file,HttpServletRequest request) throws IOException{
    4. // 设置跨服上传的服务器路径
    5. String path = "http://localhost:8081/upload/";
    6. // 获取上传的文件名
    7. String filename = file.getOriginalFilename();
    8. filename = UUID.randomUUID()+"_"+filename;
    9. // 跨服上传
    10. // 1.创建客户端对象
    11. Client client = Client.create();
    12. // 2.使用客户端对象连接图片服务器
    13. WebResource resource = client.resource(path + filename);
    14. // 3.数据传输(以字节的形式)
    15. resource.put(file.getBytes());
    16. // 返回文件路径
    17. return path+filename;
    18. }

    在idea中开启项目服务器,访问http://localhost:8080/upload5.jsp

    查看图片服务器(咱们上面启动的那个tomcat)

    三.文件下载

    下面是从当前项目服务器下载。

    将文件上传到服务器后,有时我们需要让用户下载上传的文件,接下来我们编写文件下载功能:
    查询所有可下载的文件
    1.编写控制器方法,查询所有可下载的文件,并跳转到下载页面
    1. package com.first.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.ui.Model;
    4. import org.springframework.web.bind.annotation.RequestMapping;
    5. import javax.servlet.http.HttpServletRequest;
    6. import java.io.File;
    7. @Controller
    8. public class DownLoadController {
    9. // 查询可下载的文件
    10. @RequestMapping("/showFiles")
    11. public String showFileDown(HttpServletRequest request, Model model){
    12. //1.获取下载文件路径集合。注:跨服务器上传中,网络路径无法获取文件列表。
    13. String path = request.getSession().getServletContext().getRealPath("/upload");
    14. System.out.println(path);
    15. File file = new File(path);
    16. String[] files = file.list();
    17. //2.将路径放入模型中,跳转到JSP页面
    18. model.addAttribute("files",files);
    19. return "download";
    20. }
    21. }
    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. 编写下载页面
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    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>
    编写下载控制器
    1. package com.first.controller;
    2. import org.apache.commons.io.FileUtils;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.ui.Model;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import javax.servlet.ServletOutputStream;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import java.io.File;
    10. import java.io.IOException;
    11. @Controller
    12. public class DownLoadController {
    13. // 查询可下载的文件
    14. @RequestMapping("/showFiles")
    15. public String showFileDown(HttpServletRequest request, Model model){
    16. //1.获取下载文件路径集合。注:跨服务器上传中,网络路径无法获取文件列表。
    17. String path = request.getSession().getServletContext().getRealPath("/upload");
    18. File file = new File(path);
    19. String[] files = file.list();
    20. //2.将路径放入模型中,跳转到JSP页面
    21. model.addAttribute("files",files);
    22. return "download";
    23. }
    24. // 文件下载
    25. @RequestMapping("/download")
    26. public void fileDown(HttpServletRequest request, HttpServletResponse response,String fileName) throws IOException {
    27. // 设置响应头
    28. response.setHeader("Content-Disposition","attachment;filename="+fileName);
    29. // 获取文件路径
    30. String path = request.getSession().getServletContext().getRealPath("/upload");
    31. File file = new File(path,fileName);
    32. // 获取字节输出流
    33. ServletOutputStream os = response.getOutputStream();
    34. // 使用输出流写出文件
    35. os.write(FileUtils.readFileToByteArray(file));
    36. os.flush();
    37. os.close();
    38. }
    39. }

     访问 http://localhost:8080/showFiles

     

     点击链接即可弹出下载窗口。

  • 相关阅读:
    ToDoList全局事件总线学习笔记
    【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于阿里云、小程序、Arduino的WS2812灯控系统
    【个人博客搭建】hexo搭建个人博客
    phpstudy本地快速搭建网站,实现无公网IP外网访问
    微信小程序--WXML模板(页面逻辑)-2
    topK问题---使用优先级队列解决
    基于STM32的DS18B20多点测温系统(Proteus仿真+程序)
    「学习笔记」后缀数组
    论文字体,Word字体大小对照换算表(字号、磅、英寸、像素)
    Android请求应用权限
  • 原文地址:https://blog.csdn.net/weixin_44593822/article/details/125606112