1 單文件上傳
????????在程序開發中,有時候需要上傳一些文件。我們在學習Servlet的時候,也做過文件上傳的操作,只不過基于Servlet的文件上傳操作起來過于復雜,因此所有的MVC框架都提供了自己的文件上傳操作,基本上都是基于FileUpload的文件上傳。
????????Spring MVC在處理文件上傳的時候,有自己的處理方法,但是也是基于FileUpload的操作,因此在處理文件上傳的時候也需要導入commons-fileupload-1.2.2.jar包和commons-io-2.4.jar包。
????????在操作的時候,首先需要在配置文件中,配置Spring MVC文件上傳功能,具體代碼如下。
<!-- 設置了multipartResolver才能完成文件上傳 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 文件上傳字符編碼 --><property name="defaultEncoding" value="UTF-8"></property><!-- 設置文件上傳的大小,單位是字節 --><property name="maxUploadSize" value="2000000"></property>
</bean>
????????接下來需要一個表單,用來執行選擇文件操作,首先在控制器中添加方法,用來跳轉到文件上傳頁面,具體代碼如下。
@RequestMapping(value="/uploadInput", method=RequestMethod.GET)
public String upload() {return "upload";
}
????????在WEB-INF/jsp目錄下創建upload.jsp頁面,并添加如下代碼。
<form action="upload" method="post" enctype="multipart/form-data">name:<input type="text" name="name"><br>file:<input type="file" name="fileName"><br><input type="submit" value="提交">
</form>
????????頁面效果如圖所示。
????????在控制器中只需要在處理方法中加入參數MultipartFile,就可以實現文件上傳了。編寫處理方法,代碼內容如下。
@RequestMapping(value="/upload", method=RequestMethod.POST)
public String upload(String name, MultipartFile file, HttpServletRequest req) {System.out.println(name);//獲取表單域的名字System.out.println(file.getName());//獲取文件原始的名字System.out.println(file.getOriginalFilename());//獲取文件的類型System.out.println(file.getContentType());//獲取文件上傳的路徑String realpath = req.getSession().getServletContext().getRealPath("/upload");//創建文件對象File f = new File(realpath + "/" + file.getOriginalFilename());try {//文件上傳
FileUtils.copyInputStreamToFile(file.getInputStream(), f);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "upload";
}
????????注意:方法中MultipartFile對象的名字,必須和文件表單域的名字一致,否則會報錯。
????????在WebRoot目錄下創建文件夾upload,訪問:http://localhost:8080/springmvc/uploadInput,選擇文件,就可以正常上傳文件了。
2?多文件上傳
????????在實際的開發中,有時要同時上傳多個文件,在處理的時候,只需要稍作修改就可以了。首先需要修改文件上傳頁面代碼,如下所示。
<form action="upload" method="post" enctype="multipart/form-data">name:<input type="text" name="name" size="30"><br><br>file:<input type="file" name="files"><br><br>file:<input type="file" name="files"><br><br>file:<input type="file" name="files"><br><br><input type="submit" value="提交">
</form>
????????頁面顯示的效果如圖所示。
????????在控制器中的處理也非常簡單,只需要把對象改為一個數組即可,代碼修改如下。
@RequestMapping(value="/upload", method=RequestMethod.POST)
public String upload(String name, MultipartFile files[], HttpServletRequest req) {//獲取文件上傳的路徑String realpath = req.getSession().getServletContext().getRealPath("/upload");for(MultipartFile file:files) {//在多文件上傳時,防止有的文件表單域沒有選擇文件if(file.isEmpty()) {continue;}//創建文件對象File f = new File(realpath + "/" + file.getOriginalFilename());try {//文件上傳 FileUtils.copyInputStreamToFile(file.getInputStream(), f);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return "success";
}
????????此時選擇多個文件,也能同時完成上傳,即使有的表單域沒有選擇文件,也是可以的,同時這種方法同樣也能完成單文件的上傳。不過這樣做也有點費事,在實際開發中往往都是通過插件,使在一個選擇框中,可以同時選擇若干文件,實現同時上傳。這一點在HTML5中,可以通過multiple屬性來實現在一個文件表單域中可接受多個值的文件上傳,在HTML4中仍然可以使用,具體代碼如下所示。
<form action="upload" method="post" enctype="multipart/form-data">name:<input type="text" name="name" size="30"><br><br>file:<input type="file" name="files" multiple="multiple"><br><br><input type="submit" value="提交">
</form>
????????頁面效果如圖所示。
????????后臺接收文件的處理代碼不用修改,可以直接使用。