【问题标题】:Jetty file upload via multipart request directly farward file to FileInputStream通过多部分请求直接将文件上传到 FileInputStream 的 Jetty 文件
【发布时间】:2019-12-31 09:01:37
【问题描述】:
我目前正在使用 jetty 作为我的 serverlet 容器在 java 中实现文件上传服务。我正面临一个我想解决的问题。
我有一个用于文件上传的端点,它是一个接收多部分表单数据的 post 端点。
这适用于小文件,但当用户上传大文件时让我很头疼。如果我没记错的话,Jetty 会在将上传的文件转发到我的 FileInputStream 之前对其进行缓冲。
我的意思是它首先填充其内部缓冲区,然后将其写入FileInputStream。有没有办法阻止这种情况并调整码头,使其在缓冲数据之前直接将数据中继到FileInputStream?
我已经尝试将输入流包装到缓冲的流中,但 Jetty 首先使用文件,对其进行缓冲,然后将其写入InputStream。
经过一番研究,我看到一条评论建议使用 put 代替,然后访问原始数据以实现这种直接转发。但我想知道是否还有另一种更好的方法。
问候阿图尔
【问题讨论】:
标签:
java
upload
jetty
multipart
【解决方案1】:
在multipart/form-data 上处理大文件时,请确保您使用的是最新的 RFC7578,因为它是性能最高的。
Server server = new Server();
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setMultiPartFormDataCompliance(MultiPartFormDataCompliance.RFC7578);
ServerConnector connector = new ServerConnector(server,
new HttpConnectionFactory(httpConfig));
server.addConnector(connector)
接下来,当您使用HttpServletRequest.getPart(String) 方法时,您应该知道Jetty 在内部必须提取multipart/form-data 的内容,以便.getPart() 和.getParameter() 方法都可以访问。
以这种方式访问大文件实际上是 Jetty 本身的单元测试。
见:HugeResourceTest.java