java之文件上傳和下載的實現

******文件上傳與下載:數據比較大時必須用文件上傳,文件上傳的本質是IO流的從操作;
客戶端:1.必須使用post,post才能攜帶大數據
2.必須設置type=“file” name="f"必須要有名字
3.必須要設置enctype="multipart/form-data"

服務器端:通過request.getInputStream()獲取字節輸入流,讀取請求正文內容;
將上傳內容得到,保存在服務器端,就完成了文件上傳;

實際使用直接用框架中的api就可以,commons-fileupload是apache提供的一套文件上傳工具;

*********文件上傳:

導入commons-io包和commons-fileupload包;放到WEB_INF下的lib文件夾中;

**commons-fileload的三大核心:
1.DiskFileItemFactory:作用是設置緩存大小和臨時文件保存位置,默認緩衝區大小是10K,臨時文件默認存在系統的臨時文件目錄,可以更改;
如果上傳的文件大於內存大小,就會存在臨時文件中,如果上傳的文件大小於系統的內存,就直接從內存中讀取;

 

 

 

6.item.delete();刪除緩存;

***********文件下載:

文件下載有兩種方法:
1.超鏈接下載:如果文件能被瀏覽器解析,點擊就會打開文件,如果要下載,需要使用右鍵另存爲,不能被瀏覽器解析的文件,點擊就下載;
2.通過服務器流回寫到瀏覽器下載;要設置MIME,即設置setcontentType(String mimeType);瀏覽器能解析的直接顯示,不能解析的直接下載;
獲取文件的mimeType類型:String mimeType=this.getServletContext().getMimeType(filename);
如果設置響應頭respponse.setHeader("content-disposition","attachment;filename=下載的文件名稱");不管瀏覽器能不能解析,
都是下載操作;

*******下載中亂碼問題解決:

 


判斷瀏覽器:String agent=reques.getHeader("user-agent");

***使用隊列來優化遞歸操作完成下載;

//獲取文件的絕對路徑
String path=getServletContext().getRealpath("/img/m.jpg");
//獲取最後一個\
int index=path.lastIndexof("\\");
String filename=null;
if(inde!=-1){
ilename=path.sustring(index+1);
}
//判斷瀏覽器
String agent=request.getHeadder("User-Agent");
if(agent.contains("MSIE")){//ie瀏覽器採用的是URL編碼,火狐是base64編碼
filename=URLEncoder.encode(filename,"UTF-8");//url編碼改成utf8
}

//設置頭信息
response.setHeader("Content-Disposition","attachment;filename="+filename);
InputSteam in= new FileInputStream(path);
//通過response輸出到客戶端
OutputStream os=response.getOutputStream();
//io流的拷貝
byte[] b=new byte[1024];
int ln=0;
while(len=in.read(b)!=-1){

os.write(b,o,len);
}
in.close();

 

******目錄分離

*******servlet3.0和註解實現文件上傳

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章