如何使用 lumen 通过 android 将图像文件上传到 cloudinary
How to upload an image file through android to cloudinary using lumen
我在 Lumen 中写了一些代码来上传图片到 cloudinary,代码在使用 postman 测试时有效。
现在我正在尝试通过 android 应用程序而不是通过邮递员上传图片,但由于某些原因这不起作用。
下面是我的 Lumen 应用程序的图片上传代码
$image_name = $request->file('picture')->getRealPath();
$cloudder = Cloudder::upload($image_name, null, [
'folder' => '/dog-lovers',
'discard_original_filename' => true,
]);
$uploadResult = $cloudder->getResult();
$file_url = $uploadResult["url"];
$input = $request->all();
$input['picture'] = $file_url;
$ad = Ad::create($input);
return array('error'=>false, 'message'=>'ad created successfully', 'data'=>$ad);
以上代码在邮递员上测试时完美运行。
然后我写了一些 android 代码将图像从我的 phone 传递到 Lumen
uploadImage.setOnClickListener(v -> {
Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
getIntent.setType("image/*");
Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*");
Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});
startActivityForResult(chooserIntent, PICK_IMAGE);
});
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImageUri = data.getData();
picturePath = getPath(getApplicationContext(), selectedImageUri);
Log.i("UploadAdActivity", picturePath);
Toast.makeText(this,picturePath, Toast.LENGTH_LONG).show();
}
}
public static String getPath(Context context, Uri uri ) {
String result = null;
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver( ).query( uri, proj, null, null, null );
if(cursor != null){
if ( cursor.moveToFirst( ) ) {
int column_index = cursor.getColumnIndexOrThrow( proj[0] );
result = cursor.getString( column_index );
}
cursor.close( );
}
if(result == null) {
result = "Not found";
}
return result;
}
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("picture", picturePath);
return params;
}
上面的代码不起作用,因为流明应用程序无法使用提供的路径获取图像,我显然在某处犯了错误,但我不知道它是什么,也不知道如何修复它。
如果有人能解释该怎么做/指出我做错了什么,那将非常有帮助
您似乎没有发送图像。在我们的日志中,我看到 Missing required parameter - file
。
您可以尝试使用图片 URL(例如 https://res.cloudinary.com/demo/image/upload/v1561532539/sample.jpg)上传吗?
好吧,这可能对某些人有用,我做错了几件事
我使用的是 Volley 字符串请求而不是 Volley 多部分请求
VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, URLs.URL_UPLOAD_AD,
您需要使用 ByteData
传递 picture/file
@Override
protected Map<String, VolleyMultipartRequest.DataPart> getByteData() {
Map<String, VolleyMultipartRequest.DataPart> params = new HashMap<>();
long imageName = System.currentTimeMillis();
params.put("picture", new DataPart(imageName + ".png", getFileDataFromDrawable(bitmap))); mCoverImage.getDrawable()), "image/jpeg"));
return params;
}
您需要使用
设置Headers
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
return headers;
}
我在 Lumen 中写了一些代码来上传图片到 cloudinary,代码在使用 postman 测试时有效。
现在我正在尝试通过 android 应用程序而不是通过邮递员上传图片,但由于某些原因这不起作用。
下面是我的 Lumen 应用程序的图片上传代码
$image_name = $request->file('picture')->getRealPath();
$cloudder = Cloudder::upload($image_name, null, [
'folder' => '/dog-lovers',
'discard_original_filename' => true,
]);
$uploadResult = $cloudder->getResult();
$file_url = $uploadResult["url"];
$input = $request->all();
$input['picture'] = $file_url;
$ad = Ad::create($input);
return array('error'=>false, 'message'=>'ad created successfully', 'data'=>$ad);
以上代码在邮递员上测试时完美运行。
然后我写了一些 android 代码将图像从我的 phone 传递到 Lumen
uploadImage.setOnClickListener(v -> {
Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
getIntent.setType("image/*");
Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setType("image/*");
Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});
startActivityForResult(chooserIntent, PICK_IMAGE);
});
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImageUri = data.getData();
picturePath = getPath(getApplicationContext(), selectedImageUri);
Log.i("UploadAdActivity", picturePath);
Toast.makeText(this,picturePath, Toast.LENGTH_LONG).show();
}
}
public static String getPath(Context context, Uri uri ) {
String result = null;
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver( ).query( uri, proj, null, null, null );
if(cursor != null){
if ( cursor.moveToFirst( ) ) {
int column_index = cursor.getColumnIndexOrThrow( proj[0] );
result = cursor.getString( column_index );
}
cursor.close( );
}
if(result == null) {
result = "Not found";
}
return result;
}
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("picture", picturePath);
return params;
}
上面的代码不起作用,因为流明应用程序无法使用提供的路径获取图像,我显然在某处犯了错误,但我不知道它是什么,也不知道如何修复它。
如果有人能解释该怎么做/指出我做错了什么,那将非常有帮助
您似乎没有发送图像。在我们的日志中,我看到 Missing required parameter - file
。
您可以尝试使用图片 URL(例如 https://res.cloudinary.com/demo/image/upload/v1561532539/sample.jpg)上传吗?
好吧,这可能对某些人有用,我做错了几件事
我使用的是 Volley 字符串请求而不是 Volley 多部分请求
VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, URLs.URL_UPLOAD_AD,
您需要使用 ByteData
传递 picture/file@Override protected Map<String, VolleyMultipartRequest.DataPart> getByteData() { Map<String, VolleyMultipartRequest.DataPart> params = new HashMap<>(); long imageName = System.currentTimeMillis(); params.put("picture", new DataPart(imageName + ".png", getFileDataFromDrawable(bitmap))); mCoverImage.getDrawable()), "image/jpeg")); return params; }
您需要使用
设置Headers@Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String, String>(); return headers; }