java - 使用 volley multipart android 上传多张图片
问题描述
我在android中编写了一些代码来将单个位图上传到我的服务器,现在我正在尝试将多个图像上传到我的服务器,但只有最后一个选择的图像被上传
下面是我如何在我的onActivityResult中获取位图图像
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PICK_IMAGE && resultCode == RESULT_OK && null != data) {
if (data.getClipData() != null) {
int count = data.getClipData().getItemCount();
int currentItem = 0;
while (currentItem < count) {
Uri imageUri = data.getClipData().getItemAt(currentItem).getUri();
currentItem = currentItem + 1;
try {
arrayList.add(imageUri);
images.add(MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), imageUri)); // Code to handle multiple images
} catch (Exception e) {
Log.e(TAG, "File select error", e);
}
}
} else if (data.getData() != null) {
final Uri uri = data.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), uri);
mCoverImage.setImageBitmap(bitmap);
} catch (Exception e) {
Log.e(TAG, "File select error", e);
}
}
}
}
下面是用于将单张图片上传到服务器的代码
public byte[] getFileDataFromDrawable(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
}
@Override
protected Map<String, VolleyMultipartRequest.DataPart> getByteData() {
Map<String, VolleyMultipartRequest.DataPart> params = new HashMap<>();
long imageName = System.currentTimeMillis();
params.put("featured_image", new DataPart(imageName + ".png", getFileDataFromDrawable(bitmap)));
return params;
}
上面的代码工作正常
下面是用于将多张图片上传到服务器的代码
public byte[] getFileArrayDataFromDrawable(Bitmap[] bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
for (int i = 0; i < bitmap.length; i++) {
bitmap[i].compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
}
return byteArrayOutputStream.toByteArray();
}
@Override
protected Map<String, VolleyMultipartRequest.DataPart> getByteData() {
Map<String, VolleyMultipartRequest.DataPart> params = new HashMap<>();
Bitmap stockArr[] = new Bitmap[images.size()];
for (int i = 0; i < images.size(); i++) {
stockArr[i] = images.get(i;
}
long imageName2 = System.currentTimeMillis();
params.put("other_images[]", new DataPart(imageName2 + ".png", getFileArrayDataFromDrawable(stockArr)));
return params;
}
但只有最后选择的图像被上传。我究竟做错了什么?我怎样才能正确地做到这一点?
解决方案
compress
仅保存最后一个位图以byteArrayOutputStream
尝试此代码
@Override
protected Map<String, VolleyMultipartRequest.DataPart> getByteData() {
Map<String, List<VolleyMultipartRequest.DataPart>> params = new HashMap<>();
Bitmap stockArr[] = new Bitmap[images.size()];
for (int i = 0; i < images.size(); i++) {
stockArr[i] = images.get(i);
}
ArrayList<VolleyMultipartRequest.DataPart> parts = new ArrayList<VolleyMultipartRequest.DataPart>();
for (Bitmap bitmap : stockArr) {
long imageName2 = System.currentTimeMillis();
parts.add(new DataPart(imageName2 + ".png", getFileArrayDataFromDrawable(bitmap)));
}
params.put("other_images[]", parts);
return params;
}
public byte[] getFileArrayDataFromDrawable(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
}
推荐阅读
- tensorflow - keras 神经网络中的逐层传播(LRP)
- excel - 从文本中提取日期,格式不正确
- html - width: 100% 和 white-space: nowrap 导致输入元素超过父元素的宽度
- sas - SAS EG:从 Today() 中提取月份以用于 IF 语句
- google-authenticator - 使用两次或更多设备检查时错误获取 OTP
- laravel - ORA-01789: 查询块的结果列数不正确?
- javascript - 将 addeventlistener 添加到节点列表
- django - 如何在 Django 模型中拥有喜欢/不喜欢的机制
- laravel - 发布并获取索引控制器 laravel
- visual-studio - 如何以编程方式检查 Visual Studio 扩展中的堆栈?