Spring 文件上传功能

71 阅读2分钟

本篇文章,我们要来做一个Spring的文件上传功能:

  1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖:
12345<dependency>``    ``<groupId>org.springframework.boot</groupId>``    ``<artifactId>spring-boot-starter-web</artifactId>``    ``<version>``1.0``.``2``.RELEASE</version>``</dependency>

2.在webapp目录下的index.jsp文件中输入一个表单:

12345678910<html>``<body>``<form method=``"POST" enctype=``"multipart/form-data"``      ``action=``"/upload"``>``    ``File to upload: <input type=``"file" name=``"file"``><br /> Name: <input``        ``type=``"text" name=``"name"``><br /> <br /> <input type=``"submit"``                                                     ``value=``"Upload"``> Press here to upload the file!``</form>``</body>``</html>

这个表单就是我们模拟的上传页面。

  1. 编写处理这个表单的Controller:
123456789101112131415161718192021222324252627282930313233343536373839import java.io.BufferedOutputStream;``import java.io.File;``import java.io.FileOutputStream; 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.ResponseBody;``import org.springframework.web.multipart.MultipartFile; @Controller``public class FileUploadController {     ``@RequestMapping``(value=``"/upload"``, method=RequestMethod.GET)``    ``public @ResponseBody String provideUploadInfo() {``        ``return "You can upload a file by posting to this same URL."``;``    ``}     ``@RequestMapping``(value=``"/upload"``, method=RequestMethod.POST)``    ``public @ResponseBody String handleFileUpload(``@RequestParam``(``"name"``) String name,``            ``@RequestParam``(``"file"``) MultipartFile file){``        ``if (!file.isEmpty()) {``            ``try {``                ``byte``[] bytes = file.getBytes();``                ``BufferedOutputStream stream =``                        ``new BufferedOutputStream(``new FileOutputStream(``new File(name + ``"-uploaded"``)));``                ``stream.write(bytes);``                ``stream.close();``                ``return "You successfully uploaded " + name + ``" into " + name + ``"-uploaded !"``;``            ``} ``catch (Exception e) {``                ``return "You failed to upload " + name + ``" => " + e.getMessage();``            ``}``        ``} ``else {``            ``return "You failed to upload " + name + ``" because the file was empty."``;``        ``}``    ``} }
  1. 然后我们对上传的文件做一些限制,同时编写main方法来启动这个web :
1234567891011121314151617181920212223242526import org.springframework.boot.SpringApplication;``import org.springframework.boot.autoconfigure.EnableAutoConfiguration;``import org.springframework.boot.context.embedded.MultiPartConfigFactory;``import org.springframework.context.annotation.Bean;``import org.springframework.context.annotation.ComponentScan;``import org.springframework.context.annotation.Configuration; import javax.servlet.MultipartConfigElement; @Configuration``@ComponentScan``@EnableAutoConfiguration``public class Application {     ``@Bean``    ``public MultipartConfigElement multipartConfigElement() {``        ``MultiPartConfigFactory factory = ``new MultiPartConfigFactory();``        ``factory.setMaxFileSize(``"128KB"``);``        ``factory.setMaxRequestSize(``"128KB"``);``        ``return factory.createMultipartConfig();``    ``}     ``public static void main(String[] args) {``        ``SpringApplication.run(Application.``class``, args);``    ``}``}

  5. 然后访问http://localhost:8080/upload就可以看到页面了。

 

上面的例子是实现的是单个文件上传的功能,假定我们现在要实现文件批量上传的功能的话,我们只需要简单的修改一下上面的代码就行,考虑到篇幅的问题,下面只是贴出和上面不同的代码,没有贴出的说明和上面一样。:

1.  新增batchUpload.jsp文件

12345678910<html>``<body>``<form method=``"POST" enctype=``"multipart/form-data"``      ``action=``"/batch/upload"``>``    ``File to upload: <input type=``"file" name=``"file"``><br />``    ``File to upload: <input type=``"file" name=``"file"``><br />``    ``<input type=``"submit" value=``"Upload"``> Press here to upload the file!``</form>``</body>``</html>
  1. 新增BatchFileUploadController.java文件:
1234567891011121314151617181920212223242526272829303132333435363738394041424344import org.springframework.stereotype.Controller;``import org.springframework.web.bind.annotation.RequestMapping;``import org.springframework.web.bind.annotation.RequestMethod;``import org.springframework.web.bind.annotation.ResponseBody;``import org.springframework.web.multipart.MultipartFile;``import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest;``import java.io.BufferedOutputStream;``import java.io.File;``import java.io.FileOutputStream;``import java.util.List; /**`` ``* Created by wenchao.ren on 2014/4/26.`` ``*/ @Controller``public class BatchFileUploadController {     ``@RequestMapping``(value=``"/batch/upload"``, method= RequestMethod.POST)``    ``public @ResponseBody``    ``String handleFileUpload(HttpServletRequest request){``        ``List<MultipartFile> files = ((MultipartHttpServletRequest)request).getFiles(``"file"``);``        ``for (``int i =``0``; i< files.size(); ++i) {``            ``MultipartFile file = files.get(i);``            ``String name = file.getName();``            ``if (!file.isEmpty()) {``                ``try {``                    ``byte``[] bytes = file.getBytes();``                    ``BufferedOutputStream stream =``                            ``new BufferedOutputStream(``new FileOutputStream(``new File(name + i)));``                    ``stream.write(bytes);``                    ``stream.close();``                ``} ``catch (Exception e) {``                    ``return "You failed to upload " + name + ``" => " + e.getMessage();``                ``}``            ``} ``else {``                ``return "You failed to upload " + name + ``" because the file was empty."``;``            ``}``        ``}``        ``return "upload successful"``;``    ``}``}

  这样一个简单的批量上传文件的功能就ok了,是不是很简单啊。