SpringMVC 的文件上传以及文件下载

18 篇文章 0 订阅
12 篇文章 0 订阅

一、文件上传

SpringMVC 使用MultipartResolver 接口处理文件上传。MultipartResolver 是一个接口,它的实现类是 CommonsMultipartResolver 类StandardServletMultipartResolver 类。

  1. 客户端发送请求,前端控制器( DispatcherServlet )拦截请求,其中的 checkMultipart() 方法会调用 MultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,则调用 MultipartResolver 的 resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在 MultipartHttpServletRequest ( 继承了 HttpServletRequest ) 对象中,最后传递给 Controller。
  2. 综上所述,前端控制器拦截请求后,会判断请求是否包含文件,文件请求交由 MultipartHttpServletRequest 处理。

(一)上述两种实现类(CommonsMultipartResolver 与StandardServletMultipartResolver )的区别:
CommonsMultipartResolver 使用 commons Fileupload 来处理 multipart 请求,所以在使用时,必须要引入相应的 jar 包(commons-fileupload)。
StandardServletMultipartResolver 是基于 Servlet 3.0 来处理 multipart 请求的,所以不需要引用其他 jar 包。
在这里插入图片描述
(二)Jar 包冲突。
我在执行上传文件的过程中,可能是先导入的 commons-lang3 工具类。
在这里插入图片描述
原因如下 :
在这里插入图片描述

(一)CommonsMultipartResolver 方式。

  1. 在 Spring MVC 的配置文件中,加入如下的配置。
    在这里插入图片描述
  • 没有上述配置文件,将会报异常。出现此异常可能是有两个原因,一是没有配置文件,二是提交的表单需要添加 enctype="multipart/form-data" 内容。
    在这里插入图片描述
  1. 就是上述提到的表单提交 要带着 enctype=“multipart/form-data” 。
    表单提交:单文件上传以及多文件上传的表单形式。
    在这里插入图片描述
    Ajax 提交方式,完成文件上传。
    文件上传(JQuery AJAX 的使用)。
  2. 服务器处理文件。
    在这里插入图片描述

(二)StandardServletMultipartResolver

  1. 配置文件,需要配置在 springmvc.xml 文件中。
    在这里插入图片描述
  2. 配置所需要的参数,参数位置在 web.xml 中。
    在这里插入图片描述
  3. 在服务器中进行上传文件的操作。同上。

二、文件下载

(1)文件下载伴随着进度条的实现

  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 ,为上传下载添加进度条。

  1. 修改内容。
    在这里插入图片描述
  2. 使用内容。
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值