SpringMVC實現文件上傳,直接上代碼:
后台代碼:
01 |
@RequestMapping (value = "/uploadApk" ) |
02 |
@ResponseBody |
03 |
public Object uploadApk( |
04 |
@RequestParam (value = "apkFile" ) MultipartFile apkFile, |
05 |
HttpServletRequest request, HttpServletResponse response) { |
06 |
Map<String,Object> resMap = new HashMap<String,Object>(); |
07 |
if (apkFile != null ) { |
08 |
//獲取保存的路徑, |
09 |
String realPath = request.getSession().getServletContext() |
10 |
.getRealPath( "/upload/apk" ); |
11 |
if (apkFile.isEmpty()) { |
12 |
// 未選擇文件 |
13 |
resMap.put( "status" , StatusConstants.STATUS_PARM_IS_EMPTY); |
14 |
} else { |
15 |
// 文件原名稱 |
16 |
String originFileName = apkFile.getOriginalFilename(); |
17 |
try { |
18 |
//這里使用Apache的FileUtils方法來進行保存 |
19 |
FileUtils.copyInputStreamToFile(apkFile.getInputStream(), |
20 |
new File(realPath, originFileName)); |
21 |
resMap.put( "status" ,StatusConstants.STATUS_OK); |
22 |
} catch (IOException e) { |
23 |
System.out.println( "文件上傳失敗" ); |
24 |
resMap.put( "status" , StatusConstants.STATUS_EXECPTION); |
25 |
e.printStackTrace(); |
26 |
} |
27 |
} |
28 |
29 |
} |
30 |
return resMap; |
31 |
} |
Spring配置文件中需要添加如下內容:
01 |
<!-- SpringMVC上傳文件時,需配置MultipartResolver處理器 --> |
02 |
< bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" > |
03 |
<!-- 指定所上傳文件的總大小不能超過80M......注意maxUploadSize屬性的限制不是針對單個文件,而是所有文件的容量之和 --> |
04 |
< property name = "maxUploadSize" value = "80000000" /> |
05 |
</ bean > |
06 |
|
07 |
<!-- SpringMVC在超出上傳文件限制時,會拋出org.springframework.web.multipart.MaxUploadSizeExceededException --> |
08 |
<!-- 該異常是SpringMVC在檢查上傳的文件信息時拋出來的,而且此時還沒有進入到Controller方法中 --> |
09 |
< bean id = "exceptionResolver" class = "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" > |
10 |
< property name = "exceptionMappings" > |
11 |
< props > |
12 |
<!-- 遇到MaxUploadSizeExceededException異常時,自動跳轉到/WEB-INF/jsp/error_fileupload.jsp頁面 --> |
13 |
< prop key = "org.springframework.web.multipart.MaxUploadSizeExceededException" >error_fileupload</ prop > |
14 |
</ props > |
15 |
</ property > |
16 |
</ bean > |
jsp頁面內容(這里結合的EasyUi的一些內容):
01 |
function ajaxFileUpload(){ |
02 |
//獲取軟件更新詳情 |
03 |
var apkIntroduce = $( "#apkInfo" ).val(); |
04 |
//開始上傳文件時顯示一個圖片,文件上傳完成將圖片隱藏 |
05 |
//$("#loading").ajaxStart(function(){$(this).show();}).ajaxComplete(function(){$(this).hide();}); |
06 |
//執行上傳文件操作的函數,使用encodeURI方法,防止傳輸中文字符的時候出現亂碼 |
07 |
var uploadUrl = encodeURI(encodeURI(basePath + "uploadApk.do?apkIntroduce=" +apkIntroduce)); |
08 |
$.ajaxFileUpload({ |
09 |
//處理文件上傳操作的服務器端地址(可以傳參數,已親測可用) |
10 |
url:uploadUrl, |
11 |
// url:basePath + "uploadApk.do?apkIntroduce="+apkIntroduce, |
12 |
secureuri: false , //是否啟用安全提交,默認為false |
13 |
fileElementId: 'apkFile' , //文件選擇框的id屬性 |
14 |
dataType: 'text' , //服務器返回的格式,可以是json或xml等 |
15 |
success: function (data, status){ //服務器響應成功時的處理函數 |
16 |
data = data.replace( "<PRE>" , '' ); //ajaxFileUpload會對服務器響應回來的text內容加上<pre>text</pre>前后綴 |
17 |
data = data.replace( "</PRE>" , '' ); |
18 |
data = data.replace( "<pre>" , '' ); |
19 |
data = data.replace( "</pre>" , '' ); //本例中設定上傳文件完畢后,服務端會返回給前台[0`filepath] |
20 |
|
21 |
//將String字符串轉換成json |
22 |
var dataset = $.parseJSON(data); |
23 |
if (dataset.status == "ok" ){ |
24 |
$( '#result' ).html("Apk上傳成功 |
25 |
"); |
26 |
$.messager.alert( "提示" , "上傳成功" ); |
27 |
|
28 |
//關閉添加窗口 |
29 |
addApkWindow.window( 'close' ); |
30 |
//刷新頁面 |
31 |
datagrid.datagrid( 'reload' ); |
32 |
|
33 |
} else if ( dataset.status == "parm_is_empty" ){ |
34 |
$( '#result' ).html( "沒有選擇APK!" ); |
35 |
} else { |
36 |
$( '#result' ).html( 'Apk上傳失敗,請重試!!' ); |
37 |
} |
38 |
}, |
39 |
error: function (data, status, e){ //服務器響應失敗時的處理函數 |
40 |
console.log(e); |
41 |
console.log(data); |
42 |
$( '#result' ).html( 'APK上傳失敗,請重試!!' ); |
43 |
} |
44 |
}); |
45 |
} |
Html頁面代碼:
01 |
< div id = "addApkWindows" > |
02 |
|
04 |
< div id = "result" ></ div > |
05 |
<!-- <img id="uploadImage" src="http://www.firefox.com.cn/favicon.ico"> --> |
06 |
軟件更新詳情: |
07 |
08 |
< textarea rows = "2" cols = "30" id = "apkInfo" ></ textarea > |
09 |
|
10 |
上傳文件: |
11 |
12 |
< input type = "file" id = "apkFile" name = "apkFile" /> |
13 |
14 |
< input type = "button" value = "上傳" onclick = "ajaxFileUpload()" /> |
15 |
16 |
</ div > |
上面的JSP代碼中,使用到了JS中的encodeURI方法,這個的目的是為了防止在傳遞中文參數時的亂碼問題,當然,如果只傳文件的話,則沒有必要使用encodeURI