Spring——註解上傳檔案.@RequestParam(value = "file1", required = false) ;__java註解方法

來源:互聯網
上載者:User

Spring支援web應用中的分段檔案上傳。這種支援是由隨插即用的MultipartResolver來實現。

 

在Spring2.0時,Spring提供了兩種現成的MultipartResolver

1.Commons FileUpload(http://jakarta.apache.org/commons/fileupload)

2. COS FileUpload(http://www.servlets.com/cos)

 

不過在spring2.5以後,則只支援Commons FileUpload了。

 

那麼,在spring2.5基於註解的MVC中如何使用MultipartResolver呢,

下面通過一個例子來說明如何使用CommonsMultipartResolver執行附件上傳。

 

首先我們來構建一個web工程,工程結構如下圖所示:

 

 

 

關於springMVC的配置這裡不再詳述,讀者可以參看以前的文章。

這裡我們只需要在spring-servlet.xml中加入如下內容,用以通知spring負載檔案上傳處理器:

<!-- 定義檔案上傳處理器 -->
 <bean id="multipartResolver"
  class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
  p:defaultEncoding="UTF-8" />

 

 

當配置了這個處理器後,spring會對使用者請求進行攔截,判斷是否為附件上傳類型,既enctype="multipart/form-data",如果是,則會對請求流進行處理,將其轉換為DefaultMultipartHttpServletRequest對象,該對象封裝了附件內容,例如:

 

//取得附件名稱列表

Iterator iterator = multipartRequest.getFileNames();

while(iterator.hasNext()){

//迴圈取出每一個附件 MultipartFile multifile = multipartRequest.getFile((String)iterator.next()); System.out.println(multifile.getOriginalFilename()); }

 

 

來看一個例子:

在頁面中有兩個上傳文字框,如下:

<form action="<%=request.getContextPath() %>/demo/upload.do" enctype="multipart/form-data" method="post">

 file1:<input type="file" name="file1" id="file1" />

<br></br>

 file2:<input type="file" name="file2" id="file2" />

 <br></br>

<button type="submit">submit</button>

 </form>

 

 

注意,這裡一定要將form的enctype屬性設定為multipart/form-data,否則不能實現附件上傳。

 

當選擇要上傳的檔案後,點擊submit按鈕,controller處理方法如下:

 

@RequestMapping(value = "/demo/upload.do")
 public String handleImport(
   @RequestParam(value = "file1", required = false) MultipartFile file1,
   @RequestParam(value = "file2", required = false) MultipartFile file2,
   Model model) throws IOException {
  List<FileModel> list = new ArrayList<FileModel>();
  if (file1 != null&&StringUtils.hasText(file1.getOriginalFilename())) {
   System.out.println(file1.getOriginalFilename());

   FileModel fileModel1 = new FileModel();
   fileModel1.setName(file1.getOriginalFilename());
   fileModel1.setSize(file1.getSize());
   String path = service.saveFileToServer(file1, ASVE_PATH);
   fileModel1.setPath(path);
   list.add(fileModel1);
  }
  if (file2 != null&&StringUtils.hasText(file2.getOriginalFilename())) {
   System.out.println(file2.getOriginalFilename());

   FileModel fileModel2 = new FileModel();
   fileModel2.setName(file2.getOriginalFilename());
   fileModel2.setSize(file2.getSize());
   String path = service.saveFileToServer(file1, ASVE_PATH);
   fileModel2.setPath(path);
   list.add(fileModel2);

  }
  model.addAttribute("list", list);
  return "demo/list";

 }

 

 說明:

1.@RequestParam(value = "file1", required = false) :將參數中的file1綁定到MultipartFile file1,此時CommonsMultipartResolver已經幫我們把附件內容填充到MultipartFile 中了,這裡required = false最好設定為false,除非你確定這個參數一定會傳遞給controller,否則會拋出參數綁定異常。

2.ASVE_PATH:一個常量,檔案儲存的路徑

3.service.saveFileToServer():該方法將上傳檔案儲存到指定路徑。

4.getOriginalFilename():檔案名稱

5.getSize():檔案大小

 

這裡說一下saveFileToServer(),該方法將附件儲存到指定路徑,並返回儲存後的檔案全路徑:

 

public String saveFileToServer(MultipartFile multifile, String path)
   throws IOException {
  // 建立目錄
  File dir = new File(path);
  if (!dir.exists()) {
   dir.mkdir();
  }
  // 讀取檔案流並保持在指定路徑
  InputStream inputStream = multifile.getInputStream();
  OutputStream outputStream = new FileOutputStream(path
    + multifile.getOriginalFilename());
  byte[] buffer = multifile.getBytes();
  int bytesum = 0;
  int byteread = 0;
  while ((byteread = inputStream.read(buffer)) != -1) {
   bytesum += byteread;
   outputStream.write(buffer, 0, byteread);
   outputStream.flush();
  }
  outputStream.close();
  inputStream.close();

  return path + multifile.getOriginalFilename();
 } 

 

ok,怎麼樣,spring處理附件上傳很簡單吧。

 

這裡討論這樣一種情況,如果我實現不知道我要上傳多少個附件,也不到對應的參數名稱,比如使用FancyUpload這樣的多附件上傳組件,這又該如何處理呢。

 

其實很簡單,只需要在處理器的方法中加入DefaultMultipartHttpServletRequest multipartRequest參數即可,還拿上面那個頁面舉例,controller的處理方法如下:

 

 

@RequestMapping(value = "/demo/uploadMulti.do")
 public String handleImport(Model model,
   DefaultMultipartHttpServletRequest multipartRequest) throws IOException {

  List<FileModel> list = new ArrayList<FileModel>();
  if (multipartRequest != null) {
   Iterator iterator = multipartRequest.getFileNames();

   while (iterator.hasNext()) {
    MultipartFile multifile =
    multipartRequest.getFile((String) iterator.next());
  
    if (StringUtils.hasText(multifile.getOriginalFilename())) {
     System.out.println(multifile.getOriginalFilename());
     FileModel fileModel = new FileModel();
     fileModel.setName(multifile.getOriginalFilename());
     fileModel.setSize(multifile.getSize());
     String path = service.saveFileToServer(multifile, ASVE_PATH);
     fileModel.setPath(path);
     list.add(fileModel);
    }

   }
  }

  model.addAttribute("list", list);
  return "demo/list";

 } 

 

 

與之前的方法相比,我們不再使用MultipartFile 參數,而改為使用DefaultMultipartHttpServletRequest 參數,其實這樣做更為方便,可以批量處理。

 

 

另外,我們在配置

 

 

 

CommonsMultipartResolver時可以控制每次上傳檔案的大小,如下:

 

<bean id="multipartResolver"

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- one of the properties available; the maximum file size in bytes -->

<property name="maxUploadSize" value="100000"/>

</bean>

 

PS:如果不想在設定檔中增加配置,又想使用spring對多附件上傳的支援,該如何做呢,可以參考下面的例子:

 

 

@RequestMapping(value = "/test/upload2.do", method = POST)

public String handleImport2(Model model, HttpServletRequest request) {

CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(

request.getSession().getServletContext());

// 設定編碼

commonsMultipartResolver.setDefaultEncoding("utf-8");

if (commonsMultipartResolver.isMultipart(request)) {

// 轉換成多部分request

MultipartHttpServletRequest multipartRequest = commonsMultipartResolver.resolveMultipart(request);

Iterator iterator = multipartRequest.getFileNames();

while (iterator.hasNext()) {

MultipartFile multifile = multipartRequest.getFile((String) iterator.next());

System.out.println(multifile.getOriginalFilename());

}

commonsMultipartResolver.cleanupMultipart(multipartRequest);

}

return null;

}

 

說明:這種方式不能在spring設定檔中聲明multipartResolver,否則會得不到上傳檔案內容

 

 

ok,關於spring基於註解的附件上傳就介紹到這裡,相關代碼可以參考附件。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.