改造 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。
我正在尝试将任意数量的文件上传到服务器。当我 运行 请求时,它只是无限期地做一些工作。没有抛出异常,没有调用回调方法。我将它与 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。