gpt4 book ai didi

java - 如何使用 OkHttp 中止大文件上传?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:39 25 4
gpt4 key购买 nike

我正在使用 OkHttp 3.1.2。我创建了类似于原始配方的文件上传,可在此处找到:https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/PostMultipart.java

我找不到如何根据用户请求中止大文件上传的示例。我的意思不是如何获得用户请求,而是如何告诉 OkHttp 停止发送数据。到目前为止,我能想到的唯一解决方案是使用自定义 RequestBody,添加 abort() 方法并重写 writeTo() 方法,例如这个:

public void abort() {
aborted = true;
}

@Override
public void writeTo(BufferedSink sink) throws IOException {
Source source = null;
try {
source = Okio.source(mFile);
long transferred = 0;
long read;

while (!aborted && (read = source.read(sink.buffer(), SEGMENT_SIZE)) != -1) {
transferred += read;
sink.flush();
mListener.transferredSoFar(transferred);

}
} finally {
Util.closeQuietly(source);
}
}

还有其他办法吗?

最佳答案

事实证明这很简单:

只需保持对 Call 对象的引用,并在需要时取消它,如下所示:

private Call mCall;


private void executeRequest (Request request) {
mCall = mOkHttpClient.newCall(request);
try {
Response response = mCall.execute();
...
} catch (IOException e) {
if (!mCall.isCanceled()) {
mLogger.error("Error uploading file: {}", e);
uploadFailed(); // notify whoever is needed
}
}
}


public void abortUpload() {
if (mCall != null) {
mCall.cancel();
}
}

请注意,当您在上传时取消Call 时将抛出IOException,因此您必须检查catch 是否是已取消(如上所示),否则您将误报错误。

我认为同样的方法可以用于中止大文件的下载。

关于java - 如何使用 OkHttp 中止大文件上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35826767/

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