我正在尝试使用此代码上传多个图片,并且它可以正常工作。我遇到的问题是我将它们传递到一个地方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();
}
}
}
});
答案 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来获取图像字符串。作为回报,您可以获得一个很好的结构。