摘要:翻了幾篇教程,寫出來了一個簡單的文件上傳接收代碼。這里我們就真正建了一個的實例來處理文件的上傳。可以設置上傳文件的最大大小。參考的文章實現基本文件上傳在中使用開源包實現文件上傳功能
文件上傳可以說是Web應用中很常用的一塊,前幾天打算研究一下HTML5提供的FileReader API,并且用Tomcat作為后端來實驗大文件的上傳(只是學校的課程作業必須用Java寫,都不允許使用最好的編程語言php>.<)。可Java Servlet與php這種喜聞樂見的Web碼農語言不同,并沒有提供一個很簡單的處理文件上傳的API,所以還搗鼓了蠻久,也對一般的文件上傳的HTML控件和實現原理稍微有了一點了解。
對面宿舍的一位同學說我很久沒更了不太好,于是我就寫一篇,謝謝他的提醒。
首先,我們都知道最常見的HTML的文件上傳控件是喜聞樂見的,但一定要搭配form的屬性enctype="multipart/form-data",服務器上要有一個接收上傳的cgi或者別的什么,既然我們用java寫,就叫uploadServlet。于是有了一個如下的常見的上傳表單。
然后我們在后端處理。由于Java Servlet的API是沒有提供什么$_FILES數組這樣傻瓜式的文件操控方式,我們必須自己處理request。我們不妨先把收到的request輸出到文件當中,看看Servlet會收到什么,再想想怎么處理。放這樣一個servlet的代碼:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class UploadServlet extends HttpServlet{ @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ response.setContentType("text/plain;charset=utf-8"); PrintWriter writer=response.getWriter(); InputStream in=request.getInputStream(); File f = new File("/tmp/upload"); //把文件存到/tmp/upload FileOutputStream fout = new FileOutputStream(f); byte[] b=new byte[1024]; int n=0; while ((n=in.read(b))!=-1){ fout.write(b,0,n); } fout.close(); in.close(); writer.println("Finished uploading files!"); writer.close(); } }
有了Servlet就拖出去跑一跑。這里我的表單不僅會發送文件,還會發送一個密碼域。如果我隨便發一個文本文件,那么我得到了這樣的結果。
多上傳幾次還會發現那一堆橫杠開頭的數字會變動。這下不好玩了,雖然我們可以看到我們上傳的數據,但要解析它有點過于復雜了。這個請求是依據RFC1867來寫的,雖然有標準可依,但我們這么懶怎么會去依照標準寫一個解析器呢?
于是我們需要請出Apache開發的文件上傳處理庫Commons FileUpload。這個網站提供了最新版的下載鏈接和基本的使用指南。文檔講得過于全面了,而我們一般不需要那么多功能,夠用就好。翻了幾篇教程,寫出來了一個簡單的文件上傳接收代碼。
javaimport javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.servlet.*; import org.apache.commons.fileupload.disk.*;
首先需要多裝載三個庫,以及一個java.util.List,因為到時候處理的時候,Commons FileUpload會把搞成一個List返回回來,我們需要接收這個List并處理解析它。
public class UploadServlet extends HttpServlet{ private String filepath; private String temppath; private String buf; public void init(ServletConfig config) throws ServletException{ super.init(config); ServletContext context=getServletContext(); filepath=context.getRealPath("/"+config.getInitParameter("filepath")); temppath=context.getRealPath("/"+config.getInitParameter("temppath")); }
為了方便維護,我把保存上傳文件的目錄用Init Parameter的方式寫到web.xml里面去,然后在這個地方讀出來。我們需要一個保存上傳文件的目錄和一個用來做緩存的臨時目錄。如果你接收上傳文件之后不打算保存而是直接拿去處理,也沒有問題,但是一定要有一個緩存目錄,在后面有用。
接下來是真正激動人心的處理上傳的代碼了。我懶得寫doGet了所以就只有一個doPost。
@Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ response.setContentType("text/plain;charset=utf-8"); PrintWriter writer=response.getWriter(); int count=0; try{ DiskFileItemFactory diskFactory = new DiskFileItemFactory(); diskFactory.setSizeThreshold(4 *1024 ); diskFactory.setRepository(new File(temppath));
這里我們開了一個diskFactory,就是FileUpload所需要使用的緩存,當內存存不下上傳的文件的時候,它會自動寫入緩存目錄。通過setSizeThreshold方法可以設置內存的使用上限,也就是當內存用了這么多卻還存不下,就開始寫緩存。顯然這個值很大程度上會決定這個Servlet的效率。
ServletFileUpload upload = new ServletFileUpload(diskFactory); upload.setSizeMax(4 * 1024 * 1024); List fileItems = upload.parseRequest(request); Iterator iter = fileItems.iterator();
這里我們就真正建了一個ServletFileUpload的實例upload來處理文件的上傳。可以設置上傳文件的最大大小。然后把request對象直接交給upload來解析,它會返回一個一個List,這個List的每一項實際上是一個FileItem對象,后面就要用迭代器處理這個列表。
while (iter.hasNext()){ FileItem item = (FileItem) iter.next(); if (item.isFormField()){ writer.println(item.getFieldName()+" : "+item.getString()); }
要注意的是ServletFileUpload也會處理非文件的信息,可以用isFormField方法來檢查,然后將信息獲取出來。但這在這里不是重點,只是必須要處理掉而已。
else{ String filename = item.getName(); filename = filename.substring( filename.lastIndexOf("")+1,filename.length()); File uploadFile = new File(filepath+"/"+filename); item.write(uploadFile); writer.println("Get file:"+ filename); writer.println(" filetype: "+item.getContentType()); count++; } } } catch (Exception e){ e.printStackTrace(); } writer.println("Finished uploading files!"); writer.close(); } }
處理文件的代碼就這么點,如果還要說什么的話,就是每個文件的FileItem對象不僅可以用write方法來直接寫到什么文件里面去,也可以用getInputStream方法得到一個輸入流來解析,或者用get方法直接讀到一個byte數組里面去。可以說這個庫提供了一個很方便的方法解析上傳的文件。
最后提一下,Apache Commons是一個Java增強庫,提供了大量的優質Java資源庫,涉及很多開發領域。如果不出意外,應該我會在近期寫一篇關于JavaScript FileReader的blog,敬請期待。
參考的文章:
Servlet實現基本文件上傳
在Servlet中使用開源fileupload包實現文件上傳功能
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/35743.html
摘要:第一步搭環境基本我們要清楚自己的版本。因為我們配置的成功的前提是版本相對應。解壓縮都隨便一個盤都行,下圖是我的路徑配置相關環境變量,由于本人之前已經配置了開發時環境,即。這個顯示上傳狀態與后面在中有定義。 第一步: 搭環境,基本jdk 1.6+apache tomcat6.0+myeclipse2014 1.我們要清楚自己的jdk版本。因為我們Apache Tomcat配置的成...
摘要:第一步搭環境基本我們要清楚自己的版本。因為我們配置的成功的前提是版本相對應。解壓縮都隨便一個盤都行,下圖是我的路徑配置相關環境變量,由于本人之前已經配置了開發時環境,即。這個顯示上傳狀態與后面在中有定義。 第一步: 搭環境,基本jdk 1.6+apache tomcat6.0+myeclipse2014 1.我們要清楚自己的jdk版本。因為我們Apache Tomcat配置的成...
摘要:要使用容器上傳文件,您需要注冊一個類在中。最好不要使用內容加載應用程序的文件系統。允許用戶上傳文件的表單從后端提供的文件列表調整文件上傳限制配置文件上傳時,設置文件大小限制通常很有用。 本指南將指導您完成創建可以接收HTTP多文件上傳服務器應用程序的過程。 你要構建什么 您將創建一個接受文件上傳的Spring Boot Web應用程序。您還將構建一個簡單的HTML界面來上傳測試文件。 ...
摘要:前言案例使用的開發工具不足之處希望各位大佬們多多指教頂包文件代碼圖片路徑選擇圖片代碼圖片上傳選完文件后,是否自動上傳。內部根據當前運行是創建,可能是元素,也可能是這里是的文件上傳方式,或者。默認值設置文件上傳域的。 前言: ????????案例使用的開發工具:eclipse ? ? ? ? ...
摘要:一添加項目依賴二上傳上傳文件存儲目錄上傳配置上傳文件最大值檢測是否為多媒體上傳如果不是則停止表單必須包含配置上傳參數設置最大文件上傳值中文處理構造臨時路徑來存儲上傳的文件這個路徑相對當前應用的目錄如果目錄不存在則創建解析請求的內容 一、添加項目依賴(gradle) dependencies { compile group: javax.servlet, name: javax....
閱讀 769·2021-11-23 09:51
閱讀 835·2021-11-23 09:51
閱讀 2503·2021-11-15 18:01
閱讀 3861·2021-10-11 11:07
閱讀 2396·2021-09-22 15:30
閱讀 1074·2021-09-22 14:59
閱讀 1557·2019-08-30 15:55
閱讀 1753·2019-08-30 15:52