欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet文件的上传与下载

程序员文章站 2022-06-02 14:05:39
...

文件的上传与下载:
在上网的时候我们常常遇到文件上传的情况,例如上传头像、上传资料等; 当然除了上传,遇见下载的情况就更多了,接下来看看我们 servlet 中怎么实现 文件的上传和下载。下面我们使用 commons-fileupload 来做文件上传.

1 文件上传:

文件上传涉及到前台页面的编写以及后台服务端代码的编写,前台发送文件,后台接受并保存文件,这才是一哥哥完整的文件上传。

前台页面

在做文件上传的时候,会有一个上传文件的界面,首先我们需要的有:

1: form表单
2: 请求方式为: post
3: enctype="multipart/form-data(设置表单的MIME编码,只有使用了multipart/form-data 才能玩阿正的传递文件数据,默认的编码格式:”application/x-www-form-urlencoded)

Servlet文件的上传与下载
后台:commons-fileupload 的使用

首先需要导入第三方 jar 包,http://commons.apache.org/ 下 载 commons-io 和 commons-fileupload 两个 jar 的资源。解压并导入到项目中。 commons-fileupload.jar 是文件上传的核心包 commons-io.jar 是 filefupload 的 依赖包,同时又是一个工具包。
Servlet文件的上传与下载
这里会使用到介个核心类:简单的介绍一下:

DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个工具类

ServletFileUpload – 文件上传的核心类,此类接收 request,并解析

ServletFileUpload.parseRequest(request); – List 解析 request

步骤:

1、 创建一个 DiskFileItemFactory 工厂类,并制定临时文件和大小
2、 创建 ServletFileUpload 核心类,接收临时文件,做请求的转换
3、 通过 ServletFileUpload 类转换原始请求,得到 FileItem 集合
4、 遍历集合中的各个元素并处理
5、 判断每个元素是否是普通表单项,如果是则按照普通表单项处理
6、 如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)

public class UploadServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// 设定编码,可以获取中文文件名
	request.setCharacterEncoding("UTF-8");
	// 获取tomcat下的upload目录的路径
	String path = getServletContext().getRealPath("/upload");
	// 临时文件目录
	String tempPath = getServletContext().getRealPath("/temp");
	// 检查我们是否有文件上传请求
	// boolean isMultipart = ServletFileUpload.isMultipartContent(request);
	// 1、声明DiskFileItemFactory工厂类,用于在指定磁盘上设置一个临时目录
	DiskFileItemFactory disk = new DiskFileItemFactory(1024 * 10, new File(tempPath));
	// 2、声明ServletFileUpload,接收上面的临时文件。也可以默认值
	ServletFileUpload up = new ServletFileUpload(disk);
	// 3、解析request
	try {
		List<FileItem> list = up.parseRequest(request);
		if (list.size() > 0) {
			for (FileItem file : list)
				// 判断是否是普通的表单项
				if (file.isFormField()) {
					String fieldName = file.getFieldName();
					// 中文乱码,此时还需要指定获取数据的编码方式
					// String value = file.getString();
					String value = file.getString("UTF-8");
					System.out.println(fieldName + "=" + value);
				} else { // 说明是一个文件
					// 获取文件本身的名称
					String fileName = file.getName();
					System.out.println(file.getFieldName());
					// 处理文件名称
					fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
					System.out.println("old Name : " + fileName);
					// 修改名称
					String extName = fileName.substring(fileName.lastIndexOf("."));
					String newName = UUID.randomUUID().toString().replace("-", "") + extName;
					// 保存新的名称,并写出到新文件中
					file.write(new File(path + "/" + newName));
					System.out.println("文件名是:" + fileName);
					System.out.println("文件大小是:" + file.getSize());
					file.delete();
				}
		}
	} catch (FileUploadException e) {
		e.printStackTrace();
	} catch (Exception e) {
		e.printStackTrace();
	}
}

}

文件的下载:

超链接下载:
用href 标签指向的资源:
浏览器额能识别的就显示,不能识别的动态网页就下载

如果可以识别的资源,也想实现下载,就必须需要设定download
如果download属性不设置对应的值,则默认下载的名称为文件名;可通过设置download属性的值修改下载的名称

后台实现下载:

Step1:需要通过 HttpServletResponse.setContentType 方法设置 Content-type 头字段的值, 为浏览器无法使用某种方式或**某个程序来处理的 MIME 类型, 例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等

Step2:需要通过 HttpServletResponse.setHeader 方法设置 Content-Disposition 头的值 为”attachment;filename=文件名”

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

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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 path = getServletContext().getRealPath("/") + "WEB-INF/";
	// 接收前台传递的参数
	String fileName = request.getParameter("filename");
	// 通过路径得到file对象
	File file = new File(path + fileName);
	if (file.exists()) {
		// 设置相应类型 application/octet-stream
		response.setContentType("application/x-msdownload");
		// 设置头信息
		response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
		InputStream is = new FileInputStream(file);
		ServletOutputStream os = response.getOutputStream();
		byte[] car = new byte[1024];
		int len = 0;
		while ((len = is.read(car)) != -1) {
			os.write(car, 0, len);
		}
		// 关闭流、释放资源
		os.close();
		is.close();
	} else {
		System.out.println("文件不存在,下载失败!");
	}
}

}