Retrofit多部分请求是否支持暂停和恢复?

13

我们正在使用Retrofit多部分来进行文件上传过程。

我们希望在文件上传时能够暂停/恢复上传。

我想知道这是否可能?

多部分文件上传的代码

  RequestBody requestFile =
            RequestBody.create(MediaType.parse("multipart/form-data"), file);

  // MultipartBody.Part is used to send also the actual file name
  MultipartBody.Part body =MultipartBody.Part.createFormData("image", file.getName(), requestFile);
  Call<ResponseBody> call= api.uploadFile(body);

请阅读[提问指南]以获取有关如何改进您的问题的提示。特别是,“是否可能”对于此网站来说不够具体。 - Code-Apprentice
6
@Code-Apprentice,我明确提出了具体问题。这不是一个广泛的问题,我也没有要求教程或编写代码之类的东西。 - Ranjithkumar
你可以查看这个链接: https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload - Lalit Jadav
这可能会有帮助 https://dev59.com/X5vga4cB1Zd3GeqP1m28#49364158 - RoyalGriffin
2个回答

8
是的,这是有可能的。您需要创建自己的请求主体。
   public class PausableRequestBody extends RequestBody {
    private static final int BUFFER_SIZE = 2048;
    private File mFile;
    private long uploadedData;

    public PausableRequestBody(final File file) {
        mFile = file;
    }

    @Override
    public MediaType contentType() {
        return MediaType.parse("image/*");
    }

    @Override
    public long contentLength() throws IOException {
        return mFile.length();
    }

    @Override
    public void writeTo(BufferedSink bs) throws IOException {
        long fileLength = mFile.length();
        byte[] buffer = new byte[BUFFER_SIZE];
        FileInputStream in = new FileInputStream(mFile);

        try {
            int read;
            while ((read = in.read(buffer)) != -1) {
                this.uploadedData += read;
                bs.write(buffer, 0, read);
            }
        } finally {
            in.close();
        }
    }

    public long getUploadedData() {
        return uploadedData;
    }
}

请使用append而不是write。
请使用以下Retrofit调用:
PausableRequestBody fileBody = new PausableRequestBody(file, this);
        MultipartBody.Part filePart = MultipartBody.Part.createFormData("image", file.getName(), fileBody);

        Call<JsonObject> request = RetrofitClient.uploadImage(filepart);
        request.enqueue(new Callback<JsonObject>{...});

要暂停请求,您需要取消调用请求。

request.cancel()

要重新开始,请使用相同的PausableRequestBody对象,并使用上面提到的相同方法。


1
暂停请求在哪里? - Ranjithkumar
暂停操作需要取消上述请求。 - aanshu
1
如果我重新启动,它会从第一次还是暂停的位置开始? - Ranjithkumar
为此,您需要执行追加操作而不是写入操作。 - aanshu
如果我使用bs.append() -> 它会从暂停的位置继续吗?难以置信.. 我会给你赏金.. 你能给出详细的答案吗?我希望它看起来是可行的解决方案。 - Ranjithkumar
显示剩余6条评论

2
根据Square公司的Jake Wharton的建议,
Retrofit没有内置的暂停或恢复功能。
如果您想继续使用Retrofit,则可能需要使您的后端支持范围请求。这可以帮助您在流式下载期间随时中断连接。然后,您可以在每个后续请求中使用范围标头来支持暂停或恢复下载
您还可以检查使用OkHttp的此答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接