文件上传

(1)下载添加2个jar包

  • commons-fileupload.jar
  • commons-io.jar

SpringMVC的文件上传依赖于Apache的FileUpload组件,需要下载添加2个jar包,下载地址:

http://commons.apache.org/proper/commons-fileupload/

http://commons.apache.org/proper/commons-io/

(2)表单

  <form action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
选择文件:<input name="uploadFile" type="file" multiple /><br />
<button type="submit">上传</button>
</form>

multiple用于文件多选,不使用multiple则只能选择一个文件。

(3)controller

@org.springframework.stereotype.Controller
public class FileUploadController{ @RequestMapping("/fileUpload")
public String fileUpload(@RequestParam("uploadFile") List<MultipartFile> fileList, HttpServletRequest request) {
//如果用户上传了文件
if (!fileList.isEmpty() && fileList.size()>0){
System.out.println(fileList.isEmpty());
System.out.println(fileList.size());
//设置保存路径为项目根目录下的upload文件夹
String savePath = request.getServletContext().getRealPath("/upload");
//不存在就新建
File saveDir = new File(savePath);
if (!saveDir.exists()){
saveDir.mkdirs();
} //循环读取上传文件并保存
for (MultipartFile file:fileList){
//原文件名
String originalFilename = file.getOriginalFilename();
//使用uuid防止文件重名,因为原文件名中包含扩展名,只能放最后面
String newFilename= UUID.randomUUID()+"_"+originalFilename;
System.out.println(originalFilename);
//将临时文件保存至指定目录
try {
file.transferTo(new File(saveDir+"/"+newFilename));
} catch (IOException e) {
e.printStackTrace();
return "error";
} }
return "success";
}
//如果用户未上传文件,返回error
return "error";
} }

SpringMVC用MultipartFile来封装上传文件,一个MultipartFile对应一个上传文件。

(4)SpringMVC的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--包扫描-->
<context:component-scan base-package="com.chy.controller" /> <!--注解驱动,自动注册HandlerMapping、HandlerAdapter-->
<mvc:annotation-driven /> <!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/" />
<!--后缀-->
<property name="suffix" value=".jsp" />
</bean> <!-- 配置MultipartResolver,bean的id或name必须为multipartResolver -->
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上传文件使用的编码字符集-->
<property name="defaultEncoding" value="utf-8" />
<!-- 所允许上传文件的最大尺寸,单位字节-->
<property name="maxUploadSize" value="10485760" />
</bean> </beans>

只需配置MultipartResolver。


文件下载

(1)前端传递文件名

<a href="${pageContext.request.contextPath}/download?filename=1.jpg">下载文件</a>

(2)controller

@org.springframework.stereotype.Controller
public class DownloadController{ @RequestMapping("/download")
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,String filename) throws IOException {
//指定存放文件的路径,此路径是在部署项目下,/表示部署项目的根路径
String dir=request.getServletContext().getRealPath("/files");
File file = new File(dir + "/" + filename); //设置响应头
HttpHeaders httpHeaders = new HttpHeaders();
//通知浏览器以下载的方式处理,第二个参数指定文件名
httpHeaders.setContentDispositionFormData("attachment", filename);
//以流的形式返回
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); //读取目标文件
byte[] arr = FileUtils.readFileToByteArray(file);
//创建ResponseEntity对象并返回。目标文件的byte[]、HttpHeaders、Http状态码
return new ResponseEntity<>(arr, httpHeaders, HttpStatus.OK);
} }

读取目标文件为byte[ ],使用的FileUtils是commons-io.jar中的类,所以要添加commons-io.jar。

也可以使用jdk自带的方式读取目标文件为byte[ ]:

    FileInputStream fileInputStream = new FileInputStream(file);
byte[] arr = fileInputStream.readAllBytes();

不需要添加额外的jar包。


解决下载文件,中文文件名乱码的问题

上面的代码,如果文件名中有中文,文件名会乱码。

原因在于此句代码中的文件名未指定编码字符集:

httpHeaders.setContentDispositionFormData("attachment", filename);

浏览器拿到文件名,发现没有指定字符集,就使用浏览器默认的字符集,

很多浏览器的默认字符集是ISO-8859,不包含中文字符,无法处理文件名里的中文,从而文件名乱码。

解决方式:

httpHeaders.setContentDispositionFormData("attachment", URLEncoder.encode(filename,"utf-8"));

对文件名使用utf-8编码。

此种方式只对部分浏览器有效。

不同的浏览器,默认的编码字符集可能不同,解决方式也可能不同,需要根据User-Agent(浏览器内核)来分别处理。

SpringMVC 文件的上传、下载的更多相关文章

  1. SocketIo+SpringMvc实现文件的上传下载

    SocketIo+SpringMvc实现文件的上传下载 socketIo不仅可以用来做聊天工具,也可以实现局域网(当然你如果有外网也可用外网)内实现文件的上传和下载,下面是代码的效果演示: GIT地址 ...

  2. Spring实现文件的上传下载

    背景:之前一直做的是数据库的增删改查工作,对于文件的上传下载比较排斥,今天研究了下具体的实现,发现其实是很简单.此处不仅要实现单文件的上传,还要实现多文件的上传. 单文件的下载知道了,多文件的下载呢? ...

  3. SSM框架之中如何进行文件的上传下载

    SSM框架的整合请看我之前的博客:http://www.cnblogs.com/1314wamm/p/6834266.html 现在我们先看如何编写文件的上传下载:你先看你的pom.xml中是否有文件 ...

  4. 在Window的IIS中创建FTP的Site并用C#进行文件的上传下载

    文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服务器计算机上. 然后,远程计算机可以使用 FTP ...

  5. 创建FTP的Site并用C#进行文件的上传下载

    创建FTP的Site并用C#进行文件的上传下载 文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服 ...

  6. linux链接及文件互相上传下载

    若排版紊乱可查看我的个人博客原文地址 基本操作 本篇博客主要介绍如何去链接远程的linux主机及如何实现本地与远程主机之间文件的上传下载操作,下面的linux系统是CentOS6.6 链接远程linu ...

  7. JAVAWEB之文件的上传下载

    文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将 ...

  8. python使用ftplib模块实现FTP文件的上传下载

    python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...

  9. php文件夹上传下载控件分享

    用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个php文件夹上传下载的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助. 以下是实例的部分脚本文件 这里我先 ...

  10. 使用Fileupload完成文件的上传下载

    目录 使用Fileupload完成文件的上传下载 为什么需要进行文件上传下载? 引入jar包 文件上传 注意事项 编写一个简单的文件上传jsp页面 编写Servlet Student类用于封装数据,后 ...

随机推荐

  1. 质因数分解(0)<P2012_1>

    质因数分解 (prime.cpp/c/pas) [问题描述] 已知正整数n是两个不同的质数的乘积,试求出较大的那个质数. [输入] 输入文件名为prime.in. 输入只有一行,包含一个正整数n. [ ...

  2. 解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type 'xx.mapper.xxMapper'

    1.启动 SpringBoot项目报错,使用的是Springboot.Spring.Mybatis连接Mysql数据库,启动SpringBoot项目报错,错误如下所示: _____ .__/\ .__ ...

  3. W - Prime Time 素数判断+前缀和

    W - Prime Time 题意:用公式n*n+n+41,判断素数的百分比 #include<iostream> #include<algorithm> #include&l ...

  4. 【PAT甲级】1020 Tree Traversals (25 分)(树知二求一)

    题意: 输入一个正整数N(N<=30),给出一棵二叉树的后序遍历和中序遍历,输出它的层次遍历. trick: 当30个点构成一条单链时,如代码开头处的数据,大约1e9左右的结点编号大小,故采用结 ...

  5. html-webpack-plugin & clean-webpack-plugin

    html-webpack-plugin Introduction: The HtmlWebpackPlugin simplifies creation of HTML files to serve y ...

  6. java并发:初探用户线程和守护线程

    用户线程和守护线程 用户线程 用户线程执行完,jvm退出.守护线程还是可以跑的 /** * A <i>thread</i> is a thread of execution i ...

  7. vue使用H5实现滚动到页面底部时加载数据

    使用原生vue实现瀑布流,发现无法实现小程序那种滚动到地步触发加载效果,只能自己研究了 实现效果: 实现代码: 首先添加监听滚动事件 mounted() { window.addEventListen ...

  8. 「Luogu P2568 GCD」

    看到这是一道紫题还是和gcd有关的才点进来(毕竟数论只会gcd). 前置芝士 质数**(又称素数):因数只有1和本身,但是很特殊的1不是一个质数. gcd**:欧几里得算法,又称辗转相除法,可以在约为 ...

  9. Oracle笔记--Sql语句

    1.SQL的三种类型语句: --1)DML(Data Manipulation Language)数据操纵语言 --2)DDL(Data Definition Language):数据定义语言 --3 ...

  10. Day2-E-Catch That Cow-POJ3278

    Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. ...