SpingMVC框架:fileUpload组件原理和实现
QUESTION:fileUpload組件原理和實(shí)現(xiàn)
?
ANSWER:
?
目錄
QUESTION:fileUpload組件原理和實(shí)現(xiàn)
ANSWER:
一:異常產(chǎn)生
查詢了一系列博客后,發(fā)現(xiàn)這是由于上傳文件的大小超過(guò)了可以上傳的臨時(shí)文件限制。
二:fileUpload組件及Java Web中文件上傳的原理方法
2.1基本原理
2.2實(shí)現(xiàn)代碼
2.3重要方法
2.4注意事項(xiàng):
?
一:異常產(chǎn)生
在剛學(xué)習(xí)springMVC框架時(shí),上傳文件出現(xiàn)了以下HTTP Status 500 – Internal Server Error:
Exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. C:\Program Files\apache-tomcat-8.5.38\temp\upload_2f146db1_be01_4311_a3d8_e6c7cd69c8d3_00000002.tmp (拒絕訪問(wèn)。)org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)javax.servlet.http.HttpServlet.service(HttpServlet.java:661)org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)javax.servlet.http.HttpServlet.service(HttpServlet.java:742)org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)Root Cause
org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. C:\Program Files\apache-tomcat-8.5.38\temp\upload_2f146db1_be01_4311_a3d8_e6c7cd69c8d3_00000002.tmp (拒絕訪問(wèn)。)org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351)org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)com.xy.controller.UserController.fileUpload(UserController.java:36)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:498)org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)javax.servlet.http.HttpServlet.service(HttpServlet.java:661)org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)javax.servlet.http.HttpServlet.service(HttpServlet.java:742)org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)Root Cause
java.io.FileNotFoundException: C:\Program Files\apache-tomcat-8.5.38\temp\upload_2f146db1_be01_4311_a3d8_e6c7cd69c8d3_00000002.tmp (拒絕訪問(wèn)。)java.io.FileOutputStream.open0(Native Method)java.io.FileOutputStream.open(FileOutputStream.java:270)java.io.FileOutputStream.<init>(FileOutputStream.java:213)java.io.FileOutputStream.<init>(FileOutputStream.java:162)org.apache.commons.io.output.DeferredFileOutputStream.thresholdReached(DeferredFileOutputStream.java:178)org.apache.commons.io.output.ThresholdingOutputStream.checkThreshold(ThresholdingOutputStream.java:224)org.apache.commons.io.output.ThresholdingOutputStream.write(ThresholdingOutputStream.java:128)org.apache.commons.fileupload.util.Streams.copy(Streams.java:107)org.apache.commons.fileupload.util.Streams.copy(Streams.java:70)org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:347)org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)com.xy.controller.UserController.fileUpload(UserController.java:36)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)java.lang.reflect.Method.invoke(Method.java:498)org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)javax.servlet.http.HttpServlet.service(HttpServlet.java:661)org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)javax.servlet.http.HttpServlet.service(HttpServlet.java:742)org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)Note The full stack trace of the root cause is available in the server logs.
查詢了一系列博客后,發(fā)現(xiàn)這是由于上傳文件的大小超過(guò)了可以上傳的臨時(shí)文件限制。
?
二:fileUpload組件及Java Web中文件上傳的原理方法
2.1基本原理
給出官網(wǎng)文檔:upLoad。
組件FileUpload依賴于Commons IO組件,因此在繼續(xù)之前,要確保在你的工程classpath中有描述頁(yè)中提到的相應(yīng)版本。(這里FileUpload版本為:commons- fileupload-1.2.1,Commons IO版本為:commons-io-1.4)。
最簡(jiǎn)單的示例(官網(wǎng)):
// Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory();// Configure a repository (to ensure a secure temp location is used) ServletContext servletContext = this.getServletConfig().getServletContext(); File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); factory.setRepository(repository);// Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory);// Parse the request List<FileItem> items = upload.parseRequest(request);原理:
上傳的文件要求包括一個(gè)根據(jù)RFC 1867(在HTML中基于表單的文件)編碼的選項(xiàng)列表清單。組件FileUpload可以解析這個(gè)請(qǐng)求,并給你的應(yīng)用程序提供一份獨(dú)立上傳的項(xiàng)目清單。無(wú)論每個(gè)項(xiàng)目背后如何執(zhí)行都實(shí)現(xiàn)了FileItem接口。
這里將描述組件FileUpload庫(kù)的普通API,這些API比較簡(jiǎn)單。不過(guò),對(duì)于最終的實(shí)現(xiàn),你可以參考最新的API流。
每一個(gè)文件項(xiàng)目都有一些屬性,這些可能在你的應(yīng)用程序中應(yīng)用到。比如:每一個(gè)項(xiàng)目有一個(gè)名稱name和內(nèi)容類型content type,并提供了一個(gè) InputStream訪問(wèn)其數(shù)據(jù)。另一方面,你處理項(xiàng)目的方法可能有所不同,這個(gè)依賴于是否這個(gè)項(xiàng)目是一個(gè)規(guī)則的表單域,即:這個(gè)數(shù)據(jù)是來(lái)自普通的表單文本,還是普通的HTML域或是一個(gè)上傳文件。在FileItem接口中提供了處理這些問(wèn)題的方法,可以更加方便的去訪問(wèn)這些數(shù)據(jù)。
組件FileUpload使用FileItemFactory工廠創(chuàng)建新的文件項(xiàng)目。這個(gè)給了組件FileUpload很大的靈活性。這個(gè)工廠擁有怎樣創(chuàng)建項(xiàng)目的最終控制權(quán)。工廠執(zhí)行過(guò)程中上傳項(xiàng)目文件的臨時(shí)數(shù)據(jù)可以存儲(chǔ)在內(nèi)存中或硬盤上。這個(gè)依賴于上傳項(xiàng)目的大小(即:數(shù)據(jù)的字節(jié))。不過(guò)這種行為可以在你的應(yīng)用程序中適當(dāng)?shù)淖远ㄖ啤?/p>
解析:
在實(shí)現(xiàn)上傳項(xiàng)目之前,當(dāng)然需要解析這個(gè)請(qǐng)求。確保這個(gè)請(qǐng)求的確是一個(gè)正確的上傳文件,組件FileUpload為了使這個(gè)判斷簡(jiǎn)單,提供了一個(gè)靜態(tài)的方法去做這個(gè)事情。
// 檢測(cè)我們是否一個(gè)文件上傳的請(qǐng)求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
示例:
最簡(jiǎn)單的使用情況如下:
* 上傳項(xiàng)目只要足夠小,就應(yīng)該將其保存在內(nèi)存中。
* 較大的項(xiàng)目應(yīng)該被寫(xiě)入到硬盤的臨時(shí)文件中。
* 應(yīng)該避免有非常大的上傳項(xiàng)目。
* 設(shè)置項(xiàng)目默認(rèn)的在內(nèi)存中所占的空間,限制最大的上傳請(qǐng)求,并設(shè)定臨時(shí)文件 的位置。
處理這種情況下的請(qǐng)求非常的簡(jiǎn)單:
// 創(chuàng)建磁盤工廠
FileItemFactory factory = new DiskFileItemFactory();
// 創(chuàng)建處理工具
ServletFileUpload upload = new ServletFileUpload(factory);
// 解析
List <FileItem> items = upload.parseRequest(request);
這就是我們真正需要的全部代碼。
處理的結(jié)果是生成了一個(gè)文件項(xiàng)目列表,每個(gè)文件項(xiàng)目實(shí)現(xiàn)一個(gè)FileItem接口。下面將介紹如何處理這些項(xiàng)目。
?
控制:
如果你的使用情況和上面描述的例子很接近,但是你需要在一點(diǎn)更多的控制限定文件的大小或臨時(shí)文件的存放位置。你可以很容易的自定義上傳實(shí)例或文件項(xiàng)目或兩者的行為。下面例子展示了幾種配置選項(xiàng):
// 創(chuàng)建磁盤工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
// 設(shè)置參數(shù)
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
// 創(chuàng)建處理工具
ServletFileUpload upload = new ServletFileUpload(factory);
// 設(shè)置最大允許的尺寸
upload.setSizeMax(yourMaxRequestSize);
// 解析
List <FileItem> items = upload.parseRequest(request);
當(dāng)然,每一個(gè)配置處理方法都是獨(dú)立于其他方法的,但是如果你想一次性配置這個(gè)工廠,你可以使用工廠的另一個(gè)重載方法。像這樣:
DiskFileItemFactory factory = new DiskFileItemFactory( yourMaxMemorySize, yourTempDirectory);
詳細(xì)的接口文檔:http://commons.apache.org/proper/commons-fileupload/javadocs/api-release/index.html
2.2實(shí)現(xiàn)代碼
使用fileUpload固定步驟:
? ? 創(chuàng)建工廠類:DiskFileItemFactory factory=new DiskFileItemFactory();
? ? 創(chuàng)建解析器:ServletFileUpload upload=new ServletFileUpload(factory);
? ? 使用解析器解析request對(duì)象:List<FileItem> list=upload.parseRequest(request);
?
首先導(dǎo)入相關(guān)包。見(jiàn)上文。
1.jsp代碼:
<%--Created by IntelliJ IDEA.User: 楊路恒Date: 2019/8/17 0017Time: 11:24 --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>文件上傳</title> </head> <body><form action="UserController/fileUpload1" method="post" enctype="multipart/form-data">選擇文件:<input type="file" name="upload"><br>上傳:<input type="submit" value="上傳" name="uploadFile"></form> </body> </html>2.配置springmvc-xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--掃描spring的包--><context:component-scan base-package="com.xy"></context:component-scan><!--視圖解析器對(duì)象--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean><!--前端控制器,哪些靜態(tài)資源不攔截--><mvc:resources location="/css/" mapping="/css/**"/> <!-- 樣式 --><mvc:resources location="/images/" mapping="/images/**"/> <!-- 圖片 --><mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript --><!--開(kāi)啟springMVC的支持,類型轉(zhuǎn)換器生效--><mvc:annotation-driven></mvc:annotation-driven></beans>3.配置web.xml:
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--前端控制器--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--中文亂碼過(guò)濾器--><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping> </web-app>4.控制器代碼:
package com.xy.controller;import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest; import java.io.File; import java.util.List;@Controller @RequestMapping("/UserController") public class UserController {/*** 文件上傳* @return*/@RequestMapping("/fileUpload1")public String fileUpload(HttpServletRequest request) throws Exception {System.out.println("文件上傳");//使用fileupload組件上傳文件//上傳路徑String path=request.getSession().getServletContext().getRealPath("/uploads");//判斷該路徑是否存在File file=new File(path);if (!file.exists()){file.mkdirs();}//解析request對(duì)象獲取上傳文件項(xiàng)DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory(); // diskFileItemFactory.setSizeThreshold(1024*1024); //設(shè)置內(nèi)存緩沖區(qū)大小,系統(tǒng)默認(rèn)值10KBFile temp=new File(request.getSession().getServletContext().getRealPath("/temp"));temp.mkdirs();System.out.println("建立成功");diskFileItemFactory.setRepository(temp);System.out.println(System.getProperty("java.io.tmpdir"));ServletFileUpload servletFileUpload=new ServletFileUpload(diskFileItemFactory);servletFileUpload.setFileSizeMax(100*1024*1024);//解析requestList<FileItem> items=servletFileUpload.parseRequest(request);for (FileItem item:items) {//判斷當(dāng)前item是否是上傳文件對(duì)象if (item.isFormField()){//說(shuō)明普通表單向}else {//說(shuō)明上傳文件項(xiàng)//獲取文件名稱String fileName=item.getName();//完成文件上傳item.write(new File(path,fileName));System.out.println("寫(xiě)入成功");//刪除臨時(shí)文件,系統(tǒng)會(huì)自動(dòng)刪除 // item.delete();}}return "success";} }5.success代碼:
<%--Created by IntelliJ IDEA.User: 楊路恒Date: 2019/8/17 0017Time: 11:21 --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body><h1>文件上傳成功</h1> </body> </html>1.普通表單提交默認(rèn)enctype="application/x-www-form-urlencoded";但是當(dāng)表單中存在文件類型時(shí),需要設(shè)置enctype="multipart/form-data",它不對(duì)字符進(jìn)行編碼,用于發(fā)送二進(jìn)制的文件(即所有文件類型,如視頻、圖片、音樂(lè)、文檔都可以用此類型entype);還有一種enctype="text/plain"用于發(fā)送純文本內(nèi)容。
2.表單請(qǐng)求方式必須為post。
3.接收時(shí)不能再用request.getParameter(),而是request.getInputStream()解析二進(jìn)制流,得到ServletInputStream對(duì)象。
?
2.3重要方法
1.DiskFileItemFactory:
DiskFileItemFactory有兩個(gè)方法 :setSizeThreshold和setRepository
?setRepository方法用于設(shè)置當(dāng)上傳文件尺寸大于setSizeThreshold方法設(shè)置的臨界值時(shí),將文件以臨時(shí)文件形式保存在磁盤上的存放目錄。有一個(gè)對(duì)應(yīng)的獲得臨時(shí)文件夾的 File getRespository() 方法。
? ? ? ? 注意:當(dāng)從沒(méi)有調(diào)用此方法設(shè)置臨時(shí)文件存儲(chǔ)目錄時(shí),默認(rèn)采用系統(tǒng)默認(rèn)的臨時(shí)文件路徑,可以通過(guò)系統(tǒng)屬性 java.io.tmpdir 獲取。如下代碼:
System.getProperty("java.io.tmpdir");
Tomcat系統(tǒng)默認(rèn)臨時(shí)目錄為“<tomcat安裝目錄>/temp/”。
?setSizeThreshold方法說(shuō)明:
??
?Apache文件上傳組件在解析上傳數(shù)據(jù)中的每個(gè)字段內(nèi)容時(shí),需要臨時(shí)保存解析出的數(shù)據(jù),以便在后面進(jìn)行數(shù)據(jù)的進(jìn)一步處理(保存在磁盤特定位置或插入數(shù)據(jù)庫(kù))。因?yàn)镴ava虛擬機(jī)默認(rèn)可以使用的內(nèi)存空間是有限的,超出限制時(shí)將會(huì)拋出“java.lang.OutOfMemoryError”錯(cuò)誤。如果上傳的文件很大,例如800M的文件,在內(nèi)存中將無(wú)法臨時(shí)保存該文件內(nèi)容,Apache文件上傳組件轉(zhuǎn)而采用臨時(shí)文件來(lái)保存這些數(shù)據(jù);但如果上傳的文件很小,例如600個(gè)字節(jié)的文件,顯然將其直接保存在內(nèi)存中性能會(huì)更加好些。
? ? ? ?setSizeThreshold方法用于設(shè)置是否將上傳文件已臨時(shí)文件的形式保存在磁盤的臨界值(以字節(jié)為單位的int值),如果從沒(méi)有調(diào)用該方法設(shè)置此臨界值,將會(huì)采用系統(tǒng)默認(rèn)值10KB。對(duì)應(yīng)的getSizeThreshold() 方法用來(lái)獲取此臨界值。
2.FileItem:
? ? String getFieldName():獲取表單項(xiàng)的name的屬性值。
? ? String getName():獲取文件字段的文件名。如果是普通字段,則返回null
? ? String getString():獲取字段的內(nèi)容。如果是普通字段,則是它的value值;如果是文件字段,則是文件內(nèi)容。
? ? String getContentType():獲取上傳的文件類型,例如text/plain、image。如果是普通字段,則返回null。
? ? long getSize():獲取字段內(nèi)容的大小,單位是字節(jié)。
? ? boolean isFormField():判斷是否是普通表單字段,若是,返回true,否則返回false。
? ? InputStream getInputStream():獲得文件內(nèi)容的輸入流。如果是普通字段,則返回value值的輸入流。
2.4注意事項(xiàng):
1.文件名中文亂碼處理:servletFileUpload.setHeaderEncoding("utf-8") 或 request.setCharacterEncoding("utf-8");
2.表單普通字段中文亂碼處理:new String(str.getBytes("iso-8859-1","utf-8"));
3.設(shè)置內(nèi)存緩沖區(qū)的大小,默認(rèn)為10KB:diskFileItemFactory.setSizeThreshold(1024*1024);
4.指定臨時(shí)文件目錄,如果單個(gè)文件的大小超過(guò)內(nèi)存緩沖區(qū),該文件將會(huì)臨時(shí)緩存在此目錄下diskFileItemFactory.setRepository(file);
5.設(shè)置單個(gè)文件大小限制,如果有某個(gè)文件超過(guò)此大小,將拋出FileUploadBase.FileSizeLimitExceededException:servletFileUpload.setFileSizeMax(1024*1024*10);
6.設(shè)置所有文件,也就是請(qǐng)求大小限制,如果文件總和超過(guò)此大小,將拋出FileUploadBase.SizeLimitExceededException:servletFileUpload.setSizeMax(1024*1024*20);
7.利用UUID生成偽隨機(jī)字符串作為文件名避免重復(fù):UUID.randomUUID().toString();
8.將文件寫(xiě)到硬盤上。寫(xiě)完之后,系統(tǒng)會(huì)自動(dòng)將放在臨時(shí)文件目錄的該文件刪除:fileItem.write(new File(path,fileName));
?
fileUpload用來(lái)上傳文件,主要任務(wù)解析request:
parseRequest(request)?
總結(jié)
以上是生活随笔為你收集整理的SpingMVC框架:fileUpload组件原理和实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2021-11-06深度学习
- 下一篇: C++ 类设计核查表