SpringMVC学习总结(6)--- 文件上传与下载

本文详细介绍了如何在SpringMVC中实现文件上传和下载。文件上传涉及到配置MultipartResolver,包括导入相关依赖,配置解析器,以及前端表单的设定。文件下载则讲解了设置响应头、读写文件的操作。同时,文章还展示了相关的代码实现和项目结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. SpringMVC实现文件上传

文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。

如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver。在springmvc-config.xml中进行配置。

1.1 配置文件

1.1.1 导包

对于文件上传,浏览器在上传的过程中是将文件以的形式提交到服务器端的。

一般选择采用apache的开源工具common-fileupload这个文件上传组件。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。

利用Maven自动导入common-fileupload的依赖包common-io

pom.xml

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

1.1.2 配置MultipartResolver

Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver

springmvc-servlet.xml

<!--文件上传配置-->
	<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的错误!在这里栽过坑,教训!

1.1.3 配置Tomcat

项目名为:/upload

1.2 前端表单

前端表单要求:为了能上传文件,表单的method必须设置为post,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。

表单中的 enctype 属性的详细说明:

  • application/x-www=form-urlencoded:默认方式,只处理表单域中的 value 属性值,采用这种编码方式的表单会将表单域中的值处理成 URL 编码方式。
  • multipart/form-data:这种编码方式会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数中,不会对字符编码。
  • text/plain:除了把空格转换为 “+” 号外,其他字符都不做编码处理,这种方式适用直接通过表单发送邮件。

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%--前端页面--%>
<html>
<head>
<title>上传文件</title>

</head>

<body>
<form enctype="multipart/form-data" method="post" action="${pageContext.request.contextPath}/upload2">
    <input type="file" name="file"><br/>
    <input type="submit" value="上传">

</form>

</body>
</html>

前端页面为:
在这里插入图片描述

1.3 代码实现

文件上传的2种方式:

  • 采用IO流的方式
  • 采用file.transferTo()方式

1.3.1 采用流实现

Controller

必须加上 @RequestParam , 否则也会报错!作用是用来实现封装!

@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象。
批量上传CommonsMultipartFile则为数组即可。

package org.xiao.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@Controller
public class FileUpload {

    //流方式上传文件
    //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
    //批量上传CommonsMultipartFile则为数组即可
    @RequestMapping("/upload1")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
        //获取文件名:file.getOriginalFilename();
        String filename = file.getOriginalFilename();
        //若果文件为空,直接返回到首页
        if("".equals(filename)){
            return "fail";
        }
        System.out.println("上传文件名:"+filename);

        //上传路径保存设置
        String path = request.getServletContext().getRealPath("/upload");
        //如果路径不存在,则创建一个
        File realPath = new File(path);
        if(!realPath.exists()){
            realPath.mkdir();
        }
        System.out.println("上传文件保存地址:"+realPath);

        InputStream fileInputStream = file.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream(new File(realPath, filename));

        //读取写出
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = fileInputStream.read(bytes)) != -1){
            fileOutputStream.write(bytes,0,len);
            fileOutputStream.flush();
        }

        //关闭流,先开后关
        fileOutputStream.close();
        fileInputStream.close();

        return "success";
    }
}

上传成功页面

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>上传文件</title>
</head>
<body>
<h2>文件上传成功!</h2>

</body>
</html>

上传失败页面

file.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>上传文件</title>
</head>
<body>
<h2>文件上传失败!</h2>

</body>
</html>

结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
文件上传的位置:

target/工程名/upload/文件名

在这里插入图片描述

1.3.2 采用配置MultipartResolver实现

Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver

我们使用它的实现类 CommonsMultipartFile , 常用方法:

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

Controller

 @RequestMapping("/upload2")
    @ResponseBody     //json,返回为字符串
    public String upload2(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) throws IOException {

        //上传路径保存设置
        String path = request.getServletContext().getRealPath("/upload");
        File realPath = new File(path);
        if(!realPath.exists()){
            realPath.mkdir();
        }

        //上传文件   transferTo:将文件写入到磁盘,参数就是一个文件
        file.transferTo(new File(realPath+"/"+file.getOriginalFilename()));

        return "文件上传成功!";

    }

结果:
在这里插入图片描述

2. SpringMVC实现文件下载

文件下载步骤:

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

前端页面

index.jsp

<body>
    <p><a href="/download">点击下载</a></p>
</body>

Controller

 @RequestMapping("/download")
    public String download(HttpServletResponse response) throws IOException {

        //要下载的文件路径
        //服务器有没有墙,一般下载都有自己公司的图床,地址;
        String path = "E:\\JAVA\\图片";
        String filename = "timg.jpg";

        //设置响应头信息:【固定语法】
        response.reset();   //让页面不缓存
        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);
        FileInputStream inputStream = new FileInputStream(file);
        ServletOutputStream outputStream = response.getOutputStream();

        //执行操作
        int len = 0;
        byte[] bytes = new byte[1024];
        while((len = inputStream.read(bytes)) != -1){
            outputStream.write(bytes,0,len);
            outputStream.flush();
        }

        outputStream.close();
        inputStream.close();

        return null;
    }

结果
在这里插入图片描述

3. 项目结构

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值