当前位置:首页 > 后端开发 > 正文内容

SpringMVC-09-文件上传和下载

邻居的猫1个月前 (12-09)后端开发255

1、准备作业

Spring

文件上传是项目开发中最常见的功用之一 ,

Spring 能够很好的支撑文件上传,可是 Spring 的默许环境中没有安装 MultipartResolver,

因而默许情况下其不能处理文件上传作业。

假如想运用 Spring 的文件上传功用,则需要在 Spring 环境中装备 MultipartResolver

前端表单

为了能上传文件,

有必要将表单的 method 特点设置为 POST,

enctype 特点 设置为 multipart/form-data

只要在这样的情况下,浏览器才会把用户挑选的文件以二进制流的方法发送给服务器。

这儿不对 enctype 特点作过多的解说,具体的能够去看 HTML enctype 特点 这篇文章。

文件上传依靠

在2003年,Apache Software Foundation发布了开源的 Commons FileUpload 组件,

其很快成为Servlet/JSP程序员上传文件的最佳挑选。

  • Servlet3.0标准现已供给办法来处理文件上传,但这种上传需要在Servlet中完结。
  • 而Spring MVC则供给了更简略的封装。
  • Spring MVC为文件上传供给了直接的支撑,这种支撑是用即插即用的MultipartResolver完结的。
  • Spring MVC运用Apache Commons FileUpload技能完结了一个MultipartResolver完结类:CommonsMultipartResolver。

SpringMVC的文件上传还需要依靠Apache Commons FileUpload的组件。


2、文件上传

导入文件上传的jar包,commons-fileupload , Maven会主动帮咱们导入他的依靠包 commons-io包;

<!--文件上传-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

装备bean:multipartResolver

<!--文件上传装备-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 恳求的编码格局,有必要和jSP的pageEncoding特点共同,以便正确读取表单的内容,默许为ISO-8859-1 -->
    <property name="defaultEncoding" value="utf-8"/>
    <!-- 上传文件巨细上限,单位为字节(10485760=10M) -->
    <property name="maxUploadSize" value="10485760"/>
    <property name="maxInMemorySize" value="40960"/>
</bean>

留意!!!这个bena的id有必要为:multipartResolver , 不然上传文件会报400的过错!

CommonsMultipartFile 的 常用办法:

  • String getOriginalFilename():获取上传文件的原名
  • InputStream getInputStream():获取文件流
  • void transferTo(File dest):将上传文件保存到一个目录文件中

测验

前端页面

<form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">
    <p>
        <input type="file" name="file"/>
    </p>
    <p>
        <input type="submit" value="upload">
    </p>
</form>

Controller

@Controller
public class FileController {

    @Autowired
    ServletContext servletContext;

    //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 目标
    //批量上传CommonsMultipartFile则为数组即可
    @RequestMapping("/upload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException {
        //获取文件名
        String uploadFileName = file.getOriginalFilename();
        //假如文件名为空,直接回到主页!
        if ("".equals(uploadFileName)) {
            return "redirect:/";
        }
        System.out.println("上传文件名 : " + uploadFileName);

        //获取实在物理途径
        String path = servletContext.getRealPath("/upload");
        //假如途径不存在,创立一个
        File realPath = new File(path);
        if (!realPath.exists()) {
            realPath.mkdir();
        }
        System.out.println("上传文件保存地址:" + realPath);

        InputStream is = file.getInputStream(); //文件输入流
        OutputStream os = new FileOutputStream(new File(realPath, uploadFileName)); //文件输出流
        //读取写出
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        os.close();
        is.close();

        return "redirect:/";
    }

    /**
     * 选用file.transferTo 来保存上传的文件
     */
    @RequestMapping("/upload2")
    public String fileUpload2(@RequestParam("file") CommonsMultipartFile file) throws IOException {

        //获取实在物理途径
        String path = servletContext.getRealPath("/upload");
        File realPath = new File(path);
        if (!realPath.exists()) {
            realPath.mkdir();
        }
        //上传文件地址
        System.out.println("上传文件保存地址:" + realPath);

        //经过CommonsMultipartFile的办法直接写文件(留意这个时分)
        file.transferTo(new File(realPath + "/" + file.getOriginalFilename()));
        return "redirect:/";
    }

}

留意!!!CommonsMultipartFile 为特别参数,有必要运用 @RequestParam 注解 指定前端参数,不然不能进行数据绑定。


3、文件下载

文件下载过程:

  1. 设置 response 呼应头
  2. 读取文件 — InputStream
  3. 写出文件 — OutputStream
  4. 履行操作
  5. 封闭流 (先开后关)

代码完结

前端页面

<p>
    <a href="${pageContext.request.contextPath}/download">点击下载</a>
</p>

Controller

@RequestMapping("/download")
public void downloads(HttpServletResponse response) throws Exception {
    //要下载的资源地址
    String path = servletContext.getRealPath("/upload");
    String fileName = "计算机结构框图.jpg";

    //1、设置response 呼应头
    response.reset(); //设置页面不缓存,清空buffer
    response.setCharacterEncoding("UTF-8"); //字符编码
    response.setContentType("multipart/form-data"); //多扩展类型表单数据
    //设置呼应头为 附件
    response.setHeader("Content-Disposition",
            "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
    File file = new File(path, fileName);

    //2、 读取文件--输入流
    InputStream input = new FileInputStream(file);
    //3、 写出文件--输出流
    OutputStream out = response.getOutputStream();
    byte[] buff = new byte[1024];
    int index = 0;
    //4、履行 写出操作
    while ((index = input.read(buff)) != -1) {
        out.write(buff, 0, index);
    }

    out.close();
    input.close();
}

以上文件上传和下载都已完结,我们能够和JavaWeb原生的方法比照一下,就能够知道这个快捷多了!

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=132

标签: JavaSpringMVC
分享给朋友:

“SpringMVC-09-文件上传和下载” 的相关文章

php关键字, 定义与声明

1. 变量定义: `int`:定义整型变量 `float`:定义浮点型变量 `string`:定义字符串变量 `bool`:定义布尔型变量 `array`:定义数组变量 `object`:定义对象变量 `resource`:定义资源类型变量 `null...

c语言按位取反

c语言按位取反

在C语言中,按位取反可以通过按位取反运算符 `~` 来实现。这个运算符会将操作数的每一位都取反,即0变成1,1变成0。下面是一个简单的例子,演示如何使用按位取反运算符:```cinclude int main { int num = 5; // 二进制表示为 101 int invert...

java连接数据库

java连接数据库

Java连接数据库通常涉及以下几个步骤:1. 加载数据库驱动:首先需要加载数据库的驱动程序。这通常通过调用 `Class.forName` 方法完成。2. 建立数据库连接:使用 `DriverManager.getConnection` 方法来建立与数据库的连接。你需要提供数据库的URL、用户名和密...

go是什么词,深入解析英语单词“go”的多重含义与用法

go是什么词,深入解析英语单词“go”的多重含义与用法

1. 动词:表示去、离开、前往、进行等动作。例如:I need to go to the store.(我需要去商店。)2. 名词:表示游戏围棋。围棋是一种古老的策略游戏,起源于中国,在日本、韩国等地也非常流行。3. 名词:表示“尝试”、“尝试做某事”。例如:Let's give it a go.(...

php考试系统,构建高效在线考试平台

php考试系统,构建高效在线考试平台

1. 小马考试(ponyexam): 这是一个基于PHP MySQL开发的免费开源在线教育源代码系统,支持多种题型(单选题、多选题、判断题、填空题等),支持在线考试和自动/人工批阅试卷。适用于各类学校、培训机构和企业内训。2. phpems: 这是一个开源免费的PHP在线考试系统,特别优...

python不等于,深入解析Python中的不等于运算符

python不等于,深入解析Python中的不等于运算符

在Python中,当使用 `!=` 运算符时,如果两个值不相等,则返回 `True`。在这个例子中,变量 `x` 的值为5,变量 `y` 的值为7,它们不相等,所以 `x != y` 的结果是 `True`。深入解析Python中的不等于运算符在Python编程语言中,不等于运算符是一个非常重要的概...