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

ssm框架下的SpringMVC上傳檔案的三種方式

commonsmultipartresolver 的原始碼,可以研究一下 點我
前端程式碼:

<%@ 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">
    <!-- 上傳圖片最大大小100M(5M  5242440)-->   
     <property name="maxUploadSize" value="104857600" />
     <property name="maxInMemorySize" value="4096" />
      <!-- 設定預設編碼 -->  
     <property name="defaultEncoding" value="UTF-8"></property>
</bean>

pom新增依賴:

    <!-- 檔案上傳 -->  
        <dependency>  
            <groupId>commons-fileupload</groupId>  
            <artifactId>commons-fileupload</artifactId>  
            <version>1.3</version>  
        </dependency> 

後臺程式碼:

方式一:

/*
     * 通過流的方式上傳檔案
     * @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
方法二的執行時間:5ms
方法三的執行時間:4ms

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

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

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

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

附檔案:

package com.datebook.web;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;

import com.datebook.common.JsonResult;
import com.datebook.common.ResultCode;

@RestController
@RequestMapping("/file")
public class FileController {
    // 上傳新的影象,刪除原來的影象
    /* UserInfoBean item = userService.loadUserInfoByUid(tmpuser.getUid());
     * File df = new File(rootPath + item.getImgpath());
    if (df.exists()) {
        df.delete();
    }*/

     /**
      * 單檔案上傳
    */
    @RequestMapping("/oneFileUpload")
    public JsonResult singleFileUpload(@RequestParam("file1")MultipartFile file1,HttpServletRequest request) throws Exception, IOException {
        String filePath = request.getServletContext().getRealPath("upload");
        String filename = file1.getOriginalFilename();
        System.out.println("----------------------"+filePath+"------------------------");
        File targetFile = new File(filePath,filename);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }
        // 儲存
        try {
            file1.transferTo(targetFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //檔案路徑
        String fullPath = targetFile.getPath();
        String path = "upload/" + filename;
        Map<String, Object> map = new HashMap<>();
        map.put("filePath", path);
        map.put("fullPath", fullPath);
        return new JsonResult(ResultCode.SUCCESS,"success",map);
    }
     /**
      * 多檔案上傳
   */
    @RequestMapping("/multipleFileUpload")
    public JsonResult multipleFileUpload(@RequestParam("files")MultipartFile[] files,HttpServletRequest request) throws Exception, IOException {
        String filePath = request.getServletContext().getRealPath("upload");
        System.out.println("----------------------"+filePath+"------------------------");
        List<String> path =  new ArrayList<>();
        List<String> fullPath =  new ArrayList<>();
        for(MultipartFile file:files){
            String filename = file.getOriginalFilename();
            File targetFile = new File(filePath,filename);
             if (!targetFile.exists()) {
                    targetFile.mkdirs();
                }
            // 儲存
            try {
                file.transferTo(targetFile);
            } catch (Exception e) {
                e.printStackTrace();
            } 
            /* String path1 = "upload/" + filename;
             String path2 = targetFile.getPath();*/
             path.add("upload/" + filename);
             fullPath.add(targetFile.getPath());
        }
        Map<String, Object> map = new HashMap<>();
        map.put("filePath", path);
        map.put("fullPath", fullPath);
        return new JsonResult(ResultCode.SUCCESS,"success",map);
    }
     /**
      * 流上傳
   */
    @RequestMapping(value = "requestFile", method = RequestMethod.POST)
    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {   
        // 轉型為MultipartHttpRequest:   
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   
        // 獲得檔案:   
        MultipartFile file = multipartRequest.getFile("file");   
        // 獲得檔名:   
        String filename = file.getOriginalFilename();   
        // 獲得輸入流:   
        InputStream input = file.getInputStream();   
        // 寫入檔案     
        file.transferTo(new File("E://"+filename));
        System.out.println(filename);
        return null;
    }  
    @RequestMapping("/fileDownload1")
    public ResponseEntity<byte[]> filedDownload1() throws IOException {
        //下載檔案路徑
        String path="E:\\xiaomao.jpg";  
        File file=new File(path);  
        HttpHeaders headers = new HttpHeaders(); 
        //下載顯示的檔名,解決中文名稱亂碼問題 
        String fileName=new String("小貓.jpg".getBytes("UTF-8"),"iso-8859-1");
        //通知瀏覽器以attachment(下載方式)開啟圖片
        headers.setContentDispositionFormData("attachment", fileName); 
        //application/octet-stream : 二進位制流資料(最常見的檔案下載)
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);   
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);    
    }

    @RequestMapping("/fileDownload2")
    public void fileDownload2(HttpServletRequest request,HttpServletResponse response) throws Exception{  
        //模擬檔案,xiaomao.jpg為需要下載的檔案  
        String fileName = request.getSession().getServletContext().getRealPath("upload")+"/xiaomao.jpg";  
        //獲取輸入流  
        InputStream bis = new BufferedInputStream(new FileInputStream(new File(fileName)));  
        //假如以中文名下載的話  
        String filename = "xiaomao.jpg";  
        //轉碼,免得檔名中文亂碼  
        filename = URLEncoder.encode(filename,"UTF-8");  
        //設定檔案下載頭  
        response.addHeader("Content-Disposition", "attachment;filename=" + filename);    
        //1.設定檔案ContentType型別,這樣設定,會自動判斷下載檔案型別    
        response.setContentType("multipart/form-data");   
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());  
        int len = 0;  
        while((len = bis.read()) != -1){  
            out.write(len);  
            out.flush();  
        }  
        out.close();  
    }  
}  

相關推薦

ssm 框架文件功能

quest let mail body ring upload gem 擴展 stream 這兩天在弄上傳文件(圖片或視頻)的功能 ,特記錄於此,其核心是字符串的拼接路徑。要求是:服務器上(Tomcat為例)保存上傳的圖片或視頻,數據庫中插入相對路徑。數據庫中的A表設置一個

python檔案方式

def upload(request): return render(request, 'upload.html') def upload_file(request): username = request.POST.get('username') fafafa

ssm框架SpringMVC檔案方式

commonsmultipartresolver 的原始碼,可以研究一下 點我 前端程式碼: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncodin

SpringMVC檔案方法

直接上程式碼吧,大夥一看便知 這時:commonsmultipartresolver 的原始碼,可以研究一下 http://www.verysource.com/code/2337329_1/commonsmultipartresolver.java.html 前臺:

SpringMVC檔案方式

直接上程式碼吧,大夥一看便知 前臺: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html

springMVC檔案,MultipartHttpServletRequest、MultipartFile進行檔案

這裡使用apache的開源jar包完成上傳功能,使用jar包分別是:common-fileupload.jar和common-io.jar  先編寫上傳檔案幫助類,如果需要區分檔案型別,可以將檔案字尾擷取進行判斷; springmvc-mvc.xml配置,這裡主要配置spri

springmvc 檔案的時候.The request sent by the client was syntactically incorrect

 出現這個問題的原因,下面這篇文章已經講得很清楚的。 http://blog.csdn.net/kunkun378263/article/details/41863101 我遇到的場景是:MultipartFile上傳檔案,提交表單的時候除了上傳檔案還有幾個數字。我們知

springboot/springmvc檔案(CommonsMultipartResolver)

上一篇博文講到了(Servlet3.0支援)的檔案上傳:https://blog.csdn.net/frozenpower/article/details/81141297 這篇我們來看可配置的檔案上傳解析器CommonsMultipartResolver CommonsMultipartR

在windows如何檔案到linux

和把大象放進冰箱需要的步數一樣:) 1.工具和材料 xshell 上傳檔案的壓縮包(我使用的是壓縮包,其它型別沒試過) 2.使用命令 用xshell連線linux 在xshell中輸入 rz 命令,彈出一個對話方塊,選擇上傳檔案

SpringMVC檔案(圖片)並儲存到本地

SpringMVC上傳檔案(圖片)並儲存到本地 小記一波~ 基本的MVC配置就不展示了,這裡給出核心程式碼 在spring-mvc的配置檔案中寫入如下配置 <bean id="multipartResolver" class="org.springframewor

Springmvc檔案

SpringMVC上傳檔案 <!-- 頁面檔案上傳三要素 --> <form action="/uploadFile.do" method="post" enctype="multipart/form-data"> <input

利用SpringMVC檔案的Demo

前言: 檔案的上傳功能也在網站中發揮著不可替代的作用,這裡我就來講講簡單利用SpringMVC實現檔案的上傳。 這裡我的配置是這樣的: idea+maven+tomcat9+jdk8 我也將該專案的D

SpringMVC檔案出現400 Bad Request錯誤

1.起因 寫了上傳檔案程式碼,用postman測試一下報400 Dad Request。 2.原因 看了下資料瞭解到使用SpringMVC上傳檔案需要在form表單中新增enctype="mult

記錄一個解決了一個晚上加一個白天的問題,關於springMVC檔案的功能

在做檔案上傳功能,用到了springMVC的這個類 import org.springframework.web.multipart.MultipartFile; 但是不管前臺怎麼傳檔案的值都過不去,查了下需要在wen.xml 建立bean <bean

springmvc檔案出現400錯誤

1.程式碼如下:在上傳的時候出現400錯誤。 public AjaxJson saveSchoolProfile( SchoolProfileBean schoolProfileBean, @RequestParam(required = false) MultipartFile logo, @

springboot框架下載

專案接觸到新的框架技術:springboot+angularjs+bootstrap 其中稍微有點難度的就屬於上傳下載了 1,上傳檔案 前端樣式如上所示,點選"匯入模板檔案",瀏覽選擇檔案,點選“匯入”則上傳檔案資訊到伺服器,當上傳成功後,在右側顯示檔名,並且提供下載功

檔案時報如下錯誤springmvc檔案報錯org.springframework.beans.BeanInstantiationException

在用springmvc+mybatis進行專案開發時,上傳檔案拋異常.. org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web

ssm框架實現圖片並顯示(myeclips)

ssm框架實現圖片上傳並顯示 第一步:匯入common-io以及common-fileupload兩個jar包,儘量新一點,老的有可能出錯 第二步:配置圖片上傳儲存的位置,針對myeclips來說,開啟檔案D:\Java\MyEclipse.metadata.me_tcat\co

Error creating bean with name 'multipartResolver' SpringMVC 檔案異常

HTTP Status 500 - Servlet.init() for servlet springmvc threw exception type Exception report message Servlet.init() for servlet springmvc threw exce

Pythonftp檔案linux伺服器

模組介紹: 1 from ftplib import FTP 2 ftp = FTP() #設定變數 3 ftp.set_debuglevel(2) #開啟除錯級別2 顯示詳細資訊 4 ftp.connect("IP", "port") #連線ftp, IP和埠