文章目錄
- 實作步驟
- 核心API
- 詳情代碼
在使用圖片上傳功能時,本文章采用表單提交的方法來上傳,所以在表單當中需要加上引數
enctype="multipart/form-data"
<form name="form1" method="post"
action="<%=request.getContextPath()%>/picture.do?method=addPage"
onsubmit="return checkForm()" enctype="multipart/form-data">
<table border="1">
<tr>
<th><input type="file" id="imgFile" name="image"
onchange="imgPreview(this)" accept="image/*" /></th>
</tr>
<td><input style="float: right" type="submit" value="添加至圖片墻" /></td>
</tr>
</table>
</form>
實作步驟
- 創建
DiskFileItemFactory物件,設定緩沖區大小和臨時檔案目錄, - 使用
DiskFileItemFactory物件創建ServletFileUpload物件,并設定上傳檔案的大小限制, - 呼叫
ServletFileUpload.parseRequest方法決議request物件,得到一個保存了所有上傳內容的List物件, - 對
list進行迭代,每迭代一個FileItem物件,呼叫其isFormField方法判斷是否是上傳檔案:- 為普通表單欄位,則呼叫
getFieldName、getString方法得到欄位名和欄位值, - 為上傳檔案,則呼叫
getInputStream方法得到資料輸入流,從而讀取上傳資料,
- 為普通表單欄位,則呼叫
核心API
核心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型別
2.List parseRequest(HttpServletRequest request):決議request物件,并把表單中的每一個輸入項包裝成一個fileItem物件,并回傳一個保存了所有FileItem的list集合,setFileSizeMax(long fileSizeMax):設定上傳檔案的最大值(單個檔案),用于設定單個上傳檔案的最大尺寸限制,以防止客戶端惡意上傳超大檔案來浪費服務器端的存盤空間,其引數是以位元組為單位的long型數字,setSizeMax(long sizeMax):設定上傳檔案總量的最大值(所有上傳檔案),用于設定請求訊息物體內容(即所有上傳資料)的最大尺寸限制,以防止客戶端惡意上傳超大檔案來浪費服務器端的存盤空間,其引數是以位元組為單位的long型數字,setHeaderEncoding(java.lang.String encoding):設定編碼格式,在檔案上傳請求的訊息體中,除了普通表單域的值是文本內容以外,檔案上傳欄位中的檔案路徑名也是文本,在記憶體中保存的是它們的某種字符集編碼的位元組陣列,Apache檔案上傳組件在讀取這些內容時,必須知道它們所采用的字符集編碼,才能將它們轉換成正確的字符文本回傳,
核心API—FileItem
FileItem類的常用方法:
boolean isFormField():isFormField方法用于判斷FileItem類物件封裝的資料是一個普通文本表單欄位,還是一個檔案表單欄位,如果是普通表單欄位則回傳true,否則回傳false,String getName():用于獲得檔案上傳欄位中的檔案名,注意IE或FireFox中獲取的檔案名是不一樣的,IE中是絕對路徑,FireFox中只是檔案名,String getFieldName():用于回傳表單標簽name屬性的值,void write(File file):用于將FileItem物件中保存的主體內容保存到某個指定的檔案中,如果FileItem物件中的主體內容是保存在某個臨時檔案中,該方法順利完成后,臨時檔案有可能會被清除,該方法也可將普通表單欄位內容寫入到一個檔案中,但它主要用途是將上傳的檔案內容保存在本地檔案系統中,String getString():用于將FileItem物件中保存的資料流內容以一個字串回傳,它有兩個多載的定義形式:public Java.lang.String getString();public java.lang.String getString(java.lang.String encoding) throws java.io.UnsupportedEncodingException,- 前者使用預設的字符集編碼將主體內容轉換成字串,后者使用引數指定的字符集編碼將主體內容轉換成字串,如果在讀取普通表單欄位元素的內容時出現了中文亂碼現象,請呼叫第二個getString方法,并為之傳遞正確的字符集編碼名稱,
void delete():delete方法用來清空FileItem類物件中存放的主體內容,如果主體內容被保存在臨時檔案中,delete方法將洗掉該臨時檔案,盡管當FileItem物件被垃圾收集器收集時會自動清除臨時檔案,但及時呼叫delete方法可以更早的清除臨時檔案,釋放系統存盤資源,
詳情代碼
private void pictrueUpload(HttpServletRequest request, HttpServletResponse response)
throws IOException, FileUploadException, ClassNotFoundException, SQLException {
// 設定相應編碼集
response.setContentType("text/html;charset=UTF-8");
// 定義變數
// 檔案保存時候的名字
String fileSaveName = null;
// 決議的結果
List<FileItem> formItemList = null;
// 設定圖片保存路徑,本次使用本電腦系統作為服務器
String path = this.getServletContext().getRealPath("/") + "WEB-INF/image";
System.out.println("圖片的存盤路徑為:" + path);
// 判斷是否存在
File file = new File(path);
if (!file.exists()) {
file.mkdir();// 如果不存在就創建
}
// 創建工廠類
DiskFileItemFactory factory = new DiskFileItemFactory();
// 創建具體功能類
ServletFileUpload upload = new ServletFileUpload(factory);
// 處理中文
upload.setHeaderEncoding("utf-8");
// 資料傳進去,獲取具體決議到的結果
formItemList = upload.parseRequest(request);
// 判斷是否包含資料
System.out.println(formItemList.size());
if (formItemList != null && formItemList.size() > 0) {
for (FileItem fileItem : formItemList) {
// 判斷是否是檔案型別
if (!fileItem.isFormField()) {
String fileName = fileItem.getName(); // 獲取上傳檔案的名字
// 獲取后綴
String prifix = fileName.substring(fileName.lastIndexOf(".") + 1);
System.out.println("后綴為:" + prifix);
// 創建ID系結session,區分用戶
String id = UUID.randomUUID().toString();
fileSaveName = id + "." + prifix;
if (prifix.length() == 0) {
fileSaveName = "(NULL)";
}
System.out.println("檔案保存的名字為:" + fileSaveName);
// 使用commons-io把圖片復制進本地
FileUtils.copyInputStreamToFile(fileItem.getInputStream(), new File(path + "/" + fileSaveName));
}
}
}
String virtualPath = fileSaveName;
// 添加資料庫
pictureService.save(virtualPath);
// 重定向
response.sendRedirect(request.getContextPath() + "/picture.do?method=query");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/234943.html
標籤:其他
上一篇:華為 QOS服務質量基礎知識總結
