文件上傳初步

Servlet/Filter/Listener/ - 單一的實例.html

- 被Tomcat維護瀏覽器

 

文件上傳與下載服務器

 

1:文件上傳

  要求: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/>類型的元素。

 

 

 

 

2:關於content-type

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>

 

 

 

 

 

 

3:上傳一個文本文件

步1:開發一個表單

<form method="post"  action="up01" enctype="multipart/form-data">

請選擇文本文件:<input type="file" name="txtFile">

<br>

<input type="submit">

</form>

 

步2:開發一個Servlet用req.getInputStream來接收傳的正文

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--

 

 

步3:解析出文件名

解析的思想是:

   

 

步4:解析出文件名來之後,再去解析正文

思想:

  

 

步5:保存到服務器上去

// 獲取這個文件的真實的目錄

String path = getServletContext().getRealPath("/files");

PrintWriter ps = new PrintWriter(new File(path, fileName));

ps.println(str);

ps.println(str2);

ps.close();

 

 

 

 

4:使用第三方組件實現上傳

 

上傳組組件

公司

性能

Apache-fileupload

Apache/org

中高 - 普遍

Cos    -  0.9

小公司

高 簡單 沒有依賴

Jspsmart-fileupload

 

200M崩潰

 

 

 

 

要求導入兩個包:

 

 

 

步1:開發頁面

 

步2:開發後臺

 

核心類:

  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>

 

 

 

3:將上傳的文件的信息,在一個頁面顯示

  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>

 

 

 

 

4:下載文件

兩種方式:

1:超鏈接 。

  <body>

<a href="files/commons.jar">下載</a>

</body>

 

 

2:代碼下載

 

 

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

}

 

}

相關文章
相關標籤/搜索