Android多个图像与凌空传递参数

时间:2017-06-17 17:42:58

标签: android android-volley

我正在尝试使用此代码上传多个图片,并且它可以正常工作。我遇到的问题是我将它们传递到一个地方params.put(KEY_IMAGE, encodedString)。而不是那样,我想通过多个键传递它们,所以在PHP之后找到它们会更容易。

选择图片:

ChooseBn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent in = galleryPhoto.openGalleryIntent();
        in.setType("image/*");
        in.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(in, GALLERY_REQUEST);
    }
});

上传图片

final MyCommand myCommand = new MyCommand(getApplicationContext());

UploadBn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        for (String imagePath : imageList) {
            try {
                Bitmap bitmap = PhotoLoader.init().from(imagePath).requestSize(500, 500).getBitmap();
                final String encodedString = ImageBase64.encode(bitmap);

                String url = "http://192.168.100.3/upload.php";
                StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getApplicationContext(), "Error while uploading image", Toast.LENGTH_SHORT).show();
                    }
                }) {

                    String name = NAME.getText().toString().trim();
                    String lat = LAT.getText().toString().trim();
                    String lng = LNG.getText().toString().trim();

                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {

                        Map<String, String> params = new HashMap<>();

                        params.put(KEY_IMAGE, encodedString);
                        params.put(KEY_NAME, name);
                        params.put(KEY_LAT, lat);
                        params.put(KEY_LNG, lng);

                        return params;
                    }
                };

                myCommand.add(stringRequest);

            } catch (FileNotFoundException e) {
                Toast.makeText(getApplicationContext(), "Error while loading image", Toast.LENGTH_SHORT).show();
            }
        }
    }
});

1 个答案:

答案 0 :(得分:0)

我想到了两种方法。

在这两个版本中,您需要一个自定义Image类:

public class Image {
    public String imageString;
    public String name;
    public double lat, lng;
}

使用toString()快速解决方案:

使用toString()并将其作为参数传递。

因此,您不会在imagePath中为单个imageList调用API,而是将单个Image对象作为参数添加到请求中,如下所示:

for (String imagePath : imageList) { 
    Image image = new Image();
    // Set image's properties here
    params.add(image.name, image.toString());
}

您要么解析您在Image.toString()中写的任何内容,要么更好,但您实际上可以以JSON格式返回该对象以简化服务器上​​的重新分析:

@Override
public String toString() {
    Gson gson = new Gson();
    return gson.toJson(this);
}

更好的解决方案:

更好的解决方案使用JsonArrayRequest使用已构建的Image类和Gson解析将所有Image个对象传递到一起。

JSONArray imageArray = null;
try {
    imageArray = new JSONArray(gson.toJson(imageList)); // Note that imageList is List<Image> and not List<String>
} catch (JSONException e) {
    e.printStackTrace();
}

JsonArrayRequest request = new JsonArrayRequest(Request.Method.POST, url, imageArray, new Response.Listener<JSONArray>() {
    @Override
    public void onResponse(JSONArray response) {
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
    }
});
  

请注意,在这两种解决方案中,您必须通过解析您将在服务器上收到的JSON来获取图像字符串。作为回报,您可以获得一个很好的结构。