【问题标题】:error uploading image using multipart retrofit使用多部分改造上传图像时出错
【发布时间】:2021-11-17 03:22:57
【问题描述】:

我正在尝试使用带有以下代码的改造将图像上传到端点,在其中我将每个字符串转换为 RequestBody。

private void createNovedad(String IdUnidad,String Serial,String Unidad, List<String> Foto, String Tipo,String CodigoReferencia,String  NombrePuntoReferencia,String Quienregistro,String Novedad, String UsuarioAdmin,String Longitude,String Latitude){

        RequestBody IdUnidadbody = RequestBody.create(MediaType.parse("text/plain"),IdUnidad );
        RequestBody Serialbody = RequestBody.create(MediaType.parse("text/plain"),Serial);
        RequestBody Unidadbody = RequestBody.create(MediaType.parse("text/plain"),Unidad );
       File file = new File(Uri.parse(Foto.get(0)).getPath());
        RequestBody FotoBody = RequestBody.create(MediaType.parse("image/*"), file);
        RequestBody Tipobody = RequestBody.create(MediaType.parse("text/plain"),Tipo );
        RequestBody CodigoReferenciabody = RequestBody.create(MediaType.parse("text/plain"),CodigoReferencia );
        RequestBody NombrePuntoReferenciabody = RequestBody.create(MediaType.parse("text/plain"),NombrePuntoReferencia );
        RequestBody Quienregistrobbody = RequestBody.create(MediaType.parse("text/plain"),Quienregistro );
        RequestBody Novedadbody = RequestBody.create(MediaType.parse("text/plain"),Novedad );
        RequestBody UsuarioAdminbody = RequestBody.create(MediaType.parse("text/plain"),UsuarioAdmin );
        RequestBody Longitudebody = RequestBody.create(MediaType.parse("text/plain"),Longitude);
        RequestBody Latitudebody = RequestBody.create(MediaType.parse("text/plain"),Latitude );


        Retrofit retrofit = new Retrofit.Builder().baseUrl(URL_NOVEDAD)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
        Call<Referencia> response = jsonPlaceHolderApi.sendNovedad(IdUnidadbody,Serialbody, Unidadbody, FotoBody,Tipobody,CodigoReferenciabody, NombrePuntoReferenciabody,Quienregistrobbody,Novedadbody, UsuarioAdminbody, Longitudebody, Latitudebody);
        response.enqueue(new Callback<Referencia>() {
            @Override
            public void onResponse(Call<Referencia> call, Response<Referencia> response) {
                if (!response.isSuccessful()) {
                    Toast.makeText(getApplicationContext(), String.valueOf(response.code()), Toast.LENGTH_SHORT).show();
                    return;
                }else{
                    Toast.makeText(getApplicationContext(), "Novedad creada correctamente", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<Referencia> call, Throwable t) {
                Toast.makeText(getApplicationContext(), String.valueOf(t), Toast.LENGTH_SHORT).show();
            }
        });
    }

这是我正在使用的模型

    @Multipart
    @FormUrlEncoded
    @POST("create/novreferencia")
    Call<Referencia> sendNovedad(@Part("IdUnidad") RequestBody IdUnidad,
                                 @Part("Serial") RequestBody Serial,
                                 @Part("Unidad") RequestBody Unidad,
                                 @Part("Foto\"; filename=\"pp.png\" ") RequestBody Foto,
                                 @Part("Tipo") RequestBody Tipo,
                                 @Part("CodigoReferencia") RequestBody CodigoReferencia,
                                 @Part("NombrePuntoReferencia") RequestBody  NombrePuntoReferencia,
                                 @Part("QuienRegistro") RequestBody QuienRegistro,
                                 @Part("Novedad") RequestBody  Novedad,
                                 @Part("UsuarioAdmin") RequestBody  UsuarioAdmin,
                                 @Part("Latitude") RequestBody  Latitude,
                                 @Part("Longitude") RequestBody  Longitude);

问题是 logcat 没有显示任何错误,但应用程序停止工作。所有变量都是字符串

【问题讨论】:

  • File file = new File(Uri.parse(Foto.get(0)).getPath())请告诉file.getAbsolutePath()的值,另外加上if(!file.exists()) return;
  • 这是错误 java.lang.IllegalArgumentException: Only one encoding annotation is allowed.

标签: java android android-studio retrofit


【解决方案1】:

@FormUrlEncoded - 表示 URL 编码形式。正如文档中指定的那样:

表示请求正文将使用表单 URL 编码。

@Multipart - 表示带有部件列表的消息。每个部分的主体可以是任何媒体类型,并且包含文本或二进制数据。文档:

表示请求正文是多部分的。

错误:

java.lang.IllegalArgumentException: 只有一个编码注释是 允许。

表示你应该只使用一个编码注解:@FormUrlEncoded@Multipart

在你的情况下是@Multipart

【讨论】:

    猜你喜欢
    • 2018-04-15
    • 2016-04-10
    • 2015-09-16
    • 2017-01-14
    • 2017-11-02
    • 2019-12-19
    • 2015-06-26
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多