1. 程式人生 > 其它 >SpringMVC中的檔案上傳和下載

SpringMVC中的檔案上傳和下載

1.前端要求:

  前端表單要求:為了能上傳檔案,必須將表單的method設定為POST,並將enctype設定為multipart/form-data。只有在這樣的情況下,瀏覽器才會把使用者選擇的檔案以二進位制資料傳送給伺服器;

<form action="" enctype="multipart/form-data" method="post">
   <input type="file" name="file"/>
   <input type="submit">
</form>

2.後臺相關

  1.使用SpringMVC實現檔案的上傳,需要匯入maven依賴commons-fileupload

<!--檔案上傳-->
<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.3</version>
</dependency>
<!--servlet-api匯入高版本的-->
<dependency>
   <groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency>

  2.SpringMVC配置檔案 這個bena的id必須為:multipartResolver

<!--檔案上傳配置-->
<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <!--
請求的編碼格式,必須和jSP的pageEncoding屬性一致,以便正確讀取表單的內容,預設為ISO-8859-1 --> <property name="defaultEncoding" value="utf-8"/> <!-- 上傳檔案大小上限,單位為位元組(10485760=10M) --> <property name="maxUploadSize" value="10485760"/> <property name="maxInMemorySize" value="40960"/> </bean>

CommonsMultipartFile 的 常用方法:

  • String getOriginalFilename():獲取上傳檔案的原名

  • InputStream getInputStream():獲取檔案流

  • void transferTo(File dest):將上傳檔案儲存到一個目錄檔案中

  3.編寫controller層程式碼

    1.上傳檔案

package com.kuang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;

@Controller
public class FileController {
   //@RequestParam("file") 將name=file控制元件得到的檔案封裝成CommonsMultipartFile 物件
   //批量上傳CommonsMultipartFile則為陣列即可
   @RequestMapping("/upload")
   public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {

       //獲取檔名 : file.getOriginalFilename();
       String uploadFileName = file.getOriginalFilename();

       //如果檔名為空,直接回到首頁!
       if ("".equals(uploadFileName)){
           return "redirect:/index.jsp";
      }
       System.out.println("上傳檔名 : "+uploadFileName);

       //上傳路徑儲存設定
       String path = request.getServletContext().getRealPath("/upload");
       //如果路徑不存在,建立一個
       File realPath = new File(path);
       if (!realPath.exists()){
           realPath.mkdir();
      }
       System.out.println("上傳檔案儲存地址:"+realPath);

       InputStream is = file.getInputStream(); //檔案輸入流
       OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //檔案輸出流

       //讀取寫出
       int len=0;
       byte[] buffer = new byte[1024];
       while ((len=is.read(buffer))!=-1){
           os.write(buffer,0,len);
           os.flush();
      }
       os.close();
       is.close();
       return "redirect:/index.jsp";
  }
}

    2.採用file.Transto 來儲存上傳的檔案

@RequestMapping("/upload2")
public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {

    //上傳路徑儲存設定
    String path = request.getServletContext().getRealPath("/upload");
    File realPath = new File(path);
    if (!realPath.exists()){
        realPath.mkdir();
    }
    //上傳檔案地址
    System.out.println("上傳檔案儲存地址:"+realPath);

    //通過CommonsMultipartFile的方法直接寫檔案(注意這個時候)
    file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));

    return "redirect:/index.jsp";
}

    3.下載檔案

      檔案下載步驟:

      1、設定 response 響應頭

      2、讀取檔案 -- InputStream

      3、寫出檔案 -- OutputStream

      4、執行操作

      5、關閉流 (先開後關)

@RequestMapping(value="/download")
public String downloads(HttpServletResponse response ,HttpServletRequest request) throws Exception{
   //要下載的圖片地址
   String  path = request.getServletContext().getRealPath("/upload");
   String  fileName = "基礎語法.jpg";

   //1、設定response 響應頭
   response.reset(); //設定頁面不快取,清空buffer
   response.setCharacterEncoding("UTF-8"); //字元編碼
   response.setContentType("multipart/form-data"); //二進位制傳輸資料
   //設定響應頭
   response.setHeader("Content-Disposition",
           "attachment;fileName="+URLEncoder.encode(fileName, "UTF-8"));

   File file = new File(path,fileName);
   //2、 讀取檔案--輸入流
   InputStream input=new FileInputStream(file);
   //3、 寫出檔案--輸出流
   OutputStream out = response.getOutputStream();

   byte[] buff =new byte[1024];
   int index=0;
   //4、執行 寫出操作
   while((index= input.read(buff))!= -1){
       out.write(buff, 0, index);
       out.flush();
  }
   out.close();
   input.close();
   return null;
}