Servlet/Filter/Listener/ - 单一的实例.html
- 被Tomcat维护浏览器
文件上传与下载服务器
要求:app
1:文件上传必须是表单。由于get方式发送的字节最可能是:4K(1024*4bytes)jsp
2:必须是post,且表单的类型必须是enctype=”multipart/form-data”.post
2.1 : 当设置上面的选项之后,影响的是请求头的中的性能
Content-type : 编码
请求的类型url |
enctype表单上的设置spa |
请示头中的值 |
get |
不管如何设置 |
Content-Type:null |
post |
默认 |
Content-type: application/x-www-form-urlencoed |
post |
Multipart/form-data |
Content-type:multipart/form-data;boundary=--------kdkhfgjdjd 上面的随机值,用于分割上传的多个文件 |
3:若是将enctype=”multipart/form-data”则后台的request.getParameter(“...”);失效再也获取不到参数了
只能经过request.getInputStream来接收上传的二进制数据。
4:若是要文件上传则应该在<form>表单中使用<input type=”file”/>类型的元素。
c如下是get请求:
如下是post请求:
修改请求的编码类型:
<form method="post" action="abc.jsp" enctype="multipart/form-data">
Name:<input type="text" name="name">
<br>
Addr :<input type="text" name="addr">
<br>
<input type="submit">
</form>
<form method="post" action="up01" enctype="multipart/form-data">
请选择文本文件:<input type="file" name="txtFile">
<br>
<input type="submit">
</form>
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
// 1:获取请求的二进制数据
InputStream in = request.getInputStream();
byte[] bs = new byte[1024];
int len = 0;
while ((len = in.read(bs)) != -1) {
String str = new String(bs, 0, len);
System.err.print(str);
}
in.close();
}
如下是拦截到的请求过程:
如下是IE上传时的文件名是整个文件名:
-----------------------------7e02fc1fd0790
Content-Disposition: form-data; name="txtFile"; filename="C:\Users\wangjian\Desktop\20160509_PM3_文件上传下载\新文本.txt"
Content-Type: text/plain
Hello
��Һ�
-----------------------------7e02fc1fd0790--
解析的思想是:
思想:
// 获取这个文件的真实的目录
String path = getServletContext().getRealPath("/files");
PrintWriter ps = new PrintWriter(new File(path, fileName));
ps.println(str);
ps.println(str2);
ps.close();
上传组组件 |
公司 |
性能 |
Apache-fileupload |
Apache/org |
中高 - 普遍 |
Cos - 0.9 |
小公司 |
高 简单 没有依赖 |
Jspsmart-fileupload |
|
200M崩溃 |
要求导入两个包:
核心类:
DiskFIleItemFactory - 用于指定临时目录。
ServletFileUpload - 用于解析Request,从里面获取上传的文件对象。
FileItem - >表示一个文件。
/**
* Servlet implementation class Up02Servlet
*/
public class Up02Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
// 1:声明服务器上的临时文件目录
DiskFileItemFactory disk = new DiskFileItemFactory();
File file = new File("d:/a");
if (file.exists()) {
disk.setRepository(file);// 若是这个目录存在,则使用这个目录,不然就是系统的临时目录
}
// 2:解析requst,接收临时目录
ServletFileUpload upload = new ServletFileUpload(disk);
try {
// 3解析
List<FileItem> list = upload.parseRequest(request);
// 因为只有一个文件,因此获取o
FileItem item = list.get(0);
//解析出文件的名称
String fileName = item.getName();
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
//文件上传
//上传到的真实的目录
String path = getServletContext().getRealPath("/files");
//能够上传的方式:1:文件copy,
//2:直接使用FileItem的方法
item.write(new File(path,fileName));
//删除临时文件
//item.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
}
<form method="post" action="up02" enctype="multipart/form-data">
请选择文件:<input type="file" name="txtFile">
<br>
<input type="submit">
</form>
1:文件的大小
2:文件的名称。
3:文件的类型 mime-type。Plain/text text/html
request.setAttribute("fileName", fileName);
request.setAttribute("type", item.getContentType());//
request.setAttribute("szie", item.getSize());
<body>
文件名:${fileName}
<br>
大小:${szie} bytes
<br>
类型:${type}
</body>
两种方式:
<body>
<a href="files/commons.jar">下载</a>
</body>
public class Down01Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取这个文件的真实的目录
String path = getServletContext().getRealPath("/files/commons.jar");
//2:获取这个文件的io流
InputStream in =
new FileInputStream(path);
//3:通知浏览器这是文件下载
response.setContentType("application/force-download");
//4:建议修改文件名
String name = "这是一个压缩文件.jar";
name = URLEncoder.encode(name, "UTF-8");
response.setHeader("Content-Disposition","attachment;filename="+name);
//5:获取输出流
OutputStream out = response.getOutputStream();
byte[] bs = new byte[1024*4];
int len = 0;
while((len=in.read(bs))!=-1){
out.write(bs, 0, len);
}
out.close();
in.close();
}
}