1. 程式人生 > >SpringMVC上傳檔案的三種方式

SpringMVC上傳檔案的三種方式

直接上程式碼吧,大夥一看便知

前臺:

<%@ 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>
</head>
<body>
<form name="serForm" action="/SpringMVC006/fileUpload" method="post"  enctype="multipart/form-data">
<h1>採用流的方式上傳檔案</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>
 
<form name="Form2" action="/SpringMVC006/fileUpload2" method="post"  enctype="multipart/form-data">
<h1>採用multipart提供的file.transfer方法上傳檔案</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>
 
<form name="Form2" action="/SpringMVC006/springUpload" method="post"  enctype="multipart/form-data">
<h1>使用spring mvc提供的類的方法上傳檔案</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>
</body>
</html>

配置:

<!-- 多部分檔案上傳 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
     <property name="maxUploadSize" value="104857600" />
     <property name="maxInMemorySize" value="4096" />
     <property name="defaultEncoding" value="UTF-8"></property>
</bean>

後臺:

方式一:

/*
     * 通過流的方式上傳檔案
     * @RequestParam("file") 將name=file控制元件得到的檔案封裝成CommonsMultipartFile 物件
     */
    @RequestMapping("fileUpload")
    public String  fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException {
         
         
        //用來檢測程式執行時間
        long  startTime=System.currentTimeMillis();
        System.out.println("fileName:"+file.getOriginalFilename());
         
        try {
            //獲取輸出流
            OutputStream os=new FileOutputStream("E:/"+new Date().getTime()+file.getOriginalFilename());
            //獲取輸入流 CommonsMultipartFile 中可以直接得到檔案的流
            InputStream is=file.getInputStream();
            int temp;
            //一個一個位元組的讀取並寫入
            while((temp=is.read())!=(-1))
            {
                os.write(temp);
            }
           os.flush();
           os.close();
           is.close();
         
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        long  endTime=System.currentTimeMillis();
        System.out.println("方法一的執行時間:"+String.valueOf(endTime-startTime)+"ms");
        return "/success"; 
    }

 方式二:

/*
     * 採用file.Transto 來儲存上傳的檔案
     */
    @RequestMapping("fileUpload2")
    public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file) throws IOException {
         long  startTime=System.currentTimeMillis();
        System.out.println("fileName:"+file.getOriginalFilename());
        String path="E:/"+new Date().getTime()+file.getOriginalFilename();
         
        File newFile=new File(path);
        //通過CommonsMultipartFile的方法直接寫檔案(注意這個時候)
        file.transferTo(newFile);
        long  endTime=System.currentTimeMillis();
        System.out.println("方法二的執行時間:"+String.valueOf(endTime-startTime)+"ms");
        return "/success"; 
    }

 方式三:

/*
     *採用spring提供的上傳檔案的方法
     */
    @RequestMapping("springUpload")
    public String  springUpload(HttpServletRequest request) throws IllegalStateException, IOException
    {
         long  startTime=System.currentTimeMillis();
         //將當前上下文初始化給  CommonsMutipartResolver (多部分解析器)
        CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
                request.getSession().getServletContext());
        //檢查form中是否有enctype="multipart/form-data"
        if(multipartResolver.isMultipart(request))
        {
            //將request變成多部分request
            MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
           //獲取multiRequest 中所有的檔名
            Iterator iter=multiRequest.getFileNames();
             
            while(iter.hasNext())
            {
                //一次遍歷所有檔案
                MultipartFile file=multiRequest.getFile(iter.next().toString());
                if(file!=null)
                {
                    String path="E:/springUpload"+file.getOriginalFilename();
                    //上傳
                    file.transferTo(new File(path));
                }
                 
            }
           
        }
        long  endTime=System.currentTimeMillis();
        System.out.println("方法三的執行時間:"+String.valueOf(endTime-startTime)+"ms");
    return "/success"; 
    }

我們看看測試上傳的時間:

第一次我用一個4M的檔案:

fileName:test.rar 方法一的執行時間:14712ms fileName:test.rar 方法二的執行時間:5ms 方法三的執行時間:4ms

第二次:我用一個50M的檔案 方式一進度很慢,估計得要個5分鐘

方法二的執行時間:67ms 方法三的執行時間:80ms

從測試結果我們可以看到:用springMVC自帶的上傳檔案的方法要快的多!

對於測試二的結果:可能是方法三得挨個搜尋,所以要慢點。不過一般情況下我們是方法三,因為他能提供給我們更多的方法