springMVC文件上传

简介: springMVC文件上传


Spring MVC 框架的文件上传基于 commons-fileupload 组件,并在该组件上做了进一步的封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。

MultipartResolver接口

在 Spring MVC 中实现文件上传十分容易,它为文件上传提供了直接支持,即 MultpartiResolver 接口。MultipartResolver 用于处理上传请求,将上传请求包装成可以直接获取文件的数据,从而方便操作。

MultpartiResolver 接口有以下两个实现类:

StandardServletMultipartResolver:使用了 Servlet 3.0 标准的上传方式。
CommonsMultipartResolver:使用了 Apache 的 commons-fileupload 来完成具体的上传操作。
MultpartiResolver 接口具有以下方法。

名称

作用

byte[] getBytes()

以字节数组的形式返回文件的内容

String getContentType()

返回文件的内容类型

InputStream getInputStream()

返回一个InputStream,从中读取文件的内容

String getName()

返回请求参数的名称

String getOriginalFillename()

返回客户端提交的原始文件名称

long getSize()

返回文件的大小,单位为字节

boolean isEmpty()

判断被上传文件是否为空

void transferTo(File destination)

将上传文件保存到目标目录下

单文件上传

1.maven引入


commons-fileupload
commons-fileupload
1.4


commons-io
commons-io
2.11.0

  1. 配置 MultipartResolver

使用 CommonsMultipartReslover 配置 MultipartResolver 解析器,在 springmvc-servlet.xml 中添加代码如下。

<bean id="multipartResolver"

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000" />
<property name="defaultEncoding" value="UTF-8" />


defaultEncoding:请求的编码格式,默认为 ISO-8859-1,此处设置为 UTF-8(注:defaultEncoding 必须和 JSP 中的 pageEncoding 一致,以便正确读取表单的内容)。
maxUploadSize:上传文件大小上限,单位为字节。
3.编写文件上传表单页面

负责文件上传表单的编码类型必须是“multipart/form-data”类型。

文件:

备注: file 文件的name参数值与控制器类中的参数值保持一致。

  1. 编写控制器

@RestController
public class UploadController {

@PostMapping("/upload")
public String upload(MultipartFile multipartFile, HttpServletRequest request){

    //获取服务器根路径
    String root=request.getSession().getServletContext().getRealPath("/");
    //创建服务器附件的路径
    File dir=new File(root+"/attachment");
    //先判断目录 是否存在
    if(!dir.exists()){
        //创建目录
        dir.mkdir();
    }

    //获取原文件的后缀
    String name=multipartFile.getOriginalFilename();
    String ext=name.substring(name.lastIndexOf("."));
    String newFileName=System.currentTimeMillis()+ext;
    //要上传到服务上的新的文件
    File newFile=new File(dir,newFileName);

    try {
        multipartFile.transferTo(newFile);
        return "attachment/"+newFileName;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

}
多文件上传:

文件:


控制类

实现只要将参数改成List multipartFiles即可。

@RestController // 注册到ioc容器
@PropertySource("classpath:file.properties")
public class UploadController {

final String ATTACHMENT_DIRS="/attachment/";
final int  SUCCESS=200;
final int FAIL=0;

String root; //服务器根路径

@Autowired
HttpServletRequest req;

@Value("${upload.maxSize}")
long maxSize;

@Value("${upload.type}")
String type;


@PostMapping("/upload")
public UploadBean upload(MultipartFile multipartFile){
    createDir();
    return writeFile(multipartFile);
}


@PostMapping("/batchUpload")
public List uploadMulitFile(List<MultipartFile> multipartFiles){
    createDir();
    List list=new ArrayList();
    //遍历文件 列表
    Iterator<MultipartFile> it=multipartFiles.iterator();
    while (it.hasNext()){
        MultipartFile file=it.next();
        list.add(writeFile(file));
    }
    return list;
}


void createDir(){
    //获取服务器根路径
    //创建服务器附件的路径
    File dir=new File(getRoot()+ATTACHMENT_DIRS);
    //先判断目录 是否存在
    if(!dir.exists()){
        //创建目录
        dir.mkdir();
    }
}

/**
 * 将文件 写入服务器
 * @param file
 * @return
 */
UploadBean writeFile(MultipartFile file){
    if(file.isEmpty())
        return fail("上传的文件为空");
    //获取文件类型
    String ct=file.getContentType();
    if(type.indexOf(ct)==-1){
        return fail("暂不支持该格式的文件上传");
    }

    if(file.getSize()>maxSize){
        return fail("文件超过最大上传限制");
    }

    //获取新文件 名
    String fileName=getNewFileName(file);
    //创建新的文件
    File newFile=new File(getRoot()+ATTACHMENT_DIRS+fileName);
    //将文件写入服务器
    try {
        file.transferTo(newFile);
        return success(ATTACHMENT_DIRS+fileName);
    } catch (IOException e) {
        e.printStackTrace();
        return fail("上传失败:"+e.toString());
    }
}

/**
 * 生成新的文件名
 * @param file
 * @return
 */
String getNewFileName(MultipartFile file){
    //获取原文件的后缀
    String name=file.getOriginalFilename();
    String ext=name.substring(name.lastIndexOf("."));
    String newFileName=System.currentTimeMillis()+ext;
    return newFileName;
}

public String getRoot() {
    if(null==root && null!=req){
        root=req.getSession().getServletContext().getRealPath("/");
    }
    return root;
}

UploadBean success(Object data){
    return new UploadBean(SUCCESS,"上传成功",data);
}

UploadBean fail(String msg){
    return new UploadBean(FAIL,msg,null);
}

}
file.properties文件内容:

upload.maxSize=10485760
upload.type=image/jpeg,image/png
UploadBean.java

public class UploadBean {

int code;
String msg;
Object data;

public int getCode() {
    return code;
}

public void setCode(int code) {
    this.code = code;
}

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg = msg;
}

public Object getData() {
    return data;
}

public void setData(Object data) {
    this.data = data;
}

public UploadBean(int code, String msg, Object data) {
    this.code = code;
    this.msg = msg;
    this.data = data;
}

public UploadBean() {
}

}

目录
相关文章
|
19天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
4月前
|
JSON 前端开发 Java
spring mvc Rest风格
spring mvc Rest风格
34 0
|
6天前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
2月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
2月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
2月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
2月前
|
JSON 前端开发 Java
Spring MVC返回JSON数据
综上所述,Spring MVC提供了灵活、强大的方式来支持返回JSON数据,从直接使用 `@ResponseBody`及 `@RestController`注解,到通过配置消息转换器和异常处理器,开发人员可以根据具体需求选择合适的实现方式。
94 4
|
2月前
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
88 3
|
2月前
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
89 2
|
3月前
|
前端开发 Java 应用服务中间件
我以为我对Spring MVC很了解,直到我遇到了...
所有人都知道Spring MVC是是开发的,却鲜有人知道Spring MVC的理论基础来自于1978 年提出MVC模式的一个老头子,他就是Trygve Mikkjel Heyerdahl Reenskaug,挪威计算机科学家,名誉教授。Trygve Reenskaug的MVC架构思想早期用于图形用户界面(GUI) 的软件设计,他对MVC是这样解释的。MVC 被认为是解决用户控制大型复杂数据集问题的通用解决方案。最困难的部分是为不同的架构组件想出好的名字。模型-视图-编辑器是第一个。
115 1
我以为我对Spring MVC很了解,直到我遇到了...
下一篇
无影云桌面