RequestBody всегда нулевой при подключении файла, а не строковых данных - PullRequest
0 голосов
/ 06 мая 2019

Я использую Retrofit версии 2.5, я видел всю документацию и вопросы, связанные с ней, но пока не нашел решения. Здесь проблема в том, что RequestBody для файла всегда становится нулевым после присоединения файла. Здесь я приложил свой код, пожалуйста, посмотрите на это -

          final RequestBody msgbody = RequestBody.create(MediaType.parse("text/plain"), messege);
                final RequestBody idbody = RequestBody.create(MediaType.parse("text/plain"), String.valueOf(id));
                //map.put("userId", idbody);
                //map.put("message", msgbody);
                RequestBody fbody = null;
                if (fileUri!=null) {
                    String path = FileUtils.getPath(getContext(),fileUri);
                    File file = new File(path);
                    fbody = RequestBody.create(MediaType.parse(getContext().getContentResolver().getType(fileUri)), file);
                    //RequestBody body = RequestBody.create(MediaType.parse("*/*"), file);
                    //fbody = MultipartBody.Part.createFormData("file", file.getName(), body);
                    Log.e("SUPPORT",path+" body:"+new Gson().toJson(fbody));
                    //map.put("file\"; filename=\""+file.getName()+"\"",body);
                }

                Call<SubmitTicket> call = mInterface.issueTicket(idbody,msgbody,fbody);
                Log.e("SUPPORT",new Gson().toJson(call));
                call.enqueue(new Callback<SubmitTicket>() {
                    @Override
                    public void onResponse(Call<SubmitTicket> call, Response<SubmitTicket> response) {
                        loadingBar.setVisibility(View.GONE);
                        submitBtn.setEnabled(true);
                   }
                   @Override
                   public void onFailure(Call<ResponseModel> call, Throwable t) {
                      t.printStackTrace();
                      Log.i("Error :",t.getCause()+"");
                      Log.i("Error :","T");
                      finish();
                   } //error even before compile**
            });

А вот код интерфейса,

@Multipart
@POST("Support")
//Call<SubmitTicket> issueTicket(@PartMap Map<String, RequestBody> params);
Call<SubmitTicket> issueTicket(@Part("userId") RequestBody id, @Part("message") RequestBody messege, @Part("image\"; filename=\"myfile.jpg\" ") RequestBody file);

Спасибо за все ответы и комментарии.

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Прежде всего вам нужно изменить в вашем интерфейсе. Вместо использования @Part RequestBody file используйте @Part MultipartBody.Part file следующим образом -

@Multipart
@POST("Support")
Call<SubmitTicket> issueTicket(@Part("userId") RequestBody id, @Part("message") RequestBody messege, @Part MultipartBody.Part  image);

, тогда в вашей части запроса используйте Mulitpart.Part body вместо RequestBody как следует -

MultipartBody.Part fbody = null;
                if (fileUri!=null) {
                    String path = FileUtils.getPath(getContext(),fileUri);
                    File file = new File(path);
                    //here **image** is your remote file param name
                    fbody = MultipartBody.Part.createFormData("image", file.getName()+System.currentTimeMillis(), RequestBody.create(MediaType.parse("image/*"), file));

                    Log.e("SUPPORT",path+" body:"+new Gson().toJson(fbody));
                    //map.put("file\"; filename=\""+file.getName()+"\"",body);
                }
1 голос
/ 06 мая 2019

Используйте это, это поможет вам.Вам необходимо отправить файл в форме данных Multipart.

Ваш интерфейс будет выглядеть так:

 @Multipart
 @POST("Support")
 Call<SubmitTicket> issueTicket(@Part("userId") RequestBody id, @Part("message") RequestBody messege, @Part MultipartBody.Part file);

И ваш запрос будет выглядеть так:

  RequestBody msgbody = RequestBody.create(MediaType.parse("text/plain"), "yourMessage");
        RequestBody idbody = RequestBody.create(MediaType.parse("text/plain"), "id");


        if (fileUri!=null) {
            String path = FileUtils.getPath(getContext(),fileUri);
            File file = new File(path);

            // create RequestBody instance from file
            RequestBody requestFile =
                    RequestBody.create(MediaType.parse("multipart/form-data"), file);

            MultipartBody.Part body =
                    MultipartBody.Part.createFormData("file", file.getName(), requestFile);



        Call<SubmitTicket> call = mInterface.issueTicket(idbody,msgbody,body);
        Log.e("SUPPORT",new Gson().toJson(call));
        call.enqueue(new Callback<SubmitTicket>() {
            @Override
            public void onResponse(Call<SubmitTicket> call, Response<SubmitTicket> response) {
                loadingBar.setVisibility(View.GONE);
                submitBtn.setEnabled(true);
            }
            @Override
            public void onFailure(Call<ResponseModel> call, Throwable t) {
                t.printStackTrace();
                Log.i("Error :",t.getCause()+"");
                Log.i("Error :","T");
                finish();
            } //error even before compile**
        });

        }

Thisвсегда помогает мнеНадеюсь, что это будет полезно и вам, и другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...