文件的上传与下载:
在上网的时候我们常常遇到文件上传的情况,例如上传头像、上传资料等; 当然除了上传,遇见下载的情况就更多了,接下来看看我们 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("文件不存在,下载失败!");
}
}
}