2017-06-02 4 views
0

Ich versuche, ein Video von Android-Gerät auf den Server mit Retrofit2 hochladen und am Ende erhalten Fehler 400 Fehlgeschlagen Anfrage. Unten ist die Implementierung. Könnte jemand helfen, den Fehler zu beheben?Video hochladen mit Retrofit2

public interface RetrofitService { 
/** 
* Upload Videos to Server 
*/ 
@Multipart 
@POST("store/S3") 
Call<ResponseBody> uploadToServer(@Query("key") String ServerAPI, 
             @Query("mimetype") String videoMimeType, 
             @Query("path") String path, 
             @Query("container") String container, 
             @Query("policy") String policy, 
             @Query("signature") String signature, 
             @Part MultipartBody.Part video, 
             @Part("type") String videoType, 
             @Part("name") String videoName); 

}

Client-Implementierung in helper.java

private void uploadVideos(String videUri, String policy, String signature){ 
    String BASE_URL = "https://www.example.com/api/"; 
    String EXAMPLE_API_KEY = "xebfc"; 
    String mimeType = "video/mp4"; 
    String path = "mezzanine_videos/"; 
    String container = S3_BUCKET; 

    // use the FileUtils to get the actual file by uri 
    File videoFile = new File(videoUri); 

    // create RequestBody instance from file 
    RequestBody videoBody = RequestBody.create(MediaType.parse("video/*"), videoFile); 

    // MultipartBody.Part is used to send the actual file 
    MultipartBody.Part vFile = MultipartBody.Part.createFormData("video", videoFile.getName(), videoBody); 

    String videoType = "video/mp4"; 
    String videoName = "video.mp4"; 

    final Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .client(okHttpClient) 
      .build(); 

    RetrofitService service = retrofit.create(RetrofitService.class); 
    Call<ResponseBody> call = service.uploadToServer(EXAMPLE_API_KEY, mimeType, path, container, policy, signature, vFile, videoType, videoName); 
    call.enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
      Log.d("Response", "Successful Response"); 
     } 

     @Override 
     public void onFailure(Call call, Throwable t) { 
      Log.d("Response", "Failure Response"); 
     } 
    }); } 

Server-Implementierung funktioniert gut, weil ich wie unten eine gültige Antwort, indem Sie eine Locke Post.

curl -X POST -F [email protected] "https://www.example.com/api/store/S3?key= xebfc&mimetype=video%2Fmp4&path=mezzanine_videos/&container= S3_BUCKET&policy=ppppp&signature=ssss 
+0

Fügen Sie Ihrer Retrofit-Instanz den Protokollierungsabfanger hinzu und aktualisieren Sie die Frage bitte. Sind Sie sicher, dass Sie MediaType.parse ("video/*") anstelle von exact type und "video" als Teilname verwenden? –

+0

Vielen Dank für Ihre Antwort @KonstantinBerkow, MediaType.parse ("video/*") oder MediaType.parse ("video") ergibt den gleichen Fehler. Ich werde den formatierten Logging Interceptor in ein bisschen hinzufügen. – Babs

Antwort

0

Nach einigen Debuggen auf MultipartBody.Part.createFormData, herausgefunden, dass der Name nicht mit meiner Back-End-Implementierung wurde übereinstimmen. Unterhalb des Codes wurde das Problem behoben.

MultipartBody.Part vFile = MultipartBody.Part.createFormData("fileUpload", videoFile.getName(), fileBody); 

Rest des Codes ist das gleiche wie oben erwähnt.