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