gpt4 book ai didi

java - 如何使用 header "Range"分段发送文件?

转载 作者:行者123 更新时间:2023-11-30 04:11:59 25 4
gpt4 key购买 nike

我想通过将大文件分成小部分并分别发送来发送大文件。我尝试使用 hedder“Range”并得到“org.apache.http.client.NonRepeatableRequestException:无法使用不可重复的请求实体重试请求”。

// create authenticate client
DefaultHttpClient client = new DefaultHttpClient();

// create HTTP put with the file
HttpPut httpPut = new HttpPut(url);
final File recordingFile = new File(mDir, mName);
long fileLength = recordingFile.length();
for (int i=0; i < fileLength; i += 4096) {
int length = Math.min(4096, (int)recordingFile.length() - i);
InputStreamEntity entity = new InputStreamEntity(inputStream, length);
httpPut.setEntity(entity);
httpPut.addHeader("Connection", "Keep-Alive");
httpPut.addHeader("Range", "bytes=" + i + "-" + (i + length));

// Execute
HttpResponse res = client.execute(httpPut);
int statusCode = res.getStatusLine().getStatusCode();
}

我还尝试了“Content-Range” header (而不是“Range”),但我遇到了同样的异常。

httpPut.addHeader("Content-Range", "bytes=" + i + "-" + (i + length) + "/" + fileLength);
httpPut.addHeader("Accept-Ranges", "bytes");

最佳答案

您重复发送 4096 位的倍数。例如。让我们采取前两个步骤:我 = 0发送范围 0-4096我 = 4096发送范围4096-8192。

修正这一行:

for (int i=0; i <= fileLength; i += 4097) {
int length = Math.min(4096, (int)recordingFile.length() - i + 1);
/*...*/
}

它应该可以正常工作。

更新:也许问题是由于某些原因(例如身份验证失败)它尝试再次重新发送相同的 block ,在这种情况下输入流已经被消耗。尝试使用 ByteArrayEntity 而不是 InputStreamEntity,如下所示:

ByteArrayInputStream bis = new ByteArrayInputStream(recordingFile);
for (int i=0; i <= fileLength; i += 4097) {
int length = Math.min(4096, (int)recordingFile.length() - i + 1);
byte[] bytes = new byte[length];
bis.read(bytes);
ByteArrayEntity entity = ByteArrayEntity(bytes);
/*...*/
}

关于java - 如何使用 header "Range"分段发送文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10722559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com