通过HTTP PUT请求上传文件

hoo*_*knc 5 java rest file-upload put spring-mvc

有没有人知道任何产品或库,如Apache Commons FileUpload将处理PUT文件上传?

任何友好的建议或方向将非常感谢!

全文:

我们开始为我们的java webapp实现文件上传休息(如)服务,但似乎没有任何"简单"的解决方案来处理通过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/Using+HTTP+PUT+and+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
Run Code Online (Sandbox Code Playgroud)

然后xwoker给出了以下很好的卷曲示例:

curl -v -X PUT -T "myfile" http://localhost:8080/mytargetfilename
Run Code Online (Sandbox Code Playgroud)

hoo*_*knc 8

让弹簧正确响应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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

MultipartResolver的Javadoc页面上有文档说明如何为您的应用程序正确定义自定义MultipartResolver(重点是我的):

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

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

<bean id="multipartResolver" class="<package>.<name>.PostAndPutCommonsMultipartResolver"/>
Run Code Online (Sandbox Code Playgroud)

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

@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver() {
    return new PostAndPutCommonsMultipartResolver();
}
Run Code Online (Sandbox Code Playgroud)

有关MultipartResolver的注释配置的更多信息.