我需要调用远程REST接口处理程序并在请求正文中提交一个文件。请注意我无法控制服务器。我无法将请求更改为多部分,客户端必须按照外部规范工作。
到目前为止,我设法让它像这样工作(为了简洁省略标题等):
byte[] data = readFileCompletely ();
client.target (url).request ().post (Entity.entity (data, "file/mimetype"));
这样可行,但是对于不适合内存的大文件会失败。由于我对文件大小没有限制,这是一个问题。
问题:是否有可能使用流或类似的东西来避免将整个文件读入内存?
如果可能,我更愿意避免特定于实现的扩展。如果没有,可以使用RESTEasy(在Wildfly上)的解决方案。
答案 0 :(得分:2)
ReastEasy以及Jersey支持InputStream开箱即用,所以只需使用Entity.entity(inputStream, "application/octet-stream");
或您要设置的任何Content-Type标头。
答案 1 :(得分:1)
您可以使用诸如普通java.net.URLConnection之类的库来进行低级别构建HTTP请求。
我自己没有尝试过,但是有一些示例代码可以读取本地文件并将其写入请求流而不将其加载到字节数组中。
Upload files from Java client to a HTTP server
当然这个解决方案需要更多的手动编码,但它应该有效(除非java.net.URLConnection将整个文件加载到内存中)