Невозможно выполнить POST составные данные из модификации 2

Я должен отправить почтовый запрос в этом формате.

--__X_PAW_BOUNDARY__
Content-Disposition: form-data; name="user_photo[image]"; filename="file.jpg"
Content-Type: image/jpeg

ÿØÿàJFIFHHÿáLExifMM*i    
ÿí8Photoshop 3.08BIM8BIM%ÔÙ²é   ìøB~ÿÀ
 "ÿÄ    
ÿĵ}!1AQa"q2¡#B±ÁRÑð$3br    
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ 
ÿĵw!1AQaq"2B¡±Á    #3RðbrÑ
$4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚâãäåæçèéêòóôõö÷øùúÿÛC                                       ÿÛC                                                                                                                                                                                                         ÿÝZÿÚ?ü_¢+þæð¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¢(¯ë3þ

Я в основном пытаюсь отправить фотографию в запросе на публикацию с именем user_photo[image], как на изображении, показанном ниже:

введите описание изображения здесь

Вот фрагменты рассмотренных мной решений:

    Call<models.UploadResponse> uploadPhoto(@Path("id") int userId, @Part MultipartBody.Part file);


        MultipartBody.Part body = MultipartBody.Part.createFormData("user_photo[image]", file.getName(), requestFile);
Call<models.UploadResponse> call = userRequest.uploadPhoto(62, body);



    RequestBody requestFile =
            RequestBody.create(MediaType.parse("image/*"), FileUtils.getFile(PhotoUploadActivity.this, fileUri));
    Call<models.UploadResponse> call = userRequest.uploadPhoto(62, requestFile);

    Call<models.UploadResponse> uploadPhoto(@Path("id") int userId, @Part ("name=\"user_photo[image]\"") RequestBody file);

    @Multipart
        @POST("users/{id}/user_photos")
    Call<models.UploadResponse> uploadPhoto(@Path("id") int userId, @Part("name=\"user_photo[image]\"") RequestBody file);

Это журнал okhttp:

D/OkHttp: Content-Type: multipart/form-data; boundary=75e8ae2e-a160-413f-82d1-3afd94f22c43
D/OkHttp: Content-Length: 43706
D/OkHttp: ������JFIF�����������������Photoshop 3.0��8BIM����������hg��vdP4uk_QnzZ02cW1f845(��JFBMD0f00078d0300006c1d0000675000009d53000068590000c77e000041a90000b1a90000��ICC_PROFILE������lcms����mntrRGB XYZ ���������)��9acspAPPL�����������������������������������������������������������������-lcms����������������������������������������������������������������������������������������������
D/OkHttp: desc�������������^cprt����\������wtpt����h������bkpt����|������rXYZ�����������gXYZ�����������bXYZ�����������rTRC�����������@gTRC�����������@bTRC�����������@desc��������������c2��������������������������������������������������������������������������������������������������������������������������������������������������������������������text��������FB����XYZ �������������������������-XYZ ����������������3�����XYZ ������������o�����8������XYZ ������������b������������XYZ ������������$������������curv����������������������c�k�?Q4!�)�2;�FQw]�kpz���|�i�}���0������C��
D/OkHttp: 
D/OkHttp:   
D/OkHttp: �"�������������������������������������������������������������������������<r9������J�������@��aCLk@�|2�=�VW�}������E���� �,i�v!�Q;j�H�N@E0!��1�J�T5L4�������� ��h���U��S�׿м�6v���2��]
D/OkHttp: ����3��T0��-@t�`&h��������%̬�Η�����[w(��جƥ�f^
D/OkHttp: C���;���t������E�͂I�O�[�Hvݝ -�g߫t�k���y����ة�ۼ�6S7zEe��/��I_��b��;�Gr��/�:B��R-7$eO��M��G�۱Iū�G2�r�s7#p�P��Ha�o6U�$�3(�����G\�q�4�ȋ�Dj�S�������n�V���J�f?m{{��ޣq�<\��_L���v+�1��-�\h���\u�Pnms����9   ��".~N�z�*J>f�I�:$��T   j�C�{���$�_$3y���ߪy�¼žj���j�愰�s�z�)�o���J����]�˭���ŧ��s]���
D/OkHttp: ��)��(�u�����şLl_T���S��"(��_o�{n�3���}OU�P`}C^zl�]޹V"}��u�Un|=���ο-�mn�e�1�g���S���Q0ދggF������B�;ӫ>��ӷ�P���5c�x"�#o�9螗�s`�j2����O�Y�ӆa��-�便�zy���d���
D/OkHttp: E�r�jqL�ah�^�u��'�+�Z����N:{a�'N��1���H�M�t �H���i���û�Ԕ�hP
D/OkHttp: ���0���
D/OkHttp: �����Y#M�qg���+��?��T�����ܱ���4�@��CA@����������&����G����wL���<Vo�l�Q�۲����H_?a�I�ũT��z��H���Z����S�b)���d���L11�3������hL �����h����b� ����
D/OkHttp: <Rf"��L��(�
D/OkHttp: s��3�Pgı��`g��ω��>&|J�S%���]�b�m�q#Ө�k��

Также:

Решения, которые я упомянул:

  1. https://github.com/square/retrofit/issues/1140
  2. https://futurestud.io/blog/retrofit-2-how-to-upload-files-to-server
  3. Retrofit - Multipart request: Required MultipartFile parameter 'file' нет
  4. Загрузка изображения Multipart Retrofit 2.0
  5. https://github.com/square/retrofit/issues/1063

И я устал искать решения. Кто-нибудь может помочь?


person Bipin Bhandari    schedule 23.04.2016    source источник
comment
нужен URL-адрес службы, токен и т. д. для проверки. Я решил свои проблемы, перейдя по 5-й ссылке на ваш вопрос   -  person Jemshit Iskenderov    schedule 09.05.2016


Ответы (5)


На стороне API

  @Multipart
  @POST("users/{id}/user_photos")
  Call<SignUpResp> uploadPhoto(@Part("description") RequestBody description, @Part MultipartBody.Part file,(add if more parameter req as like ID,name));

На стороне файла java

    if (fileUpload != null) {


        /**
         * code for multipart
         */

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

        // MultipartBody.Part is used to send also the actual file name
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("user_photo[image]", fileUpload.getName(), requestFile);

        // add another part within the multipart request
        String descriptionString = "hello, this is description speaking";
        RequestBody description =
                RequestBody.create(
                        MediaType.parse("multipart/form-data"), descriptionString);


        call = userRequest.uploadPhoto(description, body, authData);

    }
person Vishal Patel    schedule 03.05.2016
comment
Спасибо за ответ, но запрос не похож на этот i.imgur.com/r13cBDE.png - person Bipin Bhandari; 05.05.2016
comment
это проблема веб-сервиса ?? - person Vishal Patel; 05.05.2016
comment
Никакая веб-служба не работает нормально при вызове из консоли отдыха. - person Bipin Bhandari; 05.05.2016
comment
Да, я сделал ... одно, можете ли вы мне сказать, как вы создали объект для загрузки файлов? Я сделал частную загрузку voidPhoto (Uri fileUri) {File file = FileUtils.getFile (this, fileUri); - person Bipin Bhandari; 05.05.2016
comment
прошу прощения за поздний ответ, но file_upload - это ваш файл из галереи или камеры - person Vishal Patel; 10.05.2016

Я использовал эту библиотеку, и она работает как чудо для загрузки нескольких частей

person Linh Nguyen    schedule 09.05.2016

изменять

@Part("name=\"user_photo[image]\"") RequestBody file)

to

@Part("user_photo[image]\"; filename=\"file.jpg\" ")

Создать файл requestBody, используя

RequestBody fileBody = RequestBody.create(MediaType.parse("image"), myImageFile); 

Вы можете найти больше об этом на

https://github.com/square/retrofit/issues/1140

В этом случае имя файла file.jpg жестко запрограммировано, вы можете даже иметь динамические имена файлов. Хотя я не пробовал динамическое именование файлов, ниже приведена ссылка, которая может работать

https://github.com/square/retrofit/issues/1063#issuecomment-145920568

person Ankit Aggarwal    schedule 05.05.2016

Вы должны отправить его как напечатанный файл.

 TypedFile upload_file = new TypedFile("multipart/form-data", new File(your_file_location));

 @Multipart
 @POST("users/{id}/user_photos")
 Call<models.UploadResponse> uploadPhoto(@Path("id") int userId, @Part("name=\"user_photo[image]\"")TypedFile upload_file);

Надеюсь, поможет

person HourGlass    schedule 03.05.2016
comment
В модификации 2 нет TypedFile - person Bipin Bhandari; 05.05.2016

Я использовал следующие методы, их нет в RetroFit, надеюсь, что это поможет: Серверная сторона: Java-приложение Spring Boot:

@RequestMapping(value="/applyeffect", method=RequestMethod.POST,produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public @ResponseBody byte[] applyEffect(@RequestParam("userid") String userId, @RequestParam("type") int effectType,@RequestParam("file") MultipartFile file){

        try {
                byte[] bytes = file.getBytes();
                File temp=new File(file.getName());
                BufferedOutputStream stream =
                        new BufferedOutputStream(new FileOutputStream(temp));
                stream.write(bytes);
                stream.close();
                File newFile=null;
                if(effectType==1){
                    newFile=ImageUtils.applyTint(userId, temp, 50); 
                }else if(effectType==2){
                    newFile=ImageUtils.applyEffect(userId, temp, 128);
                }else if(effectType==3){
                    newFile=ImageUtils.applyBlackWhiteEffect(userId,temp, 128);
                }






                FileInputStream input=new FileInputStream(newFile);
                byte[]data=IOUtils.toByteArray(input);


                return data;

            } catch (Exception e) {
                System.out.println(e.toString());
                return null;
            }
    }

Клиентская сторона Android: я использовал этот класс утилиты https://github.com/MinaSamy/DailySelfie/blob/master/app/src/main/java/bloodstone/dailyselfie/android/utils/PostMultiPart.java

person Mina Wissa    schedule 09.05.2016