国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

JavaWeb實現文件上傳與下載的方法

2019-11-26 14:40:41
字體:
來源:轉載
供稿:網友

文件上傳概述

實現web開發中的文件上傳功能,需完成如下二步操作

在web頁面中添加上傳輸入項

在servlet中讀取上傳文件的數據,并保存到本地硬盤中。

如何在web頁面中添加上傳輸入項?

<input type=“file”>標簽用于在web頁面中添加文件上傳輸入項,設置文件上傳輸入項時須注意:

1、必須要設置input輸入項的name屬性,否則瀏覽器將不會發送上傳文件的數據。

2、必須把form的enctype屬值設為multipart/form-data.設置該值后,瀏覽器在上傳文件時,將把文件數據附帶在http請求消息體中,并使用MIME協議對上傳的文件進行描述,以方便接收方對上傳數據進行解析和處理。

文件上傳概述

如何在Servlet中讀取文件上傳數據,并保存到本地硬盤中?

Request對象提供了一個getInputStream方法,通過這個方法可以讀取到客戶端提交過來的數據。但由于用戶可能會同時上傳多個文件,在servlet端編程直接讀取上傳數據,并分別解析出相應的文件數據是一項非常麻煩的工作,示例。

為方便用戶處理文件上傳數據,Apache開源組織提供了一個用來處理表單文件上傳的一個開源組件( Commons-fileupload),該組件性能優異,并且其API使用極其簡單,可以讓開發人員輕松實現web文件上傳功能,因此在web開發中實現文件上傳功能,通常使用Commons-fileupload組件實現。

使用Commons-fileupload組件實現文件上傳,需要導入該組件相應的支撐jar包:Commons-fileupload和commons-io。commons-io不屬于文件上傳組件的開發jar文件,但Commons-fileupload組件從1.1版本開始,它工作時需要commons-io包的支持。

fileupload組件工作流程

核心API―DiskFileItemFactory

DiskFileItemFactory 是創建 FileItem 對象的工廠,這個工廠類常用方法:

public void setSizeThreshold(int sizeThreshold):設置內存緩沖區的大小,默認值為10K。當上傳文件大于緩沖區大小時, fileupload組件將使用臨時文件緩存上傳文件。

public void setRepository(java.io.File repository):指定臨時文件目錄,默認值為System.getProperty("java.io.tmpdir").

public DiskFileItemFactory(int sizeThreshold, java.io.File repository):構造函數

核心API―ServletFileUpload

ServletFileUpload 負責處理上傳的文件數據,并將表單中每個輸入項封裝成一個 FileItem 對象中。常用方法有:

boolean isMultipartContent(HttpServletRequest request):判斷上傳表單是否為multipart/form-data類型

List parseRequest(HttpServletRequest request):解析request對象,并把表單中的每一個輸入項包裝成一個fileItem對象,并返回一個保存了所有FileItem的list集合。

setFileSizeMax(long fileSizeMax):設置上傳文件的最大值
setSizeMax(long sizeMax):設置上傳文件總量的最大值
setHeaderEncoding(java.lang.String encoding):設置編碼格式
setProgressListener(ProgressListener pListener)

文件上傳案例

實現步驟

1、創建DiskFileItemFactory對象,設置緩沖區大小和臨時文件目錄
2、使用DiskFileItemFactory對象創建ServletFileUpload對象,并設置上傳文件的大小限制。
3、調用ServletFileUpload.parseRequest方法解析request對象,得到一個保存了所有上傳內容的List對象。
4、對list進行迭代,每迭代一個FileItem對象,調用其isFormField方法判斷是否是上傳文件

為普通表單字段,則調用getFieldName、getString方法得到字段名和字段值

為上傳文件,則調用getInputStream方法得到數據輸入流,從而讀取上傳數據。

編碼實現文件上傳

上傳文件的處理細節

中文文件亂碼問題

文件名中文亂碼問題,可調用ServletUpLoader的setHeaderEncoding方法,或者設置request的setCharacterEncoding屬性

臨時文件的刪除問題

由于文件大小超出DiskFileItemFactory.setSizeThreshold方法設置的內存緩沖區的大小時,Commons-fileupload組件將使用臨時文件保存上傳數據,因此在程序結束時,務必調用FileItem.delete方法刪除臨時文件。

Delete方法的調用必須位于流關閉之后,否則會出現文件占用,而導致刪除失敗的情況。

文件存放位置

為保證服務器安全,上傳文件應保存在應用程序的WEB-INF目錄下,或者不受WEB服務器管理的目錄。

為防止多用戶上傳相同文件名的文件,而導致文件覆蓋的情況發生,文件上傳程序應保證上傳文件具有唯一文件名。

為防止單個目錄下文件過多,影響文件讀寫速度,處理上傳文件的程序應根據可能的文件上傳總量,選擇合適的目錄結構生成算法,將上傳文件分散存儲。

文件下載

因為要下載的文件可以是各種類型的文件,所以要將文件傳送給客戶端,其相應內容應該被當做二進制來處理,所以應該調用 方法返回 ServeltOutputStream對象來向客戶端寫入文件內容。

下載案例

遍歷上傳目錄下的所有文件顯示給用戶,并允許用戶完成下載。

(讀取某一個文件夾下的所有的文件,存到集合里面List,再存到request作用域范圍中)ListFileServelt―(將所有的文件列表顯示)Listfiles.jsp-----DownloaServlet.javaprivate String id;private String savename; //上傳文件的名稱,文件的uuid名private String realName; //上傳文件的真實名稱private String savepath; //記住文件的位置private Date uptime; //文件的上傳時間private String description; //文件的描述private String username; //上傳人ListFileServletpackage com.hbsi.servlet;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.HashMap;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class ListFileServlet extendsHttpServlet {publicvoid doGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {Stringsavepath = this.getServletContext().getRealPath("/WEB-INF/upload");Mapmap = new HashMap();listFiles(newFile(savepath), map);request.setAttribute("map",map);request.getRequestDispatcher("/listfile.jsp").forward(request,response);}privatevoid listFiles(File file, Map map) {if(file.isFile()) {Stringuuidname = file.getName(); // uuid_a_1_3_3.txtStringrealname = uuidname.substring(uuidname.indexOf("_") + 1);map.put(uuidname,realname);}else {File[]files = file.listFiles();for(File f : files) {listFiles(f,map);}}}publicvoid doPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {doGet(request,response);}}DownloadServletpackage com.hbsi.servlet;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;import java.io.PrintWriter;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;public class DownloadServlet extendsHttpServlet {publicvoid doGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {Stringfilename = request.getParameter("filename");filename= new String(filename.getBytes("iso8859-1"), "utf-8");System.out.println(filename);Stringsavepath = this.getFileSavePath(this.getRealName(filename));Filef = new File(savepath + "http://" + filename);if(!f.exists()) {request.setAttribute("message","下載的資源不存在");request.getRequestDispatcher("/message.jsp").forward(request,response);}response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(this.getRealName(filename),"UTF-8"));FileInputStreamin = new FileInputStream(f);byte[]buf = new byte[1024];intlen = 0;OutputStreamout = response.getOutputStream();while((len = in.read(buf)) > 0) {out.write(buf,0, len);}in.close();}publicString getFileSavePath(String filename) {intdir1 = filename.hashCode() & 0xf;intdir2 = (filename.hashCode() >> 4) & 0xf;Stringsavepath = this.getServletContext().getRealPath("/WEB-INF/upload")+"http://" + dir1 + "http://" + dir2;returnsavepath;}publicString getRealName(String filename) {StringrealName = filename.substring(filename.indexOf("_") + 1);returnrealName;}publicvoid doPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {doGet(request,response);}}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庆安县| 康定县| 新巴尔虎左旗| 滨海县| 黄冈市| 青铜峡市| 湖北省| 安阳县| 五河县| 楚雄市| 新营市| 六安市| 安西县| 遵化市| 连云港市| 综艺| 府谷县| 攀枝花市| 浏阳市| 拜泉县| 新竹市| 临漳县| 镇雄县| 奉化市| 巴青县| 崇文区| 吴江市| 光山县| 万州区| 贡觉县| 衡阳市| 秭归县| 赤壁市| 绥化市| 太谷县| 张掖市| 山阴县| 洪江市| 新沂市| 抚远县| 东丰县|