一尘不染

通过HTTP PUT请求上传文件

spring-mvc

是否有人对将处理PUT文件上传的任何产品或库(例如Apache Commons FileUpload)有任何想法?

任何友好的建议或方向将不胜感激!

全文:

我们正开始为我们的Java Web应用程序实现文件上载rest(like)服务,但是似乎没有任何“简单”的解决方案可以通过HTTP PUT方法处理文件上载。

我们希望找到一个类似于Apache Commons
FileUpload
项目的库,但它不仅能处理“
HTML中的基于表单的文件上载”和/或“ multipart / form-data”。

我们真的很喜欢FileUpload的功能,可以临时存储文件,在被询问时移动这些文件,然后在不再使用临时文件时清理它们。我们还喜欢这样一个事实,Spring会自动将MultipartFile
List绑定到我们的命令对象,当它进入我们其他基于html表单的文件上传控制器时,它才可供我们使用。

全栈背景:

  • Spring MVC(3.2.3.RELEASE)
  • 雄猫7
  • 我们正在尝试遵循分层架构(UI,服务/业务逻辑,持久性)

感谢您的时间!


以下url是一个示例,显示了从请求的InputStream上传文件的功能。该代码可以完成工作,但是生产质量并不高。

https://boplicity.nl/confluence/display/spring/使用+ HTTP + PUT +和+ Spring +
MVC + to + upload +
files


我们正在使用以下curl命令来测试我们的Web服务:

curl -v -k -X PUT --data-binary @"c:/java/files/tempfilename.txt" https://localhost:8443/api/file/tempfilename.txt

xwoker然后给出了以下漂亮的curl示例:

curl -v -X PUT -T "myfile" http://localhost:8080/mytargetfilename

阅读 3477

收藏
2020-06-01

共1个答案

一尘不染

让Spring正确响应HTTP PUT方法的文件上载请求是相当轻松的。

它所要做的就是重写自定义的MultipartResolver类中的isMultipart()方法。

import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.servlet.ServletRequestContext;

import javax.servlet.http.HttpServletRequest;

public class PostAndPutCommonsMultipartResolver extends CommonsMultipartResolver {

    private static final String POST_METHOD = "POST";
    private static final String PUT_METHOD = "PUT";

    @Override
    public boolean isMultipart(HttpServletRequest request) {

        boolean isMultipartRequest = false;

        if (request != null) {

            if (POST_METHOD.equalsIgnoreCase(request.getMethod()) || PUT_METHOD.equalsIgnoreCase(request.getMethod())) {

                isMultipartRequest = FileUploadBase.isMultipartContent(new ServletRequestContext(request));
            }
        }

        return isMultipartRequest;
    }
}

真正重要的是扩展了默认的MultipartResolver,以便isMultipart()方法将为POST或PUT请求返回true。

通常,有两个默认的MultipartResolver实现:
CommonsMultipartResolver(与Apache
Commons
FileUpload一起使用)和StandardServletMultipartResolver(与Servlet
3.0+ Part API一起使用)。

由于我们使用的是Apache Commons
FileUpload,因此
我们扩展了CommonsMultipartResolver类。

MultipartResolver的Javadoc页面上有文档,解释了如何为您的应用程序正确定义自定义的MultipartResolver(添加了重点):

Spring DispatcherServlets没有默认的解析器实现
,因为应用程序可能会选择自己解析其多部分请求。要定义实现,请在DispatcherServlet的应用程序上下文中创建一个ID为“
multipartResolver”的bean。这样的解析器将应用于该DispatcherServlet处理的所有请求。

对于配置了xml的应用程序,它将看起来接近以下内容:

<bean id="multipartResolver" class="<package>.<name>.PostAndPutCommonsMultipartResolver"/>

对于配置了注释的应用程序,它将看起来与以下内容接近:

@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver() {
    return new PostAndPutCommonsMultipartResolver();
}
2020-06-01