使用 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;
        }