文件上傳基於form表單實現,就是在一個FORM中提交相應的信息,和之前我們的提交的註冊信息之類的表單是不同的,所以要先改變一下FORM的屬性,enctype="multipart/form-data“,這個屬性告訴服務器,我們是要提交文件了,而不是一個表單。
<input type=“file” />這是表單中用來選擇上傳文件用的,在表單中有這個元素後,會會自動生成一個輸入框和一個按鈕
我們主要使用兩個jar包 Commons-fileupload.jar commons-io.jar
主要使用的如下:
FileItem-------DiskFileItemFactory-----ServletFileUpload
作用:
FileItem 用來封裝表單中的元素和數據。
ServletFileUpload 處理表單數據,將數據封裝到 FileItem 對象中。
DiskFileItemFactory FileItem 對象的工廠,可以設定緩衝區大小和存放臨時文件目錄。
ServletFileUpload 處理上傳的文件的數據,優先保存在緩衝區,如果數據超過了緩衝區大小,則保存到硬盤上,存儲在DiskFileItemFactory指定目錄下的臨時文件。數據都接收完後,它再在從臨時文件中將數據寫入到上傳文件目錄下的指定文件中,並刪除臨時文件。
上傳頁面
通過form表單進行文件上傳,需要在form表單中設置enctype="multipart/form-data" 並且將提交方式設置爲post
<h3>會員上傳資料</h3>
<form action="/upload" method="post" enctype="multipart/form-data">
姓名: <input type="text" name="uname"> <br>
文件: <input type="file" name="ufile"> <br>
<input type="submit" value="提交資料">
</form>
接受上傳的servlet服務文件相應doPost方法
//使用FileItem工場類創建相應工場對象
FileItemFactory factory = new DiskFileItemFactory();
//創建servlet文件上傳對象並將指定工場對象傳入
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//聲明文件集合
List<FileItem> parseRequest = null;
try {
//使用servlet文件上傳對象解析請求返回文件集合
parseRequest = fileUpload.parseRequest(request);
// 遍歷文件對象集合 獲取數據
for (FileItem fileItem : parseRequest) {
// 判斷數據類型是不是普通的form表單字段
if (!fileItem.isFormField()) {
// 獲取上傳文件的文件名
String fileName = fileItem.getName();
//使用上傳文件創建輸入流
InputStream fileStream = fileItem.getInputStream();
// 使用UUID+文件名的方式生成保存文件的名稱,避免文件重名
String realFileName = UUID.randomUUID().toString() + "-" + fileName;
// 定義保存的父路徑
File fileFatherPath=new File("F://Upload");
//創建父路徑 避免路徑不存在保錯
fileFatherPath.mkdirs();
// 創建要保存的文件
File file = new File(fileFatherPath, realFileName);
// 創建輸出流
OutputStream out = new FileOutputStream(file);
// 創建字節緩存
byte[] buffer = new byte[1024];
int len = -1;
// 一次讀取1kb(1024byte),返回-1表明讀取完畢
while ((len = fileStream.read(buffer)) != -1) {
// 一次寫入1kb(1024byte)
out.write(buffer, 0, len);
}
// 沖刷流資源
out.flush();
// 關閉流
out.close();
fileStream.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
多文件上傳只需要在input處添加multiple屬性 設置file可以選擇上傳多個文件