当前位置: 首页 > 知识库问答 >
问题:

如何使用@MultiPart将多个图像/文件与@Body一起上载到改装中

羊舌源
2023-03-14

我需要使用@POST-in-reformation提交大数据(嵌套的json对象)以及多个图像/文件。

一种简单/hacky的方法是将图像转换为base 64字符串

{
  "id": "id12",
  "bar": {
    "id": "id1",
    "name": "asd"
  }
} .....

但是如何使用@Multipart发送身体和图像。

@Multipart
@POST("api/upload")
Observable<SubmitResponse> submitData(@Body Foo foo, @Part MultipartBody.Part[] files);

class Foo {

    @SerializedName("book_id")
    @Expose
    private String book_id;
    @SerializedName("bar")
    @Expose
    private Bar anotherBodyinsideFoo;

}

上述方法引发错误:@Body参数不能用于表单或多部分编码。

就如何在Retrofit中上传多个文件以及请求正文(@body Foo)提出建议。

共有1个答案

左丘恩
2023-03-14

请检查以下代码,以便使用改装上载多个图像

@POST(UPLOAD_EVENT)
    Call<EventResponse> uploadEvent(@Header("Authorization") String auth, @Body RequestBody body);

 MultipartBody.Builder builder = new MultipartBody.Builder();
    builder.setType(MultipartBody.FORM);
    builder.addFormDataPart("event_name", eventName);
    builder.addFormDataPart("location", loacation);
    builder.addFormDataPart("longitude", longitude);
    builder.addFormDataPart("latitude", latitude);
    builder.addFormDataPart("is_private", isPublic);
    builder.addFormDataPart("caption", caption);
    RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), coverImage);
    builder.addFormDataPart("cover_image", coverImage.getName(), requestBody);
    RequestBody requestBody1 = null;

    for (int i = 0, size = eventFiles.size(); i < size; i++) {
        requestBody1 = RequestBody.create(MediaType.parse("multipart/form-data"), eventFiles.get(i));
        builder.addFormDataPart("album_images" + "[" + i + "]", eventFiles.get(i).getName(), requestBody1);
    }
    RequestBody finalRequestBody = builder.build();

    final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(RestClient.ROOT)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    RestClient.NetworkCall networkCall = retrofit.create(RestClient.NetworkCall.class);

    Call<EventResponse> response = networkCall.uploadEvent(Prefs.getAuth(App.getContext()), finalRequestBody);

    response.enqueue(new Callback<EventResponse>() {
        @Override
        public void onResponse(Call<EventResponse> call, Response<EventResponse> response) {
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.cancel(MY_NOTIFICATION_ID);
            if (response.code() == Constant.SUCCESS_STATUS) {

                if (response.body() != null) {
                    sendBroadcast(new Intent(Constant.REFRESH_FEEDS));
                    Log.e("Success", "Success");
                }
            } else {
                Converter<ResponseBody, EventResponse> converter =
                        retrofit.responseBodyConverter(EventResponse.class, new Annotation[0]);
                try {
                    if (response.errorBody() != null) {
                        EventResponse errorResponse = converter.convert(response.errorBody());
                        Log.e("Failure", "Failure");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void onFailure(Call<EventResponse> call, Throwable t) {
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.cancel(MY_NOTIFICATION_ID);
            Log.e("Failure", "Failure");
        }
    });
 类似资料:
  • 如何使用改造上传多文件, 我尝试使用以下代码上载文件: ApiService: 以及上传方法: 和php代码: 此代码仅适用于一个文件,我不知道原因, 任何帮助,提前感谢。

  • 如有任何帮助,不胜感激。

  • 我正在尝试上传一个文本文件(也尝试了PDF等)到Salesforce。文本文件包含“Hello World”。 这是我正在使用的代码 这将导致以下看起来符合Salesforce指导原则的请求正文:https://developer.Salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_sobject_insert_update_bl

  • 问题内容: 我看到LoopBack内置了Express 3.x中间件。确实,body- parser位于中。但是我不知道如何将其用作中间件。我从未使用过Express 3.x,所以也许就这样。显然,除非我在项目中安装body-parser作为依赖项,否则它不起作用。 我应该怎么做才能使用body-parser来解析Web表单?就是这样,对吧? 问题答案: 经过数小时的无奈之后,我将其添加为: 它作

  • 我正在尝试使用签名 URL 将多个图像上传到 s3 存储桶。流程是前端应用向服务器发送 GET 请求,以获取要上传的每个图像的签名 URL。然后,前端应用程序使用签名的 URL 将图像直接上传到 s3 存储桶。 我的问题是我如何处理一张图片上传失败的情况? 例如,如果我想上传三个图像,而其中一个未能上传,在让用户尝试再次上传文件之前,我是否必须从s3存储桶中删除另外两个图像?

  • 我有一个问题上传文件到服务器(春季启动)从Android-改版。 这是我在Spring Boot中的代码。 这是在Android中 这是Spring Boot中的错误消息 但是,当我用邮递员的时候,它做得很好。 请告诉我问题是什么,如何解决