我是基於red5服務器。來用springMVC框架做文件上傳。在上傳文件時遇到錯誤。
@RequestMapping(value = "/upload.do",method = RequestMethod.POST)
public String upload(HttpServletRequest request,
HttpServletResponse response, String string) {
System.out.println("==================run in import");
System.out.println("--------------" + request.getParameter("upload"));
// 創建一個通用的多部分解析器.
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
// 設置編碼
commonsMultipartResolver.setDefaultEncoding("utf-8");
System.out.println("++++++commonsMultipartResolver.isMultipart(request) : " + commonsMultipartResolver.isMultipart(request));
// 判斷是否有文件上傳
if (commonsMultipartResolver.isMultipart(request)) {
MultipartHttpServletRequest multipartRequest = commonsMultipartResolver
.resolveMultipart(request);
Iterator<String> iter = multipartRequest.getFileNames();
System.out.println("+++++++++++iter = "+iter.toString());
// iter裡面沒有值
while (iter.hasNext()) {
MultipartFile file = multipartRequest.getFile((String) iter.next());
if (file != null) {
File localFile = new File("/WEB-INF/upload"
+ file.getOriginalFilename());
try {
// file.transferTo(localFile);
System.out.println("=======1111111111111====");
file.transferTo(localFile);
System.out.println("====222222222222222=======");
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 批量上傳
// Map<String, MultipartFile> fileMap = request.getFileMap();
// for(Entry<String, MultipartFile> entry : fileMap.entrySet()){
// MultipartFile file = entry.getValue();
// try {
// file.transferTo(new File("/WEB-INF/upload" +
// file.getOriginalFilename()));
// } catch(IllegalStateException e){
// e.printStackTrace();
// }catch (Exception e) {
// // TODO: handle exception
// e.printStackTrace();
// }
// }
return "up";
}
}
上傳文件後,在我指定的地方沒有找到文件。測試發現
if (commonsMultipartResolver.isMultipart(request)) 這個地方獲得的是false,我這個action沒有接收到上傳的文件,但是通過System.out.println("--------------" + request.getParameter("upload"));獲取到了我上傳文件的文件名。
通過上網查找,我在配置文件中配置了MultipartResolver處理器
<!-- SpringMVC上傳文件時,需要配置MultipartResolver處理器 -->
<!-- 指定所上傳文件的總大小不能超過200KB。注意maxUploadSize屬性的限制不是針對單個文件,而是所有文件的容量之和 -->
<!-- SpringMVC在超出上傳文件限制時,會拋出org.springframework.web.multipart.MaxUploadSizeExceededException -->
<!-- 該異常是SpringMVC在檢查上傳的文件信息時拋出來的,而且此時還沒有進入到Controller方法中 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 遇到MaxUploadSizeExceededException異常時,自動跳轉到/WEB-INF/jsp/error_fileupload.jsp頁面 -->
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop>
</props>
</property>
</bean>
如果我在代碼最上面寫
MultipartHttpServletRequest rrr = (MultipartHttpServletRequest) request;
他就會報轉化錯誤
java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest
不知道現在是什麼問題,求解啊!
SpringMVC裡面有個專門處理文件上傳的請求參數(好像叫MultilePart什麼),但是到達upload函數時,Spring自身已經吧臨時文件儲存到本地了,所以文件比較大就悲劇了,需要拷貝一次。 文件較大時,建議直接用Servlet處理,可以參考Stream 上傳插件: http://www.twinkling.cn/