Servlet文件的上传与下载

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

1 文件上传:

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

前台页面

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

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

在这里插入图片描述
后台:commons-fileupload 的使用

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

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("文件不存在,下载失败!");
	}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值