ENOENT 没有这样的文件或目录使用图像选择器库并以各种方式转换路径,Android 图片上传问题
ENOENT no such file or directory using image picker library and transforming the path every which way, Android image upload issue
我已经看到了这个问题的变体并尝试了一大堆不同的东西,包括将整个东西编码为一个字符串等等。基本上,我从 Android 图像选择器库 (Fishbun) 获取图像路径数组,然后将该数组成功传递给另一个片段,该片段应该上传它。
从那里开始,我使用 Koush 的 Ion 框架来完成所有网络(应用程序中 99.99% 的网络都在使用它,所以它是更可取的,尽管如果事实证明这是问题)。
上传片段中的相关方法:
private void uploadImage(String adId, String fileUri, Context context){
final ProgressDialog progress=new ProgressDialog(context);
progress.setMessage("Uploading Images");
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progress.setIndeterminate(false);
progress.setProgress(0);
progress.show();
String url = <URL HERE>;
Log.d(TAG,"Uri: "+ fileUri);
Uri uri = Uri.parse(fileUri);
// creating a file body consisting of the file that we want to
// send to the server
File bin = new File(getRealPathFromURI(uri));
if(bin != null){
Ion.with(getContext())
.load("POST",url)
.uploadProgressDialog(progress).setMultipartFile("image", bin).asJsonObject().setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
if(e != null){
Log.e("error", e.getLocalizedMessage());
}else{
Log.e("result", result.getAsString());
}
}
});
}else {
Log.d(TAG, "couldn't create file");
}
}
private String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = getContext().getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file path
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
相关堆栈跟踪:
E/error: /api/v2/adverts/102847259/images: open failed: ENOENT (No such file or directory)
这是文件路径到达片段时的样子,然后我使用上述方法将其转换为真实文件路径:
/storage/emulated/0/Pictures/Screenshots/Screenshot_20160516-130248.png
看起来你的 URL 是文件路径而不是 http url。 ENOENT 表示它正在尝试打开本地文件,但失败了。检查调试器中的值。
我已经看到了这个问题的变体并尝试了一大堆不同的东西,包括将整个东西编码为一个字符串等等。基本上,我从 Android 图像选择器库 (Fishbun) 获取图像路径数组,然后将该数组成功传递给另一个片段,该片段应该上传它。
从那里开始,我使用 Koush 的 Ion 框架来完成所有网络(应用程序中 99.99% 的网络都在使用它,所以它是更可取的,尽管如果事实证明这是问题)。
上传片段中的相关方法:
private void uploadImage(String adId, String fileUri, Context context){
final ProgressDialog progress=new ProgressDialog(context);
progress.setMessage("Uploading Images");
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progress.setIndeterminate(false);
progress.setProgress(0);
progress.show();
String url = <URL HERE>;
Log.d(TAG,"Uri: "+ fileUri);
Uri uri = Uri.parse(fileUri);
// creating a file body consisting of the file that we want to
// send to the server
File bin = new File(getRealPathFromURI(uri));
if(bin != null){
Ion.with(getContext())
.load("POST",url)
.uploadProgressDialog(progress).setMultipartFile("image", bin).asJsonObject().setCallback(new FutureCallback<JsonObject>() {
@Override
public void onCompleted(Exception e, JsonObject result) {
if(e != null){
Log.e("error", e.getLocalizedMessage());
}else{
Log.e("result", result.getAsString());
}
}
});
}else {
Log.d(TAG, "couldn't create file");
}
}
private String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = getContext().getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file path
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
相关堆栈跟踪:
E/error: /api/v2/adverts/102847259/images: open failed: ENOENT (No such file or directory)
这是文件路径到达片段时的样子,然后我使用上述方法将其转换为真实文件路径:
/storage/emulated/0/Pictures/Screenshots/Screenshot_20160516-130248.png
看起来你的 URL 是文件路径而不是 http url。 ENOENT 表示它正在尝试打开本地文件,但失败了。检查调试器中的值。