【问题标题】:Failure to upload file to servlet with https enabled在启用 https 的情况下无法将文件上传到 servlet
【发布时间】:2016-03-20 08:20:53
【问题描述】:

我的应用程序中有一个奇怪的问题。

申请详情: - Spring 4、Java 8、Tomcat 8

当我启用 https(在 web.xml 中)并尝试上传多部分文件时,我收到以下错误:

Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:1005)
    at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:903)
    at java.io.InputStream.read(InputStream.java:101)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:100)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:70)
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:347)

但是,当我关闭 https 并通过 http 发出请求时,一切正常。有什么想法吗?

我现在只是用一个非常简单的上传表单进行测试:

<form action="../upload/TestUpload"
enctype="multipart/form-data" method="post">
<p>
Please specify a file, or a set of files:<br>
<input type="file" name="datafile" size="40">
</p>
<div>
<input type="submit" value="Send">
</div>
</form>

spring 类现在非常简单——只是打印出文件名而不做任何事情。但是,代码甚至没有达到这个动作,因为 fileupload 解析流失败。

@RestController
public class Upload {
    private static final Logger LOG = LogManager.getLogger(Upload.class);
    @RequestMapping(value="/TestUpload", method=RequestMethod.POST)
    public List<FileResult> handleFileUpload(MultipartHttpServletRequest request){
        //List<File> tempFiles = new LinkedList<File>();
        List<FileResult> files = new LinkedList<FileResult>();
        Iterator<String> itr = request.getFileNames();
            while (itr.hasNext()) {
                MultipartFile multipartFile = request.getFile(itr.next()); 
                LOG.info(multipartFile.getName());
            }
          return files;

    }

web.xml https sn-p

  <security-constraint>
    <web-resource-collection>
        <web-resource-name>securedapp</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
        <http-method>PUT</http-method>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint> 

【问题讨论】:

  • 您在 web.xml 中启用了 https?!但是使用 https 加载您的表单没有任何警告是可以的?
  • 是的,整个 Web 应用程序在启用 https 的情况下工作。唯一不起作用的是文件上传。

标签: java spring spring-mvc tomcat servlets


【解决方案1】:

我通过安装最新版本的 tomcat 8 和最新版本的 jdk 8 解决了这个问题。不确定之前的问题是什么,但可能是一些罕见的错误或配置错误导致了这个问题。

【讨论】:

    【解决方案2】:

    我的应用程序详细信息出现此错误:Spring 4.3.1、Java 7、Tomcat 8.5.4。
    我发现 Tomcat 连接器 org.apache.coyote.http11.Http11Nio2Protocol 在 Internet 上无法用于上传大于 20KB 的文件,尽管它在 localhost 中可以正常工作。
    我最终使用了 Tomcat 连接器 org.apache.coyote.http11.Http11NioProtocol,它工作正常。
    我认为这与阻塞与非阻塞 I/O 连接器的特性有关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2015-03-11
      • 1970-01-01
      • 2022-12-11
      • 2019-12-21
      • 2021-08-31
      相关资源
      最近更新 更多