【问题标题】:Cloudinary - Missing required parameterCloudinary - 缺少必需的参数
【发布时间】:2016-06-29 14:43:13
【问题描述】:

在浏览 Cloudinary Docs 和其他几篇文章以及其他网站后,我遇到了某种错误,再加上阅读堆栈跟踪,我认为我的将图像上传到服务器的语法不应该是这样,虽然我从文档中的示例中清楚地了解,但我无法根据堆栈跟踪中的错误应用正确的方法。

我的堆栈跟踪给了我这个错误: 原因:java.lang.RuntimeException: Missing required parameter - file

我的代码如下:

public class Upload extends AppCompatActivity implements View.OnClickListener {


public static final int RESULT_LOAD_IMAGE = 1;
ImageView imgToUpload;
Button buttonUploadSubmit;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.upload);
    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    imgToUpload = (ImageView) findViewById(R.id.imgToUpload);
    buttonUploadSubmit = (Button) findViewById(R.id.ButtonUploadSubmit);

    imgToUpload.setOnClickListener(this);
    buttonUploadSubmit.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.imgToUpload:
            Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE);
            break;

        case R.id.ButtonUploadSubmit:
            UploadTask uploadTask = new UploadTask();
            uploadTask.execute();

            break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Uri selectedVideo = data.getData();
    imgToUpload.setImageURI(selectedVideo);
    Toast.makeText(getApplicationContext(), selectedVideo.toString(), Toast.LENGTH_LONG).show();
    Toast.makeText(getApplicationContext(), imgToUpload.toString(), Toast.LENGTH_LONG).show();
}



class UploadTask extends AsyncTask<String, Void, Void> {

    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(Upload.this);
        progressDialog.setTitle("Upload in Progress ...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMax(100);
        progressDialog.setProgress(0);
        progressDialog.show();
    }

    @Override
    protected Void doInBackground(String... params) {

       Map config = new HashMap();
                       config.put("cloud_name", "xxxxxxx");
                       config.put("api_key", "xxxxxxxxxxxxxx");
                       config.put("api_secret", "xxxxxxxxxxx");
                       Cloudinary cloudinary = new Cloudinary(config);
                       try {
                           cloudinary.uploader().upload(imgToUpload, ObjectUtils.asMap("resource_type", "auto"));
                       } catch (IOException e) {
                           e.printStackTrace();
                       }


        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
    }


}

} 我猜想在 cloudaniry 上传方法中不接受 imgToUpload:

cloudinary.uploader().upload( imgToUpload,
                ObjectUtils.asMap("resource_type", "auto"));

因为它不是“文件”,根据堆栈跟踪,这就是我所缺少的,因此如果有人能确认这一点,我将不胜感激,并请指导我使用此方法的正确语法或创建从 ImageView 中选择图片的文件并将该文件包含在 Cloudinary 上传方法中?

堆栈跟踪:

  03-15 14:32:14.260 17683-20341/net.we4x4.we4x4 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
 Process: net.we4x4.we4x4, PID: 17683
                                                             java.lang.RuntimeException: An error occured while executing doInBackground()
                                                                 at android.os.AsyncTask$3.done(AsyncTask.java:300)
                                                                 at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                                                                 at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                                                                 at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                 at java.lang.Thread.run(Thread.java:841)
                                                              Caused by: java.lang.RuntimeException: Missing required parameter - file
                                                                 at com.cloudinary.android.UploaderStrategy.callApi(UploaderStrategy.java:106)
                                                                 at com.cloudinary.Uploader.callApi(Uploader.java:22)
                                                                 at com.cloudinary.Uploader.upload(Uploader.java:55)
                                                                 at net.we4x4.we4x4.Upload$UploadTask.doInBackground(Upload.java:100)
                                                                 at net.we4x4.we4x4.Upload$UploadTask.doInBackground(Upload.java:77)
                                                                 at android.os.AsyncTask$2.call(AsyncTask.java:288)
                                                                 at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                 at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                                                                 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                                 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                                 at java.lang.Thread.run(Thread.java:841) 

所以我能够上传图片,提供以下路径: /storage/emulated/0/Pictures/Screenshots/Screenshot_2016-03-09-15-40-13.png

但是通过手动将其写入Upload方法,并且我手动从手机中获取代码,只是查看图片的详细信息,因此我现在的问题是如何在ImageView中获取显示图片的路径?

progressBar 也刚刚出现,在 0 上并没有改变,我必须检查网站/服务器以查看图片是否已上传......我不确定是什么导致进度条无法运行/冻结!?

如果有任何指导,我将不胜感激。

【问题讨论】:

  • 我猜 imgToUpload 是一个 Url 你检查过是一个完全合格的 url 吗?或者,如果您正在使用设备,您可以尝试使用作为 upload(java.io.File) 它可以澄清问题。对于该问题,当文件无法到达 api 时,它会给出错误文件丢失。
  • @FZE 非常感谢 Cloudinary Docs 的回复。建议 Uri 类似((例如,'/home/my_image.jpg'),但我从“selectedImage”Toast 得到的是:media://external/images/411 缺少名称中的图像类型(411.JPEG),另外,我不能在 Cloudinary 上传中添加“selectedImage”,在 onActivityResult 之外,当我尝试 Toast“imgToUpload”时,我只得到“support.android.AppCompact ......小部件......”所以我猜它没有按照我在 onActivityResult 中的要求将其设置为 selectedImage Uri,而且如果这样做了,它会丢失我猜的文件类型?

标签: android-studio cloudinary


【解决方案1】:

您还可以将 ImageView 结果转换为 Base64 并将字符串发送到 Cloudinary。

否则,您可以提供https://github.com/cloudinary/cloudinary_java/blob/master/cloudinary-android/src/main/java/com/cloudinary/android/UploaderStrategy.java#L65-L77中定义的任何一种类型

【讨论】:

    【解决方案2】:

    好吧,问题解决了,由于某种原因,从一个 API 到另一个 API,获取文件图像的真实路径有点棘手,不知道为什么,或者是否有另一种我还没有发现的简单方法,但是根据到几个职位,例如: android get real path by Uri.getPath()

    考虑到API,您可以通过帖子中给出的方法进行转换,从Uri获取实际图像路径。

    而且由于 Cloudinary 要求上传文件,因此需要提供设备上文件的实际路径,或者他们的文档中提到的其他方式。必须通过获取文件的实际路径来解决这个障碍 http://cloudinary.com/documentation/upload_images#api_example_1

    以下是Android Studio中上传文件到Cloudinary的代码;

        @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.imgToUpload:
                Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(galleryIntent, RESULT_LOAD_IMAGE);
    
                break;
            case R.id.ButtonUploadSubmit:
                UploadTask uploadTask = new UploadTask();
                uploadTask.execute(String.valueOf(vidToUpload));
    
                break;
        }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null) {
            Uri selectedImgPath = data.getData();
            RealImgPath = Uri.parse(getPath(selectedImgPath));
            Toast.makeText(getApplicationContext(), " " + RealImgPath, Toast.LENGTH_LONG).show();
    
        }
    
    }
    
    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    
    
    class UploadTask extends AsyncTask<String, Void, Void> {
    
        ProgressDialog progressDialog;
    
        @Override
        protected void onPreExecute() {
            progressDialog = new ProgressDialog(Upload.this);
            progressDialog.setTitle("Upload in Progress ...");
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setMax(100);
            progressDialog.setProgress(0);
            progressDialog.show();
        }
    
        @Override
        protected Void doInBackground(String... params) {
    
            Map config = new HashMap();
            config.put("cloud_name", "xxxxxx");
            config.put("api_key", "xxxxxxxxxxxxxxx");
            config.put("api_secret", "xxxxxxxxxxxxxxxxxxx");
            Cloudinary cloudinary = new Cloudinary(config);
            try {
                cloudinary.uploader().upload(""+RealImgPath, ObjectUtils.asMap("resource_type", "auto"));
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
            return null;
        }
    
        @Override
        protected void onPostExecute(Void aVoid) {
            progressDialog.dismiss();
            super.onPostExecute(aVoid);
        }
    }
    

    我希望这对某人有用,并免除他们为了实现这一目标而必须经历的几天的探索探险,因为 Cloudinary Docs。有点缺乏一些具体信息,Stakcoverflow 缺乏一些关于 Cloudinary 特定帖子的帖子,考虑到我在学习的过程中也延长了这个简单的问题。

    需要注意的是,上面的代码仍然不完美,因为进度对话框仍然不能正常工作(弹出并冻结 - 没有进度)并且从意图库中选择的图片不会显示在 ImageView 上应该是,现在需要解决这个问题。

    【讨论】:

      猜你喜欢
      • 2019-10-26
      • 2021-06-02
      • 2016-10-30
      • 1970-01-01
      • 2022-01-10
      • 2021-11-05
      • 2018-10-28
      • 2018-12-01
      相关资源
      最近更新 更多