JavaWeb基於servlet的文件上傳

        文件上傳基於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可以選擇上傳多個文件

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章