1. 程式人生 > >文件上傳下載

文件上傳下載

大小 取數據 api 指定 獲取 方式 數據大小 字符集 exe

上傳文件方式一:利用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進行上傳文件。
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頁面
<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文檔。

文件上傳下載