使用 volley multipart android 上传多张图片
upload multiple images using 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();
}
我通过在 for 循环中迭代图像并在每个执行的 for 循环中添加 other_images[i] 参数来解决这个问题
for (i in images.indices) {
stockArr[i] = images[i]
try {
val imageName2 = System.currentTimeMillis()
params["other_images[$i]"] = DataPart("$imageName2.png", getFileDataFromDrawable(stockArr[i]!!))
} catch (e: Exception) {
e.printStackTrace()
}
}
return params
像这样调用 getBytes 方法
不需要创建Arraylist来收集位图。
ArrayList<Bitmap> images;
// 创建数组来收集图像也在oncreateview方法中初始化。
images.add(bitmap)
// 在 onActivityResult
中添加任意数量的图片
此请求的其他部分访问upload multiple images这是针对单张图片上传并实现多张代码的打击
@Override
protected Map<String, VolleyMultipartRequest.DataPart> getByteData() {
Map<String, VolleyMultipartRequest.DataPart> params = new HashMap<>();
for (int i = 0; i < images.size(); i++) {
long imageName2 = System.currentTimeMillis();
params.put("images["+i+"]", new DataPart(imageName2 + ".jpg", getFileDataFromDrawableData(images.get(i))));
}
return params;
}
public byte[] getFileDataFromDrawableData(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(bitmap.getByteCount());
bitmap.compress(Bitmap.CompressFormat.JPEG, 60, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
bitmap.recycle();
return byteArray;
}
我在 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();
}
我通过在 for 循环中迭代图像并在每个执行的 for 循环中添加 other_images[i] 参数来解决这个问题
for (i in images.indices) {
stockArr[i] = images[i]
try {
val imageName2 = System.currentTimeMillis()
params["other_images[$i]"] = DataPart("$imageName2.png", getFileDataFromDrawable(stockArr[i]!!))
} catch (e: Exception) {
e.printStackTrace()
}
}
return params
像这样调用 getBytes 方法
不需要创建Arraylist来收集位图。
ArrayList<Bitmap> images;
// 创建数组来收集图像也在oncreateview方法中初始化。
images.add(bitmap)
// 在 onActivityResult
此请求的其他部分访问upload multiple images这是针对单张图片上传并实现多张代码的打击
@Override
protected Map<String, VolleyMultipartRequest.DataPart> getByteData() {
Map<String, VolleyMultipartRequest.DataPart> params = new HashMap<>();
for (int i = 0; i < images.size(); i++) {
long imageName2 = System.currentTimeMillis();
params.put("images["+i+"]", new DataPart(imageName2 + ".jpg", getFileDataFromDrawableData(images.get(i))));
}
return params;
}
public byte[] getFileDataFromDrawableData(Bitmap bitmap) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(bitmap.getByteCount());
bitmap.compress(Bitmap.CompressFormat.JPEG, 60, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
bitmap.recycle();
return byteArray;
}