檔案上傳和下載-ServletFileUpload

來源:互聯網
上載者:User

解決上傳中文亂碼問題-上傳檔案安全問題-上傳檔案被覆蓋的問題-UUID演算法

注意:

在HTML頁面
input  必須有 name

<input type="file" name="filename">

表單如果包含一個檔案上傳輸入項的話,這個表單的enctype屬性就必須設

置為multipart/form-data

<form action ="/day16/servlet/UpLoadServlet"

enctype="multipart/form-data" method="post">

瀏覽器表單的類型如果為multipart/form-data,那麼瀏覽器在提交表單資料

時,它將採用MIME協議對資料進行封裝後提交,在伺服器這端也將不能採用

原來傳統的方工擷取資料了。

在伺服器端想擷取資料就要通過流。
request提供了一個getInputStream讀取流。


為了方便使用者處理檔案上傳資料,Apache開源組織提供了一個用來處理表單

檔案上傳的一個開源組件(Commons-fileupload).

使用Commons-fileupload組件實現檔案上傳,需要匯入該組件相應的jar包.
Commons-fileupload和commons-io兩個jar包.

DiskFileItemFactory是建立FileItem對象的工廠包括方法:

1.public void setSizeThreshold(int?sizeThreshold)
設定記憶體緩衝區的大小,預設值為10K,如果檔案大於10K,將使用臨時檔案緩

存上傳檔案.

2.public void setRepository(java.io.File repository)
指定臨時檔案目錄

3.public DiskFileItemFactory();

 

ServletFileUpload負責處理上傳的檔案資料,並將表單中每個輸入項封裝成

一個FileItem對象中.

常用方法:

1.boolean isMultipartContent(HttpservletRequest request)
判斷上傳表單是否為上傳表單類型

2.List parseRequest(HttpServletRequest request)
對requests對象進行解析,並把表單中的每一個輸入項封裝成一個fileItem

對象,並返回一個儲存了所有FileItem的list集合.

3.setFileSizeMax(long fileSizeMax)設定上傳檔案最大值

4.setSizeMax(long sizeMax)設定上傳檔案總量的最大值

5.setHeaderEncoding()設定編碼格式


執行個體:


public class UploadServlet extends HttpServlet{


DiskFileItemFactory factory=new DiskFileItemFactory();

ServletFileUpload upload=new ServletFileUpload(factory);

判斷提交表單的類型是否為multipart/form-data

if(!upload.isMultipartContent(request))
{
return;
}

try
{
List list=upload.parseRequest(request);
Iterator it=list.iterator();

while(it.hasNext())
{
FileItem item=(FileItem)it.next();//每一個item就代表一個表單輸出項

if(item.isFormField())//判斷input是否為普通表單輸入項

String name=item.getFieldName();input的名稱

String value= item.getString();input的值
}else{

得到上傳檔案的名稱,並截取
String filename=item.getName();

得到上傳檔案要寫入的目錄
String path=this.getServletContext().getRealPath("/upload");
根據目錄和檔案建立輸出資料流

FileOutputStream out=new FileOutputStream(path+filename);

InputStream in = item.getInputStream();
 byte buffer[] = new byte[1024];
 int len = 0;
while((len=in.read(buffer))>0){
 out.write(buffer,0,len);
   }
in.close();
out.close();
 }
}
} catch (FileUploadException e)
{
e.printStackTrace();
  }
 }

}

同學問題:

什麼時候用/  什麼時候用/

老師解答;

/:表示url地址,例如http://loacalhost:8080/

request.getRequestDispacher("/");

/:表示路徑,例如:c:/windows/

new FileOutputStream("c://1.txt");

要JAVA語言裡面,"/"代錶轉義.


解決上傳中文亂碼問題
可以通過
upload.setHeaderEncoding("utf-8");

上傳檔案時不安全應用舉例
Runtime.getRuntime.exec("")
可以執行DOS命令.

1.上傳檔案怎麼保證伺服器的安全?

解決方案:上傳目錄要禁止外界直接存取,一般的做法是把上傳目錄放到服務

器的WEB-INF目錄下.這個目錄伺服器是保護的,外界無法訪問.


2.上傳檔案被覆蓋的問題

伺服器要為每一個上傳檔案產生一個唯一的檔案名稱.

可以使用UUID演算法.

3.上傳的檔案需要打散

 

經典面試題

演算法  一個數異或兩次,得到是資料本身.
x=1;
y=2;

x=x^y;
y=x^y;
x=x^y;

異或經常用來加密

 

 

臨時檔案的刪除

FileItemDelete

刪除臨時檔案一定要在流關閉之後,否則會出現檔案佔用,而導致刪除失敗.

 


多檔案上傳問題:
主要是javascript編碼,在頁面動態添加檔案上傳項.

監聽上傳進度:

自己寫一個監聽器progressListener

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.