我正在尝试将任意数量的文件上传到服务器。当我运行请求时,它只是无限期地完成一些工作。抛出没有异常,没有调用回调方法。我正在使用它与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());
}
演讲者中的Meethod:
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);
}
答案 0 :(得分:0)
所以在挖掘之后,我发现当没有正确地从Uri检索File时会发生这种行为。我用过这个:File file = new File(fileUri.toString());
我已经按照FutureStudio关于文件上传的教程的建议使用了FileUtils。