SpringMVC实现文件上传,直接上代码:
后台代码:
<code>01</code>
<code>@RequestMapping</code><code>(value =</code><code>"/uploadApk"</code><code>)</code>
<code>02</code>
<code>@ResponseBody</code>
<code>03</code>
<code>public</code> <code>Object uploadApk(</code>
<code>04</code>
<code> </code><code>@RequestParam</code><code>(value =</code><code>"apkFile"</code><code>) MultipartFile apkFile,</code>
<code>05</code>
<code> </code><code>HttpServletRequest request, HttpServletResponse response) {</code>
<code>06</code>
<code> </code><code>Map<String,Object> resMap =</code><code>new</code> <code>HashMap<String,Object>();</code>
<code>07</code>
<code> </code><code>if</code> <code>(apkFile !=</code><code>null</code><code>) {</code>
<code>08</code>
<code> </code><code>//获取保存的路径,</code>
<code>09</code>
<code> </code><code>String realPath = request.getSession().getServletContext()</code>
<code>10</code>
<code> </code><code>.getRealPath(</code><code>"/upload/apk"</code><code>);</code>
<code>11</code>
<code> </code><code>if</code> <code>(apkFile.isEmpty()) {</code>
<code>12</code>
<code> </code><code>// 未选择文件</code>
<code>13</code>
<code> </code><code>resMap.put(</code><code>"status"</code><code>, StatusConstants.STATUS_PARM_IS_EMPTY);</code>
<code>14</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code>15</code>
<code> </code><code>// 文件原名称</code>
<code>16</code>
<code> </code><code>String originFileName = apkFile.getOriginalFilename();</code>
<code>17</code>
<code> </code><code>try</code> <code>{</code>
<code>18</code>
<code> </code><code>//这里使用Apache的FileUtils方法来进行保存</code>
<code>19</code>
<code> </code><code>FileUtils.copyInputStreamToFile(apkFile.getInputStream(),</code>
<code>20</code>
<code> </code><code>new</code> <code>File(realPath, originFileName));</code>
<code>21</code>
<code> </code><code>resMap.put(</code><code>"status"</code><code>,StatusConstants.STATUS_OK);</code>
<code>22</code>
<code> </code><code>}</code><code>catch</code> <code>(IOException e) {</code>
<code>23</code>
<code> </code><code>System.out.println(</code><code>"文件上传失败"</code><code>);</code>
<code>24</code>
<code> </code><code>resMap.put(</code><code>"status"</code><code>, StatusConstants.STATUS_EXECPTION);</code>
<code>25</code>
<code> </code><code>e.printStackTrace();</code>
<code>26</code>
<code> </code><code>}</code>
<code>27</code>
<code> </code><code>}</code>
<code>28</code>
<code>29</code>
<code> </code><code>}</code>
<code>30</code>
<code> </code><code>return</code> <code>resMap;</code>
<code>31</code>
<code>}</code>
Spring配置文件中需要添加如下内容:
<code><!-- SpringMVC上传文件时,需配置MultipartResolver处理器 --></code>
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"multipartResolver"</code> <code>class</code><code>=</code><code>"org.springframework.web.multipart.commons.CommonsMultipartResolver"</code><code>></code>
<code> </code><code><!-- 指定所上传文件的总大小不能超过80M......注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 --></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"maxUploadSize"</code> <code>value</code><code>=</code><code>"80000000"</code><code>/></code>
<code></</code><code>bean</code><code>></code>
<code> </code>
<code><!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException --></code>
<code><!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 --></code>
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"exceptionResolver"</code> <code>class</code><code>=</code><code>"org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"</code><code>></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"exceptionMappings"</code><code>></code>
<code> </code><code><</code><code>props</code><code>></code>
<code> </code><code><!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 --></code>
<code> </code><code><</code><code>prop</code> <code>key</code><code>=</code><code>"org.springframework.web.multipart.MaxUploadSizeExceededException"</code><code>>error_fileupload</</code><code>prop</code><code>></code>
<code> </code><code></</code><code>props</code><code>></code>
<code> </code><code></</code><code>property</code><code>></code>
jsp页面内容(这里结合的EasyUi的一些内容):
<code>function</code> <code>ajaxFileUpload(){</code>
<code> </code><code>//获取软件更新详情</code>
<code> </code><code>var</code> <code>apkIntroduce = $(</code><code>"#apkInfo"</code><code>).val();</code>
<code> </code><code>//开始上传文件时显示一个图片,文件上传完成将图片隐藏</code>
<code> </code><code>//$("#loading").ajaxStart(function(){$(this).show();}).ajaxComplete(function(){$(this).hide();});</code>
<code> </code><code>//执行上传文件操作的函数,使用encodeURI方法,防止传输中文字符的时候出现乱码</code>
<code> </code><code>var</code> <code>uploadUrl = encodeURI(encodeURI(basePath +</code><code>"uploadApk.do?apkIntroduce="</code><code>+apkIntroduce));</code>
<code> </code><code>$.ajaxFileUpload({</code>
<code> </code><code>//处理文件上传操作的服务器端地址(可以传参数,已亲测可用)</code>
<code> </code><code>url:uploadUrl,</code>
<code>// url:basePath + "uploadApk.do?apkIntroduce="+apkIntroduce,</code>
<code> </code><code>secureuri:</code><code>false</code><code>, </code><code>//是否启用安全提交,默认为false</code>
<code> </code><code>fileElementId:</code><code>'apkFile'</code><code>, </code><code>//文件选择框的id属性</code>
<code> </code><code>dataType:</code><code>'text'</code><code>, </code><code>//服务器返回的格式,可以是json或xml等</code>
<code> </code><code>success:</code><code>function</code><code>(data, status){ </code><code>//服务器响应成功时的处理函数</code>
<code> </code><code>data = data.replace(</code><code>"<PRE>"</code><code>,</code><code>''</code><code>); </code><code>//ajaxFileUpload会对服务器响应回来的text内容加上<pre>text</pre>前后缀</code>
<code> </code><code>data = data.replace(</code><code>"</PRE>"</code><code>,</code><code>''</code><code>);</code>
<code> </code><code>data = data.replace(</code><code>"<pre>"</code><code>,</code><code>''</code><code>);</code>
<code> </code><code>data = data.replace(</code><code>"</pre>"</code><code>,</code><code>''</code><code>);</code><code>//本例中设定上传文件完毕后,服务端会返回给前台[0`filepath]</code>
<code> </code>
<code> </code><code>//将String字符串转换成json</code>
<code> </code><code>var</code> <code>dataset = $.parseJSON(data);</code>
<code> </code><code>if</code><code>(dataset.status ==</code><code>"ok"</code><code>){</code>
<code> </code><code>$(</code><code>'#result'</code><code>).html("Apk上传成功</code>
<code>");</code>
<code> </code><code>$.messager.alert(</code><code>"提示"</code><code>,</code><code>"上传成功"</code><code>);</code>
<code> </code>
<code> </code><code>//关闭添加窗口</code>
<code> </code><code>addApkWindow.window(</code><code>'close'</code><code>);</code>
<code> </code><code>//刷新页面</code>
<code> </code><code>datagrid.datagrid(</code><code>'reload'</code><code>);</code>
<code>32</code>
<code>33</code>
<code> </code><code>}</code><code>else</code> <code>if</code> <code>( dataset.status ==</code><code>"parm_is_empty"</code><code>){</code>
<code>34</code>
<code> </code><code>$(</code><code>'#result'</code><code>).html(</code><code>"没有选择APK!"</code><code>);</code>
<code>35</code>
<code> </code><code>}</code><code>else</code> <code>{</code>
<code>36</code>
<code> </code><code>$(</code><code>'#result'</code><code>).html(</code><code>'Apk上传失败,请重试!!'</code><code>);</code>
<code>37</code>
<code>38</code>
<code> </code><code>},</code>
<code>39</code>
<code> </code><code>error:</code><code>function</code><code>(data, status, e){</code><code>//服务器响应失败时的处理函数</code>
<code>40</code>
<code> </code><code>console.log(e);</code>
<code>41</code>
<code> </code><code>console.log(data);</code>
<code>42</code>
<code> </code><code>$(</code><code>'#result'</code><code>).html(</code><code>'APK上传失败,请重试!!'</code><code>);</code>
<code>43</code>
<code>44</code>
<code> </code><code>});</code>
<code>45</code>
Html页面代码:
<code> </code><code><</code><code>div</code> <code>id</code><code>=</code><code>"addApkWindows"</code><code>></code>
<code> </code>
<code> </code><code><</code><code>div</code> <code>id</code><code>=</code><code>"result"</code><code>></</code><code>div</code><code>></code>
<code> </code><code>软件更新详情:</code>
<code> </code><code><</code><code>textarea</code> <code>rows</code><code>=</code><code>"2"</code> <code>cols</code><code>=</code><code>"30"</code> <code>id</code><code>=</code><code>"apkInfo"</code><code>></</code><code>textarea</code><code>></code>
<code> </code>
<code>上传文件:</code>
<code> </code><code><</code><code>input</code> <code>type</code><code>=</code><code>"file"</code> <code>id</code><code>=</code><code>"apkFile"</code> <code>name</code><code>=</code><code>"apkFile"</code><code>/></code>
<code> </code><code><</code><code>input</code> <code>type</code><code>=</code><code>"button"</code> <code>value</code><code>=</code><code>"上传"</code> <code>onclick</code><code>=</code><code>"ajaxFileUpload()"</code><code>/></code>
<code> </code><code></</code><code>div</code><code>></code>
上面的JSP代码中,使用到了JS中的encodeURI方法,这个的目的是为了防止在传递中文参数时的乱码问题,当然,如果只传文件的话,则没有必要使用encodeURI