SpringMVC 的文件上传以及文件下载
- 查看 Maven 的依赖写法(速度比较快): https://mvnrepository.com/
- 查看 Maven 的依赖写法以及依赖的 Jar 文件:http://maven.outofmemory.cn/,建议百度查询的时候直接 groupid/artifactid/ 依赖jar 文件查询,比在网站内部查询较快。
一、文件上传
SpringMVC 使用MultipartResolver 接口处理文件上传
。MultipartResolver 是一个接口,它的实现类是CommonsMultipartResolver 类
和StandardServletMultipartResolver 类。
- 客户端发送请求,前端控制器( DispatcherServlet )拦截请求,其中的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest ( 继承了 HttpServletRequest ) 对象中,最后传递给 Controller。
- 综上所述,
前端控制器拦截请求后,会判断请求是否包含文件,文件请求交由 MultipartHttpServletRequest 处理。
(一)上述两种实现类(CommonsMultipartResolver 与StandardServletMultipartResolver )的区别:
CommonsMultipartResolver 使用 commons Fileupload 来处理 multipart 请求,所以在使用时,必须要引入相应的 jar 包(commons-fileupload)。
StandardServletMultipartResolver 是基于 Servlet 3.0 来处理 multipart 请求的,所以不需要引用其他 jar 包。
(二)Jar 包冲突。
我在执行上传文件的过程中,可能是先导入的 commons-lang3 工具类。
原因如下 :
(一)CommonsMultipartResolver 方式。
- 在 Spring MVC 的配置文件中,加入如下的配置。
- 没有上述配置文件,将会报异常。出现此异常可能是有两个原因,
一是没有配置文件,二是提交的表单需要添加 enctype="multipart/form-data" 内容。
- 就是上述提到的表单提交 要带着 enctype=“multipart/form-data” 。
表单提交:单文件上传以及多文件上传的表单形式。
Ajax 提交方式,完成文件上传。
文件上传(JQuery AJAX 的使用)。 - 服务器处理文件。
(二)StandardServletMultipartResolver
- 配置文件,需要配置在 springmvc.xml 文件中。
- 配置所需要的参数,参数位置在 web.xml 中。
- 在服务器中进行上传文件的操作。同上。
二、文件下载
(1)文件下载伴随着进度条的实现
- Java 项目中模拟进度条的实现。
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class testDownLoad {
public static void dowanload(String url, String path)
throws IOException {
System.out.println("下载中...");
InputStream inputStream = null;
RandomAccessFile randomAccessFile = null;
try {
HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setConnectTimeout(10 * 1000);
File file = new File(path);
// 文件夹是否存在
if (!file.getParentFile().exists()){
// 文件夹不存在就要创建
file.getParentFile().mkdir();
}
// 当前的文件存在就要删除,以接替换新的文件
if (file.exists()){
file.delete();
}
// 创建一个新的名字来存储文件
file.createNewFile();
int responseCode = urlConnection.getResponseCode();
if (responseCode >= 200 && responseCode < 300) {
inputStream = urlConnection.getInputStream();
int len = 0;
byte[] data = new byte[4096];
//用于保存当前进度(具体进度)
int progres = 0;
//获取文件长度
int maxProgres = urlConnection.getContentLength();
randomAccessFile = new RandomAccessFile(file, "rwd");
//设置文件大小
randomAccessFile.setLength(maxProgres);
//将文件大小分成100分,每一分的大小为unit
int unit = maxProgres / 100;
//用于保存当前进度(1~100%)
int unitProgress = 0;
while (-1 != (len = inputStream.read(data))) {
randomAccessFile.write(data, 0, len);
progres += len;//保存当前具体进度
int temp = progres / unit; //计算当前百分比进度
if (temp >= 1 && temp > unitProgress) {//如果下载过程出现百分比变化
unitProgress = temp;//保存当前百分比
System.out.println("正在下载中..." + unitProgress + "%");
}
}
inputStream.close();
System.out.println("下载完成...");
} else {
System.out.println("服务器异常...");
}
} finally {
if (null != inputStream) {
inputStream.close();
}
if (null != randomAccessFile) {
randomAccessFile.close();
}
}
}
public static void main(String[] args) throws IOException {
String path = "D:\\abc\\image.jpg";
String url="http://www.dowei.com/d/file/tuku/meinv/2016-01-26/1453788622507000.jpg";
dowanload(url, path);
}
}
(2)浏览器下载。
(2.1)使用 Layui ,为上传下载添加进度条。
- 修改内容。
- 使用内容。