首页 > 解决方案 > 使用 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;
        }

但只有最后选择的图像被上传。我究竟做错了什么?我怎样才能正确地做到这一点?

标签: javaandroidandroid-volley

解决方案


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();
    }

推荐阅读