8、檔案上傳原理
阿新 • • 發佈:2020-07-31
JAVA WEB方式上傳
1、新增依賴
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
2、編寫HTML表單
(1)表單的enctype屬性必須"multipart/form-data
(2)傳送請求的方式必須是POST
(3)檔案選擇域
<form action="user/fileupload" method="post" enctype="multipart/form-data"> 選擇檔案:<input type="file" name="upload" /><br> <input type="submit" value="上傳"/><br> </form>
3、編寫Controller
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("/fileupload") public String fileupload1(HttpServletRequest request) throws Exception { System.out.println("檔案上傳了"); //使用fileupload元件完成檔案上傳 //上傳的位置:通過最大的域物件獲取該檔案的絕對路徑 String realPath = request.getSession().getServletContext().getRealPath("/update"); //判斷該路徑是否存在 File file = new File(realPath); if(!file.exists()){ //建立資料夾 file.mkdirs(); } //解析request物件,獲取上傳檔案項 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); //解析request List<FileItem> items = upload.parseRequest(request); //遍歷 for (FileItem item: items ) { //進行判斷,當前item物件是否是上傳檔案項 if(item.isFormField()){ //普通表單項 }else{ //上傳檔案項 //獲取上傳檔案的名稱 String filename = item.getName(); //uuid,當上傳的圖片名是相同時避免覆蓋 String uuid = UUID.randomUUID().toString().replace("-",""); filename = uuid + "_" + filename; //完成檔案上傳往realPath傳filename的檔案 item.write(new File(realPath, filename)); //刪除臨時檔案,上傳檔案時會產生臨時檔案於記憶體中 item.delete(); } } System.out.println(realPath); return "success"; } }
Spring MVC方式上傳
spring配置檔案配置(檔案上傳必要前提)
id必須為multipartResolver
<!--配置檔案解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--檔案最大大小10mb-->
<property name="maxUploadSize" value="10485760"></property>
</bean>
html
(1)enctype必須是multipart/form-data
(2)表單的提交方式必須是Post
(3)提供一個檔案選擇域
<form action="user/fileupload2" method="post" enctype="multipart/form-data">
SpringMVC選擇檔案:<input type="file" name="upload" /><br>
<input type="submit" value="上傳"/><br>
</form>
Controller
/**
* springMVC方式檔案上傳
* 通過檔案域名稱與MultipartFile變數名建立對應關係通過反射將檔案內容穿個upload物件,省去了
* 獲取請求體內容,解析請求體,遍歷請求篩選上傳檔案項等步驟。
* @param request
* @return
* @throws Exception
*/
@RequestMapping("/fileupload2")
public String fileupload2(HttpServletRequest request, MultipartFile upload) throws Exception {
System.out.println("springmvc檔案上傳");
//使用fileupload元件完成檔案上傳
//上傳的位置:通過最大的域物件獲取該檔案的絕對路徑
String realPath = request.getSession().getServletContext().getRealPath("/update");
//判斷該路徑是否存在
File file = new File(realPath);
if(!file.exists()){
//建立資料夾
file.mkdirs();
}
//說明上傳檔案項
//獲取上傳檔案的名稱
String filename = upload.getOriginalFilename();
//uuid,當上傳的圖片名是相同時避免覆蓋
String uuid = UUID.randomUUID().toString().replace("-","");
filename = uuid + "_" + filename;
//完成檔案上傳往realPath傳filename的檔案
upload.transferTo(new File(realPath, filename));
System.out.println(realPath);
return "success";
}
SpringMvc為我們省去解析,遍歷,刪除檔案等操作
解析: