【发布时间】:2018-02-12 16:39:33
【问题描述】:
我尝试使用 Retrofit 上传图片,但出现此错误:
Unable to submit post to API: java.io.FileNotFoundException: /document/image:30231: open failed: ENOENT (No such file or directory)
我的界面是这样的:
public interface MyService{
@Multipart
@POST("/url")
Call<ResponseBody> addNewEvent( @Part("case_Id") int caseId,@Part MultipartBody.Part(file);
}
在按钮点击时,selectImage() 函数被调用:
private void selectImage() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Please select image",1);
}
在onActivityResult 部分,我做了以下操作:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode!=RESULT_CANCELED && resultCode == RESULT_OK && data != null && data.getData() != null) {
FilePathUri = data.getData();
doAddNewEvent();
}
}
从上面,doAddNewEvent() 函数被调用:
public void doAddNewEvent() {
File file = new File(FilePathuri.getPath());
RequestBody requestFile=RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestFile);
apiService.addNewEvent(inputCaseId, body).enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()) {
ResponseBody addEventResponse = response.body();
Log.d("as", "response: " + addEventResponse);
finish();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e("as", "Unable to submit post to API");
}
});
}
【问题讨论】:
-
getPath()调试代码时出现问题。检查This discussion或者你也可以搜索类似的。 -
在
FilePathUri.getPath(),我明白了:/document/image:23165 -
java.io.FileNotFoundException: /document/image:30231:。实际上,这不是文件系统上的有效路径。那是内容方案的一部分。完整的方案由 FilePathUri.toString() 给出。 -
有什么方法可以让我找到正确的路径吗?
-
你应该问:有什么办法可以改造让我直接使用获得的uri?还是内容方案?你可以让改造从流上传文件吗?来自 InputStream?
标签: android retrofit2 image-uploading multipart