通过改造将图像顺序上传到REST API

时间:2016-04-23 16:59:49

标签: android file-upload retrofit rx-java

我正在寻找一种实施策略,将多个图像按顺序上传到服务器。我正在使用http://uploads.im中的API来上传我的图片。 不允许在一个多部分POST请求中选择多个图像。因此,我必须按顺序上传图像。

我有一个界面,如下所示。  enter image description here

用户将"点击"多张照片,必须上传到http://uploads.im。一旦我使用上传图片的网址从API获得成功回复,我需要上传另一个,依此类推。此外,一旦我将所有图像上传到图像服务器,我需要将URL列表发送到存储这些详细信息的服务器。

这是我到目前为止所做的事情

@OnClick({R.id.pic_photo_0
        , R.id.pic_photo_1
        , R.id.pic_photo_2
        , R.id.pic_photo_3
}) //Bind with butterknife
public void onClickPhotoFrame(View view)
{
    // Start CameraActivity
    Intent startCustomCameraIntent = new Intent(this, CameraActivity.class);
    startActivityForResult(startCustomCameraIntent, REQUEST_CAMERA);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode != RESULT_OK)
    {
        return;
    }

    if (requestCode == REQUEST_CAMERA)
    {
        Uri photoUri = data.getData();
        //based on which imageview created the camera request, load it with the above image
        Picasso.with(getApplicationContext()).load(photoUri).fit().into(imageView0);
    }
}

1)在上面的代码中是否可以知道哪个视图称为onActivityResult方法?基于此,我可以使用相机中的缩略图设置图像视图。

2)我还将相机返回的uri添加到arraylist中,稍后可以使用它来循环和上传图像。如果这种方法没问题,请告诉我。

我通过改装

上传图片如下
for (int i = 0; i < imageStorageList.size(); i++)
{
    Call<ImageUploadResponse> call = new ImageUploadHelper().
            UploadImage(new File(imageStorageList.get(i).getPath()));

    call.enqueue(new Callback<ImageUploadResponse>()
    {
        @Override
        public void onResponse(Call<ImageUploadResponse> call, Response<ImageUploadResponse> response)
        {
            // do some magic here to know which image was uploaded
        }

        @Override
        public void onFailure(Call<ImageUploadResponse> call, Throwable t)
        {


        }
    });
}

3)我很确定上述策略不行。请帮我解决一下这个问题。

1 个答案:

答案 0 :(得分:2)

  

1)在上面的代码中可以知道哪个视图称为   onActivityResult方法?基于此我可以设置imageview   来自相机的缩略图。

没有标准的方法可以知道哪个View启动了相机Intent。如果你真的需要知道它,你可以创建局部变量:

private ImageView lastClickedView;

然后在onClickPhotoFrame中执行此操作:

public void onClickPhotoFrame(View view){
    lastClickedView = (ImageView) view;
    // Start CameraActivity
    Intent startCustomCameraIntent = new Intent(this, CameraActivity.class);
    startActivityForResult(startCustomCameraIntent, REQUEST_CAMERA);
}

onActivityResult中为这种情况添加处理:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode != RESULT_OK)
    {
        return;
    }

    if (requestCode == REQUEST_CAMERA)
    {
        Uri photoUri = data.getData();
        //based on which imageview created the camera request, load it with the above image
        Picasso.with(getApplicationContext()).load(photoUri).fit().into(lastClickedView);
    }
}
  

2)我还将相机返回的uri添加到arraylist,   可以在以后用于循环和上传图像。请让我   知道这种方法是否合适。

在我看来,你的方法还可以。但我已经看到了你的另一个答案:Call same retrofit method sequentially for result using RxJava

据我所知,您希望使用RxJava。

所以,这是一种可能的方法(从你的答案中复制并稍作改动):

Observable.from(imageStorageList)
          .flatMap(uri -> new ImageUploadHelper().uploadImage(new File(uri.getPath())))
           .subscribe(imageUploadResponseObservable -> {

                }, throwable -> {/*handle it here*/});

优点:

  • 简单实施

缺点:

  • 实际上这个变体并不能处理错误。我的意思是,在错误的情况下,您需要尝试再次上传图像。

如何解决这个问题?

我。没有RxJava,就像在工作上一样。并使用库android-priority-jobqueue。这些工作将持久,在错误的情况下,它们将以指数后退重复。

II。实施您自己的机制,该机制将在服务器上传图像,并且会持续存在。