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,否则会得不到上传文件内容
- 大小: 26 KB
分享到:
相关推荐
在Spring 2.5版本中,Spring引入了基于注解的方式,使得处理文件上传变得更加简洁和直观。这篇博客"Spring2.5 MVC -- 基于注解的附件上传"详细介绍了如何在Spring MVC 2.5中实现这一功能。 首先,我们需要了解...
基于Spring实现文件上传功能 一、文件上传概述 文件上传是web应用程序中的一种常见功能,允许用户上传文件到服务器端以供后续处理。 Spring框架提供了多种方式来实现文件上传,包括使用MultipartFile接口、使用...
- Spring MVC的Controller接收到请求,解析请求体中的多部分数据(Multipart Data),这通常涉及到`@RequestParam("file") MultipartFile file`注解。 - 文件内容被解码并存储在内存或临时文件中。 - Controller...
在本文中,我们将深入探讨如何使用Spring框架实现文件上传功能。Spring提供了强大的MVC模块,使得处理HTTP请求,包括文件上传变得非常简单。文件上传在Web应用中是常见的需求,例如用户可能需要上传图片、文档等。让...
另一个示例是imagedb,它是一个基于注解的Web MVC应用程序,专注于无状态的multi-action控制器和多段文件上传处理,该示例位于“samples/imagedb”目录。 要使Spring MVC 3支持注解,关键在于DispatcherServlet的...
- **ImageDB**:另一个基于注解的WebMVC示例应用,ImageDB着重于展示无状态的多动作控制器以及如何处理多部分文件上传等复杂请求。该应用可在“samples/imagedb”目录中找到。ImageDB不仅展示了注解的基本用法,还...
以上就是基于Spring实现文件上传和下载的基本流程和技术点。在实际开发中,还需要考虑错误处理、文件大小限制、安全验证等细节问题。在"onegis"这个压缩包中,可能包含了一个实际的Spring Web项目示例,你可以通过...
在本实例中,我们将会深入探讨如何利用Spring MVC的注解模式进行增删改查操作,实现文件上传与导出Excel功能,以及展示Echarts地图集成。 1. **Spring MVC 注解模式**: - **@Controller**:标记在类上,表示该类...
Spring MVC提供了`@RequestParam`注解来处理HTTP请求中的参数,包括文件上传。当处理文件上传时,我们需要使用`MultipartFile`接口。以下是一个简单的控制器方法示例: ```java import org.springframework.web....
Spring提供了`CommonsMultipartFile`类来处理文件上传,它是基于Apache Commons FileUpload库的。在Spring MVC中,你需要在控制器方法中声明一个`MultipartFile`类型的参数来接收上传的文件。文件大小限制通常在Web...
在Controller中,我们需要定义一个方法,该方法使用`@RequestParam`注解来接收上传的文件。例如: ```java @Controller @RequestMapping("/upload") public class UploadController { @RequestMapping(value = ...
这通常涉及到`spring-boot-starter-web`,因为文件上传是基于HTTP请求的。确保你的`pom.xml`中包含了以下内容: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-web ``` 接下来,...
通过`@RequestParam`注解和`MultipartFile`接口,我们可以方便地接收并处理上传的文件。 2. **MultipartFile接口** `MultipartFile`是Spring MVC提供的一个接口,用于表示上传的文件。它包含了一些方法,如`...
本项目是一个基于Spring MVC框架的Web应用开发示例,涵盖了从基础的MVC模式实现到高级的注解开发、数据交互、文件上传下载、拦截器配置等多个方面的功能。通过本项目,开发者可以深入了解Spring MVC框架的核心功能和...
在"struts1 + hibernate + spring 实现文件上传"的场景中,我们将讨论如何利用这些技术来实现用户端文件的上传功能。 **Struts1** 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它简化了开发...
总结来说,基于SSH框架的注解开发涉及Spring、Struts2和Hibernate三个框架的集成使用,以及Ajax和jQuery在前端交互中的应用。了解和掌握这些知识点,将有助于构建高效、易维护的Java Web应用。在实际项目中,还需要...
- Spring MVC提供了`@RequestParam("file") MultipartFile file`注解,用于接收上传的文件。`MultipartFile`是Spring提供的接口,用于处理上传的文件数据。 - 使用`CommonsMultipartResolver`解析器,它是Spring ...