【问题标题】:retrofit 2 multipart send only array file instead of part with array改造 2 多部分仅发送数组文件而不是包含数组的部分
【发布时间】:2016-04-20 23:22:55
【问题描述】:

我正在尝试使用 multipart/form-data 发送 POST。我遇到了一些问题,这些问题在这个论坛上得到了解决,比如额外的报价以及如何发送多个文件。但是现在,我想在一个数组中发送具有唯一名称的文件。我会附上两个文件来更好地表达我想做的事情。

我正在接收这样的文件...

我想收到这样的文件...

是否可以使用改造 2 更改正文数据结构?我想将 mimetype 数据从 multipart/form-data 更改为 image/jpeg。

一些代码

HashMap<String, RequestBody> files = attachFile();

    api.createPlant(plant.getName(),
            plant.getSize(), plant.getPhSoil(), plant.getEcSoil(), plant.getGardenId(), files)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<Plant>() {
                @Override
                public final void onCompleted() {
                    Log.e(TAG, "on completed");
                }

                @Override
                public final void onError(Throwable e) {
                    Log.e(TAG, e.getMessage());
                }

                @Override
                public final void onNext(Plant response) {
                    mBody.setText(response.toString());
                }
            });

private HashMap<String, RequestBody> attachFile() {

    ArrayList<String> listOfNames = new ArrayList<>();
    listOfNames.add("images");
    listOfNames.add("mango-lg2");

    HashMap<String, RequestBody> map = new HashMap<>(listOfNames.size());
    RequestBody file = null;
    File f = null;

    for(int i = 0, size = listOfNames.size(); i<size;i++){

        try {

            File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

            f = new File(folder, listOfNames.get(i) + ".jpg");

            Bitmap bitmap = convertFileToBitmap(f);

            if(bitmap != null){
                FileOutputStream fos = new FileOutputStream(f);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 0 /*ignored for PNG*/, fos);
                fos.flush();
                fos.close();
            }else{
                Log.i("INFO", "imageNotFound");
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        file = RequestBody.create(MediaType.parse("multipart/form-data"), f);
        map.put("file\"; filename=\"" + listOfNames.get(i) + ".jpg",file);
        file = null;
        f = null;
    }
    return map;
}

【问题讨论】:

    标签: android rx-java retrofit2


    【解决方案1】:

    我使用 MultipartBody.Builder 解决了我的问题,并使用 RequestBody 发送数据。

    MultipartBody.Builder builder = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("name", plant.getName())
                .addFormDataPart("size", String.valueOf(plant.getSize()));
    
        ArrayList<File> files = new ArrayList<>();
    
        File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    
        files.add(new File(folder, "images.jpg"));
        files.add(new File(folder, "mango-lg2.jpg"));
    
        builder = addImagesToRequestBody(builder, files);
    
        api.createPlant(builder.build())
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Plant>() {
                    @Override
                    public final void onCompleted() {
                        Log.e(TAG, "on completed");
                    }
    
                    @Override
                    public final void onError(Throwable e) {
                        Log.e(TAG, e.getMessage());
                    }
    
                    @Override
                    public final void onNext(Plant response) {
                        mBody.setText(response.toString());
                    }
                });
    

    辅助方法

    private MultipartBody.Builder addImagesToRequestBody(MultipartBody.Builder builder, ArrayList<File> files){
    
        for(int i = 0, size = files.size(); i<size;i++){
            String mediaType = "image/" + getMediaType(files.get(i));
            RequestBody image = RequestBody.create(MediaType.parse(mediaType), files.get(i));
            builder.addFormDataPart(files.get(i).getName(), files.get(i).getName(), image);
        }
    
        return builder;
    }
    
    private String getMediaType(File file) {
        return file.getAbsolutePath().split("\\.")[1];
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 2020-03-15
      • 2018-02-25
      • 2016-02-15
      • 2017-11-03
      相关资源
      最近更新 更多