1.进行文件上传时,表单需要做的准备
1.请求方式为POST
<form action="uploadServlet" method="post"></form>
2.使用file的表单域
<input type="file" name = "file" />
3.使用新的编码方式(enctype=“multipart/form-data”)
设定了enctype="multipart/form-data"后,表示表单以二进制传输数据
<form action="uploadServlet" method="post" enctype="multipart/form-data"></form>
Demo:
<form action="uploadServlet" method="post" enctype="multipart/form-data">
File : <input type="file" name = "file" />
<input type="submit" value="submit" />
</form>
2.服务端
1.不能再使用request.getParameter()等方式获取信息,获取不到
因为请求的编码方式已经改为multipart/form-data,是以二进制的方式来提交请求信息
2.可以使用输入流的方式来获取
但是不建议这么做,因为比较麻烦
3.使用commons-fileupload组件来完成文件的上传操作
3.使用commons-fileupload组件
1.搭建环境
加入两个jar包
2.基本思想
(1).commons-fileupload可以解析请求,得到一个FileItem对象组成的List
(2).commons-fileupload把所有请求信息都解析为FileItem对象,无论是一个一般的文本域还是一个文件域。
(3).可以调用FileItem的isFormField()方法来判断是不是表单域,如果不是表单域,则是一个文件域
(4).再来进一步获取信息如下:
if(item.isFormField()){//是表单
String name = item.getFieldName();
String value = item.getString();
...
}else{//是文件域
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
InputStream uploadStream = item.getInputStream();
...
uploadedStream.close();
}
3.如何得到List对象
1.简单的方式
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List< FileItem > items = upload.parseRequest(request);
2.复杂点的方式
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存中最多可以存放的上传文件的大小,若超出则把文件写到一个临时文件夹中,以byte为单位
factory.setSizeThreshold(yourMaxMemorySize);
//设置那个临时文件夹
factory.setRepository(yourTempDirectory);
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件的总的大小,也可以设置单个文件的大小
upload.setSizeMax(youMaxRequestSize);
List< FileItem > items = upload.parseRequest(request);
3.文件的下载
1.步骤
1.设置contentType响应头(设置响应的类型是什么)
通知浏览器是一个下载的文件
response.setContentType("application/x-msdownload");
2.设置Content-Disposition响应头
通知浏览器不再由浏览器来自行处理(或打开)要下载的文件,而由用户手工来完成。
response.setHeader("Content-Disposition","attachment;filename=aa.ppt");
3.具体的文件
可以调用response.getOutputStream,以IO流的方式发送给客户端。
2.demo
1.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="downloadServlet">DownLoad</a>
</body>
</html>
2.Servlet文件
@WebServlet(name = "DownloadServlet",urlPatterns = "/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应头
response.setContentType("application/x-msdownload");
String fileName = "文件下载.pptx";
response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
//使用输入输出流
OutputStream outputStream = response.getOutputStream();
String pptName = "C:\\Users\\cerr\\Desktop\\哈哈哈.pptx";
InputStream inputStream = new FileInputStream(pptName);
byte [] bytes = new byte[1024];
int len = 0;
while((len = inputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
}
inputStream.close();
}
}