2016-04-23 16 views
6

我必須以此格式發送發佈請求。無法對多部分數據進行修改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þ 

我基本上嘗試發送照片post請求與名稱user_photo[image]如下所示的圖像上的一個:

enter image description here

這裏是我所考慮的解決方案的片段:

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�������@��[email protected]�|2�=�VW�}������E���� �,i�v!�Q;j�H�[email protected]!��1�J�T5L4�������� ��h���U��S�׿м�6v���2��] 
D/OkHttp: ����3��T0��[email protected]�`&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�@��[email protected]����������&����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' is not present
  4. Multipart Retrofit 2.0 image upload
  5. https://github.com/square/retrofit/issues/1063

而且我厭倦了尋找解決方案。誰能幫忙?

+0

需要服務的URL,令牌等......測試。我解決了我的問題,看看你的問題的第五個鏈接 –

回答

1

您必須將其作爲打字文件發送。

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); 

希望它可以幫助

+0

沒有TypedFile改造2 –

7

在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); 

    } 
+0

謝謝你的回覆,但不是請求是這樣的http://i.imgur.com/r13cBDE.png –

+0

是web服務問題?? –

+0

從休息控制檯調用時,沒有任何Web服務正常工作。 –

1

變化

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

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

創建使用

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

文件的requestBody你可以找到更多有關這對

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

在這種情況下,文件名file.jpg被硬編碼,你甚至可以有動態文件名。雖然我沒有嘗試動態文件命名,但低於是可能的工作

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

2

我用this lib的鏈接,它就像一個魅力上傳的multipart

+0

Upvote for your share,thanks – BNK

1

我用下面的方法,他們不是在改造,希望幫助: 服務器端:春季啓動Java應用程序:

@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