spring mvc的文件上傳之優化

我看了下很多樓主的文章,各有各的特色,但我覺得都不是我所想要的,所以我就自己寫了個較完整的demo


我通過ajax+springmvc實現的文件上傳 ajax的技術並沒有使用自身攜帶的AjaxFileUpload(個人覺得代碼量太多)


用ajax實現,網頁裏的很多表單數據也想獲得怎麼辦呢 我是這樣實現的:

先看我的xxx.jsp頁面的實現代碼:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script src="<%=request.getContextPath()%>/js/jquery-3.0.0.min.js" type="text/javascript"></script>
<script type="text/javascript">
function Upload(){
var img=$("#myBlogImage").val();
//判斷文件是否爲空 我這裏是圖片的上傳 做了個文件後綴篩選 如果是文件相關的上傳,把篩選去掉即可,文件大小,後綴的判斷最好    //在前臺判斷,這樣可減少服務器的壓力
if(img==""){alert("請選擇文件內容!");return }
//判斷文件後綴
var start=img.lastIndexOf(".");
        var end=img.substring(start+1,img.length).toUpperCase();
    if(!(end=='JPG'||end=='GIF'||end=='PNG'||end=='BMP')){  
        alert('上傳圖片格式僅限於.jpg .gif .png .bmp');  
    return;  
}

     //封裝form標籤裏的相關數據 傳給後臺 這樣form裏所有的表單數據 後臺也能獲取得到
     var forData=new FormData($("#uploadForm")[0]);

    //通過ajax實現文件上傳 async:是否同步請求 ,cache:是否緩存此頁面,contentType發送信息至服務器時內容編     //碼類型。默認值適 合大多數情況,processData:通過data選項傳遞進來的數據類型選擇;想了解更多,去看看    //$ajax()參數的相關講解;
     $.ajax({
              url:'upload/toUpload.do',
              type:'POST',
              data:forData,
              async:false,
              cache:false,
              contentType:false,
              processData:false,
              success:function(datas){
                 alert(datas);
               },
               error:function(datas){
                  alert("上傳失敗");
               }     
        });
}
</script>
</head>
<body>
 <div align="center">
  <form id="uploadForm">
    <p>資源名稱:<input type="text" name="name"></p>
    <p>選擇文件<input type="file" id="myBlogImage" name="myfiles"/></p>
    <input type="button" value="上傳" οnclick="Upload()"/>
  </form>
 </div>
</body>
</html>

以上便是jsp裏代碼相關的設計

接下來便是controller裏的設計編碼啦(配置最後講解)裏面的相關注解我就不解釋啦 會的,都應該知道什麼意思

package com.azj.controllers;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
@Controller
@RequestMapping("/upload")
public class uploadController {
@RequestMapping(value="/toUpload",method = RequestMethod.POST)
public void doUpload(@RequestParam("name")String name,HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{

                //傳統的都是通過io流來實現文件的上傳,效率肯定是極低的!這裏我們是通過springmvc自己及封裝的文件                //上傳方法;效率,比較快;感興趣的可以測試下,大文件的上傳速度,比較下;

               //獲取前端表單屬性name傳來的數據  並設計文件發存放位置
File fs=new File("D:/"+name);
               if(!fs.exists())fs.mkdir();
//解析前端傳過來的上下文
CommonsMultipartResolver cmr=new CommonsMultipartResolver(request.getSession().getServletContext());
//判斷是傳過來的上下文是否包含文件內容 如果有 執行文件處理及相關上傳的操作
try{
if(cmr.isMultipart(request)){
//request強制轉換爲spring mvc自身攜帶的MultipartHttpServletRequest 文件處理
MultipartHttpServletRequest mr=(MultipartHttpServletRequest) request;
//迭代包含的文件
Iterator<String> iter=mr.getFileNames();
//獲取文件
while(iter.hasNext()){
MultipartFile file = mr.getFile((String)iter.next());
if(file!=null){
String filename="demo"+file.getOriginalFilename();
String path="D:/"+name+"/"+filename;
File f=new File(path);
//傳文件
file.transferTo(f);
response.getWriter().println("上傳成功");
}
}
}}catch (Exception e) {
response.getWriter().println("上傳失敗");
}


}
}

以上便是controller裏的代碼內容

現在說下相關配置

web.xml的內容如下:


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>spring-mvc</display-name>


   <!-- 配置springMVC啓動DispatcherServlete入口 --> 
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:config/applicationContext-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>


接下來是spring mvc的配置內容:

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:context="http://www.springframework.org/schema/context"    
    xmlns:mvc="http://www.springframework.org/schema/mvc"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   
    http://www.springframework.org/schema/tx   
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd  
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-3.2.xsd  
    http://www.springframework.org/schema/mvc  
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">  
  
    <!-- 自動掃描的包名   這裏是你請求的controller類 我用的通配符代替-->  
     <context:component-scan base-package="com.**.controllers"/>
  
    <!-- 默認的註解映射的支持,自動註冊DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->  
    <mvc:annotation-driven />  
  
    <!-- 視圖解釋類 -->  
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
        <property name="prefix" value="/"/>  
        <property name="suffix" value=".jsp"/>  
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
    </bean>
    
    <!-- SpringMVC上傳文件時,需配置MultipartResolver處理器   這個判斷最好能在前端加個插件進行判斷,減少服務器的壓力-->  
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- 指定所上傳文件的總大小不能超過10485760000......注意maxUploadSize屬性的限制不是針對單個文件,而是所有文件的容量之和 -->  
          <property name="defaultEncoding" value="utf-8" />  
          <property name="maxUploadSize" value="10485760000" />  
          <property name="maxInMemorySize" value="40960" />  
    </bean>
   
</beans>

以上面試springmvc上傳的代碼編碼設計!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章