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();
}
}