2015-10-29 28 views
4

我想將圖像發佈到服務器。這裏是由scriptor提供給我的服務器端我的PHP變量名:Retrofit v2.0.0-beta2如何使用RequestBody上傳文件

$value1 = $_POST["value1"]; // string value 
$value2 = $_POST["value2"]; // string value 

$img_1 = $_FILES["fileToUpload1"]["name"]; // image file 
$img_2 = $_FILES["fileToUpload2"]["name"]; // image file 

,這裏是我的代碼張貼的價值觀 -

RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), path.toString()); 
RequestBody fileBody1 = RequestBody.create(MediaType.parse("image/png"), path.toString()); 

Call<uploadResponseModel> call = adapter.uploadValues("test1","test2",fileBody1,fileBody); 

call.enqueue(new Callback<uploadResponseModel>() { 
    @Override 
    public void onResponse(Response<uploadResponseModel> response, Retrofit retrofit) { 
     Log.i("TAG", "retro onResponse :" + response.body().getResponse().getStatus()); 
    } 

    @Override 
    public void onFailure(Throwable t) { 
     Log.i("TAG", "retro onFailure :" + t.getCause()); 
    } 
}); 

適配器類:

public interface RetrofitAdapter { 
@Multipart 
@POST("/TestApp/img_upload.php") 
Call<uploadResponseModel> uploadValues(@Part("value1")String value1,@Part("value2")String value2,@Part("fileToUpload1") RequestBody file1,@Part("fileToUpload2") RequestBody file2); 
} 

這兩個字符串值都在服務器上發佈,但不是圖像。如果我在發佈圖像文件的任何地方出錯,請糾正我。我是新的改造。

+0

有沒有解決方案爲你工作?你能在這裏發佈你的解決方案嗎 – Rakesh

+0

@ Rakesh:不,他們都沒有爲我工作。終於結束使用翻新1.9,它在上傳圖像順利工作 –

回答

6

根據您的問題,您的服務器期望作爲兩個圖像(文件)的變量是fileToUpload1fileToUpload2。圖像未上傳的原因是因爲您在RetrofitAdapter中指定的語法。

你將不得不改變你的RetrofitAdapter到:

public interface RetrofitAdapter { 
@Multipart 
@POST("/TestApp/img_upload.php") 
Call<uploadResponseModel> uploadValues(@Part("value1")String value1,@Part("value2")String value2,@Part("fileToUpload1\"; filename=\"image\" ") RequestBody file1,@Part("fileToUpload2\"; filename=\"image\" ") RequestBody file2); 
} 

@part( 「fileToUpload1 \」 文件名= \ 「圖像\」「)RequestBody文件1

服務器期待變量名爲fileToUpload1fileToUpload2的文件必須與上述格式的文件名一起發佈。您也可以參考此處的解決方案click here

做到這一點,你很好走:)

+0

是啊!這解決了我的問題。我發佈的文件名是錯誤的。比x更正我的語法! –

0

而不是RequestBody只是使用RequestBody。在更新接口修復方法uploadValues

  public interface RetrofitAdapter { 
      @Multipart 
      @POST("/TestApp/img_upload.php") 
      Call<uploadResponseModel> uploadValues(@Part("value1")String value1,@Part("value2")String value2,@Part("fileToUpload1") TypedFile file1,@Part("fileToUpload2") TypedFile file2); 
      } 

和修復您的請求服務:

  TypedFile file1 = new TypedFile("application/octet-stream", new File(path1)); 
      TypedFile file2 = new TypedFile("application/octet-stream", new File(path2)); 
      Call<uploadResponseModel> call = adapter.uploadValues("test1","test2",file1,file2); 

      call.enqueue(new Callback<uploadResponseModel>() { 
       @Override 
       public void onResponse(Response<uploadResponseModel> response, Retrofit retrofit) { 
        Log.i("TAG", "retro onResponse :" + response.body().getResponse().getStatus()); 

       } 

       @Override 
       public void onFailure(Throwable t) { 
        Log.i("TAG", "retro onFailure :" + t.getCause()); 

       } 
      }); 
+0

是的,我會用你的解決方案,但'TypedFile'已被刪除'翻新2.0.0-beta2' –

0

要調用的RequestBody錯誤create方法。您正在傳遞一個字符串,該字符串將該字符串用作內容。您需要通過File。目前還不清楚你的path變量是什麼類型。如果它已經是File,請使用它。否則,創建一個文件,並傳遞到create -

File image = new File(path.toString()); 
RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"), image); 

做同樣fileBody1

+0

是啊,我試了。靜止圖像沒有發佈 –

0

我認爲發送正常字符串和文件的方法是不同的。

你應該使用

@Part("file\"; filename=\"fileToUpload1.png\"") RequestBody file1 

,而不是

@Part("fileToUpload1") RequestBody file1 

,或者如果你想成爲特定

@Part("image\"; filename=\"fileToUpload1.png\"") RequestBody file1 
+0

文件名是否需要擴展名'.png'?因爲這只是php變量名,我應該發佈文件。 –

+0

嗯,我不這麼認爲,你爲什麼不先試試? :) –

+0

我試過了,它不工作 –

2

這是多文件上傳我的服務方法:

@Multipart 
@POST("http://....") 
Call<UploadResponse> uploadPicture(@PartMap Map<String,RequestBody> pic1, @PartMap Map<String, RequestBody> pic2); 

以及如何調用它:

public void uploadPicture(File pic1, File pic2) { 
     Map<String, RequestBody> pic1Map = new HashMap<>(); 
     Map<String, RequestBody> pic2Map = new HashMap<>(); 
     RequestBody rb1 = RequestBody.create(MediaType.parse("image/*"), pic1); 
     RequestBody rb2 = RequestBody.create(MediaType.parse("image/*"), pic2); 
     pic1Map.put("file\"; filename=\"" + pic1.getName(), rb1); 
     pic2Map.put("file\"; filename=\"" + pic2.getName(), rb2); 

     Call<UploadResponse> call = apiClient.getAPIService().uploadPicture(pic1Map, pic2Map); 
     call.enqueue... 
    } 

有些後端需要的文件名頭參數,這就是爲什麼我使用@PartMap這種方式。 OkHttp的多部分構建器沒有設置它。

-1

多部分文件上傳有一些問題,需要翻新@Multipart標籤。

使用@POST標籤解決了該問題,並在請求正文中使用自定義多部分構建器。

@POST ("userwebservices/app_upload_pic") 
Call<APIRespone> uploadUserImages (@Body RequestBody file); 

通過傳遞從android應用獲取的圖像文件路徑進行分段上傳的代碼。

File file = new File(filePath); 

MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*"); 
RequestBody requestBody = new MultipartBuilder() 
     .type(MultipartBuilder.FORM) 
     .addPart(
       Headers.of("Content-Disposition", "form-data;name=\"uploaded_file\";filename=\"" + filePath + "\""), 
       RequestBody.create(MEDIA_TYPE_IMAGE, file)) 
     .build(); 

這裏uploaded_file是PHP腳本中的檢查字符串。