文件上傳下載
阿新 • • 發佈:2017-11-23
大小 取數據 api 指定 獲取 方式 數據大小 字符集 exe
1.導入jar包,commons-fileupload-1.2.2.jar,commons-io-xxx.jar, form表單 添加 encType="multipart/form-data"
2.判斷form表單是否 encType="multipart/form-data"
ServletFileUpload.isMultipartContent(request)
3.創建臨時文件夾和要保存的文件夾,比如工程根目錄下 temp和 upload
4.創建硬盤文件工廠類 DiskFileItemFactory factory = new DiskFileItemFactory();
5.指定上傳文件的臨時目錄 factory.setRepository(new java.io.File(tem));
6.指定在內存中緩存數據大小,以byte為單位 factory.setSizeThreshold(1024*1024*1);
7.創建文件上傳類 ServletFileUpload upload = new ServletFileUpload(factory);
8.設置單個上傳文件的最大長度 upload.setFileSizeMax(1024*1024*150);
9.設置上傳多個文件的總長度 upload.setSizeMax(1024*1024*200);
10.獲取到form表單中的元素 List<FileItem> list = upload.parseRequest(request);
11.判斷FileItem的類型,file.isFormField() true:表示普通類型,false 為上傳文件類型
file.getName() 獲取文件名,
file.getSize() 獲取文件大小
12.寫入目標文件, file.write(target);
文件下載
1.初始化環境
SmartUpload su = new SmartUpload();
2.執行上傳下載的初始化工作,必須第一個執行
su.initialize(getServletConfig(),request, respone);
3.設置下載文件
su.downloadFile("F:\\workcell\\AsaFood\\AsAFood_src\\AsAFood(包結構文檔).xls");
文件上傳具體實現
1,JSP頁面
上傳文件方式一:利用SmartUpload進行上傳文件
1.導入 jspsmartupload.jar(GBK版) 或 smartupload-utf8.jar (UTF-8)包,form表單 添加 encType="multipart/form-data" 因此表單是以二進制數據發送。 2.創建 SmartUpload 實例 SmartUpload su = new SmartUpload(); 3. 初始化上傳下載環境 su.initialize(getServletConfig(),request, respone); 4.過濾限制,設置允許上傳的後綴名,和不允許的後綴名 su.setAllowedFilesList("jpg,dmp,gif,jpeg"); su.setDeniedFilesList("exe,bat,jsp,htm,html,doc,txt,,"); 5.準備上傳 su.upload(); 6.獲取上傳的文件個數 int count = su.getFiles().getCount(); 7.獲取上傳的文件 com.jspsmart.upload.Files files = su.getFiles(); 對files進行遍歷獲取單個File對象 File file = files.getFile(i); String fieldName = file.getFieldName(); String fileName = file.getFileName(); 8.復制文件 file.saveAs(destFilePathName,option); 例如:file.saveAs("/upload/"+fileName,su.SAVE_VIRTUAL); /** * destPathName為文件保存目錄,option為保存選項,它有三個值, * 分別是SAVE_PHYSICAL,SAVE_VIRTUAL和 SAVE_AUTO。 * SAVE_PHYSICAL指示組件將文件保存到以操作系統根目錄為文件根目錄的 目錄下, * SAVE_VIRTUAL指示組件將文件保存到以Web工程根目錄為文件根目錄的目錄下, * 而SAVE_AUTO則表示由組件自動選擇。 */ 9.獲取表單的其他內容(註意之前的request獲取表單無效)com.jspsmart.upload.Request req = su.getRequest(); 從以上看出,SmartUpload的代碼量不會特別多,比較方便。 上傳方式二:利用apache 的 commons-fileupload進行上傳文件。<center> <h1>文件上傳</h1> <form name="uploadform"method="post" action="adddata" ENCTYPE="multipart/form-data"> <table border="1"width="450"cellpadding="4" cellspacing="2"bordercolor="#9BD7FF"> <tr><td width="100%"colspan="2"> 文件:<input name="file1"size="40"type="file"> </td></tr> </table> <table> <tr><td align="center"><input name="upload" type="submit"value="上傳"/></td></tr> </table> </form> </center>
要實現文件上傳,在form標簽內必須包含 ENCTYPE="multipart/form-data" 才可以實現(RFC1867協議:http://www.faqs.org/rfcs/rfc1867.html),且必須以 POST 方式上傳。
2,web.xml 配置<servlet> <servlet-name>AddDataServlet</servlet-name> <servlet-class>kxjh.AddDataServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AddDataServlet</servlet-name> <url-pattern>/adddata</url-pattern> </servlet-mapping>
3,Servelt 實現(commons-fileupload-1.2.1、commons-io-1.4)
// 解析 request,判斷是否有上傳文件 boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { // 創建磁盤工廠,利用構造器實現內存數據儲存量和臨時儲存路徑 DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 4, new File("D:\\Temp")); // 設置最多只允許在內存中存儲的數據,單位:字節 // factory.setSizeThreshold(4096); // 設置文件臨時存儲路徑 // factory.setRepository(new File("D:\\Temp")); // 產生一新的文件上傳處理程式 ServletFileUpload upload = new ServletFileUpload(factory); // 設置路徑、文件名的字符集 upload.setHeaderEncoding("UTF-8"); // 設置允許用戶上傳文件大小,單位:字節 upload.setSizeMax(1024 * 1024 * 100); // 解析請求,開始讀取數據 // Iterator<FileItem> iter = (Iterator<FileItem>) upload.getItemIterator(request); // 得到所有的表單域,它們目前都被當作FileItem List<FileItem> fileItems = upload.parseRequest(request); // 依次處理請求 Iterator<FileItem> iter = fileItems.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { // 如果item是正常的表單域 String name = item.getFieldName(); String value = item.getString("UTF-8"); System.out.println("表單域名為:"+name+"表單域值為:"+value); } else { // 如果item是文件上傳表單域 // 獲得文件名及路徑 String fileName = item.getName(); if (fileName != null) { // 如果文件存在則上傳 File fullFile = new File(item.getName()); if (fullFile.exists()) { File fileOnServer = new File("D:\\My Documents\\" + fullFile.getName()); item.write(fileOnServer); System.out.println("文件" + fileOnServer.getName() + "上傳成功"); } } } } }
利用ccommons-fileupload-1.2.1實現上傳,其實現必須包含commons-io-1.4,以上為實現上傳文件所使用的方法和所用到包的版本。
總結:以正常實現文件上傳功能,在實現過程中如果form未配置 ENCTYPE="multipart/form-data" 元素, 則上傳文件為本地的絕對路徑,而非正常的文件。 詳細使用參考api文檔。
文件上傳下載