文件的上傳與下載

文件上傳原理:html

瀏覽器端:
1.表單的method必須是post.
2.要上傳信息須要使用<input type="file" name="f">這個組件,必須有名稱.
3.必須指定表單的encType的值爲  multipart/form-data


服務器端:
能夠經過request.getInputStream()獲取輸入流讀取信息
web

具體流程:api

1.導入jar包

2.使用commons-fileupload完成文件上傳操做
1.DiskFileItemFactory  ----它是用於設置文件上傳相關屬性

DiskFileItemFactory factory=new DiskFileItemFactory();

2.ServletFileUpload  -----真正完成文件上傳操做

ServletFileUpload upload=new ServletFileUpload(factory);

3.FileItem ----它是用於處理上傳項的。

List<FileItem> fileItems=upload.parseRequest(request);


api詳解
1.DiskFileItemFactory
構造方法
DiskFileItemFactory() 默認緩衝區大小10k
DiskFileItemFactory(int sizeThreshold, File repository) 參數sizeThreshold表明緩衝區大小    repository臨時文件存儲位置
若是在建立時,使用的是無參數構造,那麼也能夠經過其提供的setXxx方法來設置緩衝區大小與臨時文件存儲位置
setSizeThreshold(int sizeThreashold) 用於設置緩衝區大小
setRepository(File f) 用於設置臨時文件存儲位置
2.FileServletUpload

1.isMultipartContent
這個方法返回的是boolean類型值,它用於判斷當前是不是上傳操做.
若是是上傳操做,咱們在獲取全部上傳信息時,使用的是commons-fileuplad的api,而不能在使用web經常使用對象 request

2.parseRequest 獲得一個List<FileItem> 能夠理解成獲得全部的上傳項.


3.設置上傳文件大小
void setFileSizeMax(long fileSizeMax) 設置單個文件上傳大小 
void  setSizeMax(long sizeMax) 設置總文件上傳大小 

4.解決上傳文件的名稱亂碼
setHeaderEncoding(String c) 它用於解決上傳文件的名稱亂碼問題


3.FileItem
isFormField()  返回true,false,表明的是普通組件,上傳組件.
getName()  普通組件獲取的爲null,上傳組件獲取的上傳文件的路徑.
getFieldName() 獲取組件的名稱
getString() 普通組件獲取的是value,上傳組件獲取的是文件的內容
getInputStream(); 它用於對上傳組件進行操做,能夠獲得一個指向上傳文件的輸入流。

對於getString()它有一重載的方法  getString(String c),它用於解決亂碼問題.

delete()方法,用於刪除臨時文件。


------------------------------------------------------
對於上傳操做它的亂碼問題:
不能使用request.setCharacterEncoding("utf-8");解決.
使用commons-fileupload這個插件:
若是是普通組件:item.getString(String encoding);
若是是上傳組件:主要是上傳文件的名稱亂碼: ServletFileUpload.setHeaderEncoding(String encoding);來解決
瀏覽器

文件下載服務器

這種下載,只須要讓超鏈接標籤它的href指向要下載的文件就能夠。
缺點:
1.若是要下載的文件是能夠直接被瀏覽器解析的,在點擊時會在瀏覽器中打開。咱們必須右鍵另存爲。
2.要求被下載的文件必須是能夠直接被瀏覽器訪問的。
jsp

服務器端經過流下載:post

如今要下載的文件是 d:/upload目錄下的內容

若是隻是將要下載的文件內容經過response獲取輸出流寫回到瀏覽器端,那麼對於瀏覽器
來講,它須要作的事情就是將信息在瀏覽器中顯示出來。

MIMEType:它表明的是服務器通知瀏覽器響應的數據的類型。

//response.setContextType("text/html;charset=utf-8");


這種方式文件下載操做必須設置兩個信息:
1.respose.setContentType();  必須設置響應的數據的mimetype類型.

設置它之後,若是當前的mimeType類型瀏覽器能夠直接解析,就將其顯示在瀏覽器中了,
若是不能解析,會讓你下載 ,可是下載文件的名稱不對。

2.response.setHeader("Content-Disposition","attachment;filename=??");
這項設置後,點擊時就是下載操做了,而filename的值就是下載文件的名稱.
google


下載亂碼問題:編碼

在download2.jsp頁面上修改
<a href="${pageContext.request.contextPath}/download1?filename=第一.txt">下載第一.txt</a><br>
<a href="${pageContext.request.contextPath}/download1?filename=汽車.jpg">下載汽車.jpg</a><br>
<a href="${pageContext.request.contextPath}/download1?filename=HTML筆記.doc">下載HTML筆記.doc</a><br>

問題1:這時超鏈接它是get請求,到服務器端獲得的數據亂碼,查找不到。
解決:get請求的亂碼問題
filename = new String(filename.getBytes("iso8859-1"), "utf-8"); //解決get請求的亂碼問題


---------------------------------------------------------------------------------------------
問題2:下載文件的名稱亂碼

在文件下載時,文件的名稱,它對於不一樣的瀏覽器使用的是不一樣的編碼。
ie使用的是utf-8碼
firefox使用base64編碼.

response.setHeader("content-disposition","attachement;filename=??");
若是filename的值中包含了中文,那麼對於不現的瀏覽器在解析時使用的編碼不同。
if (agent.contains("MSIE")) {
// IE瀏覽器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐瀏覽器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8"))
+ "?=";
} else if (agent.contains("Chrome")) {
// google瀏覽器
filename = URLEncoder.encode(filename, "utf-8");
} else {
// 其它瀏覽器
filename = URLEncoder.encode(filename, "utf-8");
}
spa

相關文章
相關標籤/搜索