我已经成功开发了一项服务,我在其中阅读在泽西岛以多部分形式上传的文件.这是我一直在做的非常简化的版本:
@POST
@Path("FileCollection")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail) throws IOException {
//handle the file
}
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但我得到了一个新的要求.除了我上传的文件外,我还要处理任意数量的资源.我们假设这些是图像文件.
我想我只是为客户端提供一个表单,其中包含一个文件输入,一个输入用于第一个图像,一个按钮允许向表单添加更多输入(使用AJAX或简单的JavaScript).
<form action="blahblahblah" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="file" name="image" />
<input type="button" value="add another image" />
<input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
因此,用户可以为表单添加更多图像输入,如下所示:
<form action="blahblahblah" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="file" name="image" />
<input type="file" name="image" />
<input type="file" name="image" />
<input type="button" value="add another image" />
<input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
我希望阅读与集合同名的字段非常简单.我在MVC .NET中使用文本输入成功完成了它,我认为在Jersey中不会更难.事实证明我错了.
找不到关于这个主题的教程,我开始尝试.
为了看看如何做到这一点,我把问题简化为简单的文本输入.
<form action="blahblabhblah" …Run Code Online (Sandbox Code Playgroud) 当使用Jersey客户端将大文件作为InputStream 放置时,看起来文件的整个内容在被发送到服务器之前被缓冲到内存中.这会导致大文件出现问题,因为JVM的堆空间不足.如何在Jersey客户端中阻止此行为?服务器端的JAX-RS资源方法在发送数据时似乎没有这个问题.
例如:
WebResource dataUploadResource = buildDataUploadResource();
dataUploadResource.type(getMimeType()).put(getLargeInputStream());
Run Code Online (Sandbox Code Playgroud) 我用Jersey在Google Appengine上写了一个应用程序来处理简单的文件上传.在球衣1.2上运行时效果很好.在更高版本(当前1.7)中,引入了@FormDataParam来处理多部分/表单输入.我正在使用jersey-multipart和mimepull依赖.似乎新的做法是在appengine中创建临时文件,我们都知道这是非法的......
我在这里错过了什么或做错了什么,因为现在认为Jersey与AppEngine兼容?
@POST
@Path("upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void upload(@FormDataParam("file") InputStream in) { .... }
Run Code Online (Sandbox Code Playgroud)
使用这些例外调用时,上述操作将失败...
/upload
java.lang.SecurityException: Unable to create temporary file
at java.io.File.checkAndCreate(File.java:1778)
at java.io.File.createTempFile(File.java:1870)
at java.io.File.createTempFile(File.java:1907)
at org.jvnet.mimepull.MemoryData.createNext(MemoryData.java:87)
at org.jvnet.mimepull.Chunk.createNext(Chunk.java:59)
at org.jvnet.mimepull.DataHead.addBody(DataHead.java:82)
at org.jvnet.mimepull.MIMEPart.addBody(MIMEPart.java:192)
at org.jvnet.mimepull.MIMEMessage.makeProgress(MIMEMessage.java:235)
at org.jvnet.mimepull.MIMEMessage.parseAll(MIMEMessage.java:176)
at org.jvnet.mimepull.MIMEMessage.getAttachments(MIMEMessage.java:101)
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:177)
at com.sun.jersey.multipart.impl.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:80)
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:139)
at com.sun.jersey.multipart.impl.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:77)
at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474)
at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:538)
Run Code Online (Sandbox Code Playgroud)
有人有线索吗?有没有办法在阻止mimepull创建临时文件的同时做某事?
我正在使用Java JDK 1.7和Jersey Web服务框架编写Web服务.我需要提供的一件事是允许经过身份验证的客户端下载某些大型数据文件(1-3 GB).理想情况下,我希望这是一个暂停和恢复类型可下载选项.我尝试了泽西多部分API,并且能够让它在我的客户端机器上工作高达400 MB,但除此之外它遇到了内存不足的问题.我还担心服务器在遇到同步下载请求时可能会失败.有关如何做到这一点的任何想法?Netty是一个选择吗?关于如何将Netty集成到基于泽西岛的现有Web服务中的任何指示?是否有其他框架可用于帮助实现此目的?我必须使用java作为Web服务.任何指针都会有所帮助.