当前位置: 首页 > 知识库问答 >
问题:

从运行Java Jersey Rest API的HTTP服务器传输大文件

隆飞驰
2023-03-14

我正在使用JavaJDK 1.7和泽西岛网络服务框架编写一个网络服务。我需要提供的一件事是允许经过身份验证的客户端下载某些大数据文件(1-3 GB)的方法。理想情况下,我希望这是一个暂停和恢复类型的可下载选项。我尝试了泽西岛多部分API,并能够让它在我的客户端机器上工作到400 MB,但在那之后它遇到了内存不足的问题。我还担心服务器在面临同时下载请求时可能会失败。关于如何做到这一点有什么想法吗?Netty是一个选择吗?关于如何将Netty集成到现有的基于泽西的Web服务中的任何指针?是否有其他框架作品可以帮助完成这一点?我确实必须使用java进行Web服务。任何指针都会有帮助。

共有2个答案

鲁龙野
2023-03-14

服务器和客户端都必须支持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;
}

尝试使用steams下载文件的客户端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();
}
黄宏大
2023-03-14

如果您遇到内存不足问题,您应该检查您如何处理正在下载的数据。如果您使用的是泽西的ClientACK,请确保您使用的是getEntityInputStream()而不是getEntity()。这样,您可以流式传输数据,将其写入文件,然后将其抛到一边,而不是让它在Java堆空间中堆积。

我不能真正谈论你的同时下载问题,但如果你使用的是Web服务框架,那么它应该得到妥善处理。

对于这两个问题,有关您的特定实现(尤其是代码)的更多信息将帮助您获得更好的响应。

 类似资料:
  • 问题内容: 我想将一些文件上传到HTTP服务器。基本上,我需要的是对服务器的某种POST请求,其中包含一些参数和文件。我看到了仅上传文件的示例,但没有找到如何也传递其他参数的示例。 什么是最简单,免费的解决方案?有人有我可以学习的文件上传示例吗?我已经搜寻了几个小时,但是(也许只是那几天)找不到我真正需要的东西。最好的解决方案是不涉及任何第三方类或库的东西。 问题答案: 通常,你会用来触发HTTP

  • 本文向大家介绍Python如何实现自带HTTP文件传输服务,包括了Python如何实现自带HTTP文件传输服务的使用技巧和注意事项,需要的朋友参考一下 一行命令搭建一个基于python的http文件传输服务 由于今天朋友想要一个文件,而我恰好有,因为这个文件比较大,网速不是很给力,所以想到了python自己有这么一个功能,这样不仅不需要下载其他软件,下载速度也是噌噌的 2333333 python

  • 我尝试了以下代码: 上述代码导致如下异常: 请注意: > 由于与远程服务器和linux服务器的连接成功,我尝试使用但它会引发异常。 一旦使用smb连接,我们将无法使用下面的url直接连接到共享路径吗<代码>字符串url=“//remotehost/SharedPath/Comp/NG/” 请注意:我使用jsch库连接到Linux服务器,并且我能够使用sftpChannel成功连接到Linux服务器

  • 问题内容: 我应该为“ .thrift”文件定义哪种服务,以便以后将其用于我的程序? 此文件传输应该在客户端和服务器之间,并且应该是“部分”。 StreamFileService.thrift: StreamFileClient.java: } StreamFileServer.java: } StreamFileServiceImpl: } 问题答案: 您的代码对我来说似乎还不错(未经测试),没

  • 我正在我的android应用程序中使用Apache Commons FTP库 我正在通过FTPS进行连接,虽然它完美地连接到服务器,但我在传输文件时遇到了问题。 由于安全原因,订购应用程序的客户端请求在使用PROT P时请求数据连接上的TLS会话恢复。

  • 问题内容: 当将大文件(> 100M)上传到服务器时,PHP始终首先接受来自浏览器的全部数据POST。我们无法加入上传过程。 例如,检查的“值”之前整个数据发送到服务器是 不可能的 ,我的PHP代码: 所以我尝试这样使用: map.php 但是…它又失败 了 。在这种情况下工作似乎太晚了。数据仍会完全传输。 然后我尝试了,像这样(代码片段): 结果是…… 再次 失败。 因此,请帮助我找到解决此问题