【发布时间】: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,而且如果这样做了,它会丢失我猜的文件类型?