如果我以较大的块(即大于1024字节)上传大文件会发生什么?

时间:2014-10-13 07:02:36

标签: java android http design-patterns

所以我有一个大文件 ~20MB 必须上传到网络服务器,我遵循以下方法:

  • 从存储input stream
  • 中读取文件
  • 创建大小 1024
  • byte buffer
  • 创建output stream并将byte buffer写入
  • 重复步骤2和3,直到完全读取和写入文件

现在,我有几个问题,

  1. 要上传像这样的大文件,我必须重复20 * 1024次的步骤2和3。如果我想减少迭代次数,即将byte buffer大小增加到 4096 ,从而减少迭代次数20 * 256,该怎么办?除了 outofmemory 在Android上有什么影响呢?

  2. 如果我根据我在运行时上在Android上创建的缓存大小修改此大小,是否需要对 web-server 进行任何更改(它可能因设备而异)?

  3. 我还需要恢复上传,如果由于网络或服务器问题导致中断,并且就此而言我已经考虑保留成功发送的最后一个块编号,从而在发送下一个块时互联网可用或服务器响应。这是正确的方法吗?有没有可用的东西,或者我想在这里重新发明轮子?

  4. 是否收到这些块或字节数组发送到服务器的顺序?

1 个答案:

答案 0 :(得分:2)

您的问题的答案:

  1. 使用1024的缓冲区非常小。 TCP层将尝试通过网络推送完整数据包。除非涉及巨型帧,否则完整数据包通常为1.5K字节。因此,如果您将1K写入网络套接字,则在写入下一个1K之前,TCP数据包不会被推出。这是为了最小化每个发送数据字节的开销量。

  2. 大多数企业级Web服务器可以轻松处理10兆字节(如果不是更大)的POST请求。我经常在工作中遇到这个问题。

  3. 这已经完成了 - 对不起,我没有任何指示。

  4. HTTP遍历面向流的协议(如TCP),因此接收的字节数与接收时的顺序相同。没有“块”的概念。在TCP中 - 您发送一个字节流,接收器获取(按顺序)字节流。