我正在使用Java JDK 1.7和Jersey web服务框架编写一个web服务。我需要提供的一件事是允许经过身份验证的客户端下载某些大型数据文件(1-3GB)。理想情况下,我希望这是一个暂停和恢复类型的可下载选项。我尝试了球衣多部分API,并能够使它在我的客户端机器上工作,高达400MB,但除此之外,它遇到了内存不足的问题。我还担心服务器在面临同时下载请求时可能会出现故障。你对如何做到这一点有什么想法吗?Netty是一种选择吗?关于如何将Netty集成到现有的基于泽西岛的web服务中,有什么建议吗?是否有其他框架工程可以帮助实现这一点?我必须使用java作为web服务。任何指针都会有所帮助。
如果您遇到内存不足的问题,您应该检查如何处理正在下载的数据。如果使用的是Jersey的ClientResponse,请确保使用的是getEntityInputStream(),而不是getEntity()。通过这种方式,您可以流式传输数据,将其写入文件,然后将其丢弃,而不是让它在Java堆空间中构建。
我真的不能谈论你同时下载的问题,但如果你使用的是web服务框架,那么它应该得到正确的处理。
对于这两个问题,更多关于具体实现的信息,尤其是代码,将帮助您获得更好的响应。
服务器和客户端都必须支持HTTP分块编码,允许使用HTTP流式传输数据。以下代码应适用于Jersey 2.11。
对于下载大文件,请在服务器上尝试以下操作:
@GET
@Path("/files/{fileName}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public StreamingOutput getFile(@PathParam("fileName") final String fileName) throws Exception {
//create instance of StreamingOutput here
return streamingOutput;
}
对于使用蒸汽下载文件的客户端GET请求,请尝试此操作。
public String getFileReq(File outFile) throws IOException {
client = ClientBuilder.newClient(new ClientConfig());
client.property(ClientProperties.REQUEST_ENTITY_PROCESSING, "CHUNKED");
WebTarget target = client.target(URI)
OutputStream fileOutputStream = new FileOutputStream(outFile);
InputStream fileInputStream = target.request().get(InputStream.class);
writeFile(fileInputStream, fileOutputStream);
}
public static void writeFile(InputStream fileInputStream, OutputStream outputStream) throws IOException {
try {
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = fileInputStream.read(buffer)) !=-1) {
outputStream.write(buffer, 0, bytesRead);
}
fileInputStream.close();
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
outputStream.close();
}