Java web项目中的文件上传与下载

文件上传:即将本地文件通过流的方式上传到服务器,常用的文件上传方法有很多,但本次使用的文件上传技术是FileUpLoad。

文件上传三要素:

1、表单提交方式为post. 。

2、需要有<input type="file" >属性,name元素和值。

3、表单enctype="multipart/form-data"。

文件下载:将服务器的文件通过流写到客户端。文件下载的方式主要为超链接下载和手动编写代码方式下载。

文件上传实现步骤: 1、判断表单:是否包含文件上传控件。 2、创建上传文件和临时文件的保存路径。 3、创建 DiskFileItemFactory 对象。 设置临时文件夹; *设置缓冲区大小。 4、创建 ServletFileUpload 对象。 设置 FileItemFactory; *监听文件上传进度、处理乱码问题、设置单个文件和总共上传文件的最大值。 5、解析请求并处理文件传输。 解析前端请求,将每个表单项解析并封装成 FileItem 对象; 判断表单项是否为上传文件; 处理普通文本: 获取字段名; 获取数据流内容。 处理文件: 获取上传文件名; 生成随机 UUID 作为文件存储路径,并为其生成文件夹; 通过 IO 流传输文件。

文件下载的方式

1、超链接下载

2、后台实现下载

超链接下载

在 HTML 或 JSP 页面中使用标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识别的动态网页时则会自动下载。如果浏览器遇到能够直接显示的资源,浏览器就会默认显示出来,比如 txt,png,jpg 等。当然也可以通过 download 属性规定浏览器进行下载。但某些浏览器并不支持。

默认下载

<a href="upload/abc.zip">超链接下载</a>

指定 download 属性下载

<a href="upload/abc.txt" download="abcdef.txt">超链接下载</a>

这里,download 也可以不写任何信息,会自动使用默认文件名。这样当用户打开浏览器点击链接的时候就会直接下载文件。

后台实现下载

Step1:需要通过 HttpServletResponse.setContentType 方法设置 头字段的值,这样浏览器才能够使用某种方式或激活某个程序来处理相应 类型的数据,例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等

Step2:需要通过 HttpServletResponse.setHeader 方法设置 Content-Disposition 头的值为”attachment;filename=文件名”,filename提供了文件下载时的一个默认文件名

Step3:读取下载文件,调用 HttpServletResponse.getOutputStream 方法返回的OutputStream对象来向客户端写入附件内容。

public class DownLoadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 设置请求编码
		request.setCharacterEncoding("UTF-8");
		// 接受参数,得到需要被下载的文件的名称
		String fileName = request.getParameter("fileName");
		// 判断名字名是否为空
		if(fileName == null || "".equals(fileName)){
			// 提示
			System.out.println("文件名不能为空");
			return;
		}
		// 获取文件存放的真实路径
		String path = request.getServletContext().getRealPath("/" + fileName);
		// 通过文件路径和文件名得到file对象
		File file = new File(path);
		// 判断是否存在,并且是一个标准文件
		if (file.exists() && file.isFile()){
			// 设置相应类型 application/octet-stream
			response.setContentType("application/x-msdownload");
			// 设置头信息
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
			// 通过file对象得到输入流
			FileInputStream in = new FileInputStream(file);
			// 得到输出流
			ServletOutputStream out = response.getOutputStream();
			byte[] car = new byte[1024];
			int len = 0;
			while((len = in.read(car)) != -1){
				out.write(car,0,len);
			}
			// 关闭流
			in.close();
			out.close();
		} else {
			System.out.println("文件路径不正确!");
		}
	}
}
经验分享 程序员 微信小程序 职场和发展