天天看点

SpringMVC实现ajax文件上传

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&lt;String,Object&gt; resMap =</code><code>new</code> <code>HashMap&lt;String,Object&gt;();</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>&lt;!-- SpringMVC上传文件时,需配置MultipartResolver处理器 --&gt;</code>

<code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;!-- 指定所上传文件的总大小不能超过80M......注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 --&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"maxUploadSize"</code> <code>value</code><code>=</code><code>"80000000"</code><code>/&gt;</code>

<code>&lt;/</code><code>bean</code><code>&gt;</code>

<code> </code> 

<code>&lt;!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException --&gt;</code>

<code>&lt;!-- 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 --&gt;</code>

<code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"exceptionMappings"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>props</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 --&gt;</code>

<code>            </code><code>&lt;</code><code>prop</code> <code>key</code><code>=</code><code>"org.springframework.web.multipart.MaxUploadSizeExceededException"</code><code>&gt;error_fileupload&lt;/</code><code>prop</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>props</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>property</code><code>&gt;</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>"&lt;PRE&gt;"</code><code>,</code><code>''</code><code>); </code><code>//ajaxFileUpload会对服务器响应回来的text内容加上&lt;pre&gt;text&lt;/pre&gt;前后缀</code>

<code>            </code><code>data = data.replace(</code><code>"&lt;/PRE&gt;"</code><code>,</code><code>''</code><code>);</code>

<code>            </code><code>data = data.replace(</code><code>"&lt;pre&gt;"</code><code>,</code><code>''</code><code>);</code>

<code>            </code><code>data = data.replace(</code><code>"&lt;/pre&gt;"</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>&lt;</code><code>div</code> <code>id</code><code>=</code><code>"addApkWindows"</code><code>&gt;</code>

<code>    </code> 

<code>        </code><code>&lt;</code><code>div</code> <code>id</code><code>=</code><code>"result"</code><code>&gt;&lt;/</code><code>div</code><code>&gt;</code>

<code>        </code><code>软件更新详情:</code>

<code>        </code><code>&lt;</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>&gt;&lt;/</code><code>textarea</code><code>&gt;</code>

<code>        </code> 

<code>上传文件:</code>

<code>        </code><code>&lt;</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>/&gt;</code>

<code>        </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;/</code><code>div</code><code>&gt;</code>

上面的JSP代码中,使用到了JS中的encodeURI方法,这个的目的是为了防止在传递中文参数时的乱码问题,当然,如果只传文件的话,则没有必要使用encodeURI