解決上傳中文亂碼問題-上傳檔案安全問題-上傳檔案被覆蓋的問題-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