改造 2:文件上传永远不会完成

Retrofit 2: File upload never finishes

我正在尝试将任意数量的文件上传到服务器。当我 运行 请求时,它只是无限期地做一些工作。没有抛出异常,没有调用回调方法。我将它与 RxJava 一起使用。因此,当我开始请求时 onSubscribe() 被调用,而 onNext()、onError()、onComplete() 永远不会被调用。

编辑: 如果我只发送 "msg" 没有任何文件的消息并且我可以在我的服务器上看到它,则请求有效。 这是我的代码:

@POST("some/address/")
@Multipart
Observable<ResponseBody> sendMessages(@Part("msg") String message,
                                      @Part("companion") Integer companion,
                                      @Part("description") RequestBody description,
                                      @Part List<MultipartBody.Part> files);

模型中的方法:

public Observable<ResponseBody> sendMessage(String message, int companion, RequestBody description, List<MultipartBody.Part> multiParts) {
    return mService.sendMessages(message, companion, description, multiParts).subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread());
}

演示者中的方法:

void sendMessage(String message, int companion, List<Uri> fileUris, Context context) {
    List<MultipartBody.Part> multiParts = new ArrayList<>();
    ContentResolver contentResolver = context.getContentResolver();
    for (int i = 0; i < fileUris.size(); i++) {
        Uri uri = fileUris.get(i);
        multiParts.add(createMultipart(uri, contentResolver));
    }
    RequestBody description = createPartFromString("hello, this is description speaking");
    Observable<ResponseBody> observable = mModel.sendMessage(message, companion, description, multiParts);
    observable.subscribe(new Observer<ResponseBody>() {
        @Override
        public void onSubscribe(Disposable d) {
            showProgress();
        }

        @Override
        public void onNext(ResponseBody value) {
            if (getView() != null) {
                getView().dataLoaded();
            }
        }

        @Override
        public void onError(Throwable e) {
            hideProgress();
        }

        @Override
        public void onComplete() {
            hideProgress();
        }
    });
}


@NonNull
private MultipartBody.Part createMultipart(Uri fileUri, ContentResolver contentResolver) {
    File file = new File(fileUri.toString());
    RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
    return MultipartBody.Part.createFormData("file", file.getName(), requestFile);
}

所以在仔细研究之后,我发现当没有从 Uri 正确检索文件时会发生这种行为。我使用了这个:File file = new File(fileUri.toString()); 我按照 FutureStudio 上关于文件上传的教程的建议使用了 FileUtils。