天天看點

Java精選筆記_檔案上傳與下載下傳

檔案上傳與下載下傳

如何實作檔案上傳

在Web應用中,由于大多數檔案的上傳都是通過表單的形式送出給伺服器的,是以,要想在程式中實作檔案上傳的功能,首先得建立一個用于送出上傳檔案的表單頁面。

為了使Servlet程式可以擷取到上傳檔案的資料,需要将表單頁面的method屬性設定為post方式,enctype屬性設定為“multipart/form-data”類型,添加檔案的input标簽類型設定為file類型。

上傳

用戶端

form的enctype屬性設定為multipart/form-data

<input type="file" name="xxx" multiple/>

伺服器

@MultipartConfig

maxFileSize

maxRequestSize

location

fileSizeThreshold

HttpServletRequest

getPart(String)

getParts()

Part

getName()

getContentType()

write(String)

delete()

getInputStream()

檔案上傳的相關API

FileItem接口

FileItme接口用于封裝單個表單字段元素的資料,一個表單字段元素對應一個FileItem對象,在FileItem類中定義了許多擷取表單字段元素的方法。

boolean isFormField()

isFormField()方法用于判斷FileItem類對象封裝的資料是一個普通文本表單字段,還是一個檔案表單字段,如果是普通表單字段則傳回true,否則傳回false。

String getName()

getName()方法用于獲得檔案上傳字段中的檔案名。如果FileItem類對象對應的是普通表單字段,getName()方法将傳回null,否則,隻要浏覽器将檔案的字段資訊傳遞給伺服器,getName()方法就會傳回一個字元串類型的結果,如:“C:\Sunset.jpg”。

String getFieldName()

getFieldName()方法用于獲得表單字段元素描述頭的name屬性值,也是表單标簽name屬性的值。例如“name=file1”中的“file1”。

void write(File file)

write()方法用于将FileItem對象中儲存的主體内容儲存到某個指定的檔案中。如果FileItem對象中的主體内容是儲存在某個臨時檔案中,那麼該方法順利完成後,臨時檔案有可能會被清除。另外,該方法也可将普通表單字段内容寫入到一個檔案中,但它主要用于将上傳的檔案内容儲存到本地檔案系統中。

String getString()

getString()方法用于将FileItem對象中儲存的資料流内容以一個字元串傳回,它有兩個重載的定義形式:

public String getString()

public String getString(java.lang.String encoding)

String getContentType()

getContentType()方法用于獲得上傳檔案的類型,即表單字段元素描述頭屬性“Content-Type”的值,如“image/jpeg”。如果FileItem類對象對應的是普通表單字段,該方法将傳回null。

boolean isInMemory()

isInMemory()方法用來判斷FileItem對象封裝的資料内容是存儲在記憶體中,還是存儲在臨時檔案中,如果存儲在記憶體中則傳回true,否則傳回false。

void delete()

delete()方法用來清空FileItem類對象中存放的主體内容,如果主體内容被儲存在臨時檔案中,delete()方法将删除該臨時檔案。需要注意的是,盡管FileItem對象被垃圾收集器收集時會自動清除臨時檔案,但應該及時調用delete()方法清除臨時檔案,進而釋放系統存儲資源,以防系統出現異常,導緻臨時檔案被永久的儲存在硬碟中。

InputStream getInputStream()

getInputStream()方法以流的形式傳回上傳檔案的資料内容。

long getSize()

getSize()方法傳回該上傳檔案的大小(以位元組為機關)。

DiskFileItemFactory類

用于将請求消息實體中的每一個檔案封裝成單獨的FileItem對象。如果上傳的檔案比較小,将直接儲存在記憶體中,如果上傳的檔案比較大,則會以臨時檔案的形式,儲存在磁盤的臨時檔案夾中。預設情況下,檔案儲存在記憶體還是硬碟臨時檔案夾的臨界值是10240,即10kb。

兩個構造方法

DiskFileItemFactory() 采用預設臨界值和系統臨時檔案夾構造檔案項工廠對象

DiskFileItemFactory(int sizeThreshold, File repository ) 采用參數指定臨界值和系統臨時檔案夾構造檔案項工廠對象

常用方法

FileItem createItem()方法

該方法用于将請求消息實體建立成FileItem類型的執行個體對象,該方法是FileUpload元件在解析請求時内部自動調用,無需我們管理。

setSizeThreshold(int sizeThreshold) 和getSizeThreshold()方法

setSizeThreshold(int sizeThreshold)方法用于設定是否将上傳檔案以臨時檔案的形式儲存在磁盤的臨界值。getSizeThreshold()方法用來擷取此臨界值。

setRepository(File repository)和getRespository()方法

如果上傳檔案的大小大于setSizeThreshold()方法設定的臨界值,這時,可以采用setRepository()方法,将上傳的檔案以臨時檔案的形式儲存在指定的目錄下。

ServletFileUpload類

ServletFileUpload類是Apache元件處理檔案上傳的核心進階類,通過使用parseRequest(HttpServletRequest) 方法可以将HTML中每個表單送出的資料封裝成一個FileItem對象,然後以List清單的形式傳回。

兩個構造方法

ServletFileUpload() 構造一個未初始化的ServletFileUpload執行個體對象

ServletFileUpload(FileItemFactory fileItemFactory)  根據參數指定的FileItemFactory對象建立一個ServletFileUpload對象

常用方法

setSizeMax(long sizeMax)和

getSizeMax()

setSizeMax()方法繼承自FileUploadBase類,用于設定請求消息實體内容(即所有上傳資料)的最大尺寸限制,以防止用戶端惡意上傳超大檔案來浪費伺服器端的存儲空間。其中,參數sizeMax是以位元組為機關。對應的getSizeMax()方法用于讀取請求消息實體内容所允許的最大值

setFileSizeMax(long fileSizeMax)

setFileSizeMax()方法繼承自FileUploadBase類,用于設定單個上傳檔案的最大尺寸限制,以防止用戶端惡意上傳超大檔案來浪費伺服器端的存儲空間。其中,參數fileSizeMax是以位元組為機關。對應的geFileSizeMax()方法用于擷取單個上傳檔案所允許的最大值。

parseRequest(javax.servlet.http.

HttpServletRequest req)

parseRequest()方法是ServletFileUpload類的重要方法,它是對HTTP請求消息體内容進行解析的入口。它解析出FORM表單中的每個字段的資料,并将它們分别包裝成獨立的FileItem對象,然後将這些FileItem對象加入進一個List類型的集合對象中傳回。

getItemIterator(HttpServletRequest request)

getItemIterator()方法和parseRequest()方法基本相同。但是getItemIterator()方法傳回的是一個疊代器,該疊代器中儲存的不是FileItem對象,而是FileItemStream對象,如果你希望進一步提高性能,你可以采用getItemIterator()方法,直接獲得每一個檔案項的資料輸入流,做底層處理;如果性能不是問題,你希望代碼簡單,則采用parseRequest()方法即可。

isMultipartContent(HttpServletRequest req)

isMultipartContent()方法用于判斷請求消息中的内容是否是“multipart/form-data”類型,如果是,則傳回true,否則傳回false。需要注意的是,isMultipartContent()方法是一個靜态方法,不用建立ServletFileUpload類的執行個體對象即可被調用。

getFileItemFactory()和

setFileItemFactory(FileItemFactory factory)

這兩個方法繼承自FileUpload類,分别用于讀取和設定fileItemFactory屬性。

setHeaderEncoding(String encoding)和getHeaderEncoding()

這兩個方法繼承自FileUploadBase類,用于設定和讀取字元編碼。需要注意的是,如果沒有使用setHeaderEncoding()設定字元編碼,則getHeaderEncoding()方法傳回null,上傳元件會采用HttpServletRequest設定的字元編碼。但是,如果HttpServletRequest的字元編碼也為null,這時,上傳元件将采用系統預設的字元編碼。擷取系統預設字元編碼的方式如:System.getProperty("file.encoding"));

繼續閱讀