2013-06-26 22 views
0

我使用Jersey作为我的REST实现,JAXB用于表示我的类。 我已经做了一个小文件传输机制。在客户端,在将其设置为JAXB对象之前,该文件将转换为BASE64字符串。 JAXB对象随后被发送到泽西岛的服务器。使用Jersey发送大型JAXB对象会生成OutOfMemoryError

它适用于大小不超过50 MB的文件,但当我尝试发送500 MB文件时,我的客户端上会收到OutOfMemoryError。我已将-Xms-Xmx设置为2048米,但它没有帮助,但我仍然收到错误消息。

我能做些什么来使它处理非常大的文件?

回答

1

重写整个东西以流式传输文件。不要base64编码它,不要使用JAXB,也不要将它嵌入到XML中。即使文件大小为900 TB,也能正常工作。如果必须的话,在泽西岛以外的地区实施。使用正文流式传输文件字节的HTTP GET结果。您可以在许多servlet教程的介绍中找到实现此示例的servlet示例。

+0

我会尝试使用'HttpUrlConnection'来上传/下载文件。我猜它的Content-Type应该是HTTP头中的“application/octet-stream”。 – Rox

+0

在客户端,您*可能*仍然能够使用相同的API。一些WS客户端API具有获取底层请求的机制或getInputStream()方法。客户端可以从那里读取流。是的,这是在服务器端设置的正确内容类型。如果您想使用浏览器进行测试,请考虑设置内容处置标头:http://stackoverflow.com/questions/1012437/uses-of-content-disposition-in-an-http-response-header这样Web浏览器会提示你保存文件的位置,而不是试图显示它。 – Keith

+0

我忘了提及我正在使用丰富的应用程序而不是Web表单来发送文件。如果我失败,我会明天尝试'HttpUrlConnection'并返回这里。 :-) – Rox

1

Webservices不用于传输大量数据;它们被设计用于进程间通信。文件传输你使用特定的协议,如FTP。如果我不得不设计这样的事情,我会分两步做。使用FTP列表项

  • 调用Web服务调用来告诉这些文件是否存在
  • 但是你可以尝试(对于FTP或JSCH为SFTP阿帕奇commons.net)

    1. 上传文件(S)这个example使用Jersey Client上传大文件。