当前位置: 代码网 > it编程>编程语言>Java > Spring之配置multipartResolver解析器、上传文件、处理文件过程

Spring之配置multipartResolver解析器、上传文件、处理文件过程

2025年08月08日 Java 我要评论
multipart格式的数据 会将 一个表单拆分为 多个部分,每个部分对应一个输入域。在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是二进制。配置 m

multipart格式的数据 会将 一个表单拆分为 多个部分,每个部分对应一个输入域。

在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是二进制。

配置 multipart 解析器:

有两个:

  • commonsmultipartresolver:使用 jakarta commons fileupload 解析 multiparty。
  • standardservletmultipartresolver:依赖于 servlet 3.0 对 multipart 请求的支持。

配置 standardservletmultipartresolver 解析器

1、在applicationcontext 中声明为 bean:

@bean
public multipartresolver multipartresolver(){
    return new standardservletmultipartresolver();
}

2、在 web.xml 或 servlet 初始化类中,配置 multipart 的具体细节,如:文件大写,临时文件路径等。

  • 如果已经实现了 webapplicationinitializer 接口,可以在servlet registration 上调用 setmultipartconfig() 方法进行配置:
@override
public void onstartup(servletcontext servletcontext) throws servletexception {

    dispatcherservlet dispatcherservlet = new dispatcherservlet();
    servletregistration.dynamic registration = servletcontext.addservlet("appservlet", dispatcherservlet);
    registration.addmapping("/");
    registration.setmultipartconfig(new multipartconfigelement("/tmp/uploads"));
}
  • 若 初始化 类 继承了abstractannotationconfigdispatcherservletinitializerabstractdispatcherservletinitializer 通过重写 customizeregistration 方法 来配置 multipart 的具体细节
@override
protected void customizeregistration(servletregistration.dynamic registration) {
    registration.setmultipartconfig(
            new multipartconfigelement("/tmp/test/uploads")
    );
}

了解 multipartconfigelement 类:

new multipartconfigelement("/tmp/test/uploads",2097152,4194304,0)
  • 指定 临时存放目录 为/tmp/test/uploads
  • 上传文件的最大容量:2097152 = 2mb。
  • 整个 multipart 请求的最大容量 4194304 = 4mb。
  • 文件大写 达到一定容量,会写入 临时文件路径中,默认是 0,所有上传的文件都会写入磁盘中。

对应 在 web.xml 中的配置:

<servlet>
    <servlet-name>appservlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <multipart-config>
    	<!-- 临时路劲 -->
        <location>/tmp/test/uploads</location>
        <!-- 上传文件的最大值 -->
        <max-file-size>2097152</max-file-size>
        <!--请求的最大容量-->
        <max-request-size>4194304</max-request-size>
    </multipart-config>
</servlet>

配置 commonsmultipartresolver 解析器

声明为 bean

@bean
public multipartresolver multipartresolver(){
    return new commonsmultipartresolver();
}

文件大小,临时路径等在 声明bean 时设置。

 @bean
public multipartresolver multipartresolver() throws ioexception {
    commonsmultipartresolver multipartresolver = new commonsmultipartresolver();
    // 设置 临时目录
    multipartresolver.setuploadtempdir(new filesystemresource("/tmp/test/uploads"));
    // 最大文件
    multipartresolver.setmaxuploadsize(2097152);
    
    multipartresolver.setmaxinmemorysize(0);
    return multipartresolver;
}

上传文件、处理文件

表单的大体样式:

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="picture" accept="image/jpeg">
    <input type="submit" value="提交">
</form>
  • enctype="multipart/form-data" 告诉 浏览器以 multipart 数据的形式提交表单。
  • accept="image/jpeg" 限制文件接收的类型 为 jpeg。

controller 上接收上传的文件

@requestmapping("/upload")
public string uploadimage(@requestpart("picture")multipartfile file) throws ioexception {
    // 获取 文件 名
    string filename = file.getoriginalfilename();
    // 将 上传的文件 写入到 文件系统中
    file.transferto(new file("/data/image"+filename));
    return "index";
}
  • multipartfile 接口,为处理 multipart 数据提供了内容更为丰富的对象。
public interface multipartfile extends inputstreamsource {
    string getname();

    @nullable
    string getoriginalfilename();

    @nullable
    string getcontenttype();

    boolean isempty();

    long getsize();

    byte[] getbytes() throws ioexception;

    inputstream getinputstream() throws ioexception;

    default resource getresource() {
        return new multipartfileresource(this);
    }

    void transferto(file var1) throws ioexception, illegalstateexception;

    default void transferto(path dest) throws ioexception, illegalstateexception {
        filecopyutils.copy(this.getinputstream(), files.newoutputstream(dest));
    }
}

可以把 multipartfile 替换为 servlet.http.part

@requestmapping("/upload")
public string uploadimage(@requestpart("picture") part file) throws ioexception {
    // 获取 文件 名
    string filename = file.getsubmittedfilename();
    // 将 上传的文件 写入到 文件系统中
    file.write("/data/image"+filename);
    return "index";
}

通过 part 参数接收上传文件,那么没有必要 配置 multipartresolver 了。只有使用 multipartfile 的时候,才需要 配置。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com