2016-02-28 2 views
1

Donc, voici la chose, le fichier est téléchargé avec succès en tant que "photo.png" mais quand j'ouvre la photo du navigateur, la photo est corrompue. Lorsque je télécharge la photo pour l'ouvrir localement sur mon ordinateur, la photo est corrompue.Retrofit 2 succès de téléchargement d'image mais l'image est téléchargée comme fichier corrompu

Aucune idée pourquoi.

Heres le point final de rénovation:

@Multipart 
@POST("alerts/{alertId}/photo/") 
Call<Object> uploadPhotoStill(@Header("Authorization") String credentials, @Path("alertId") int alertId, 
           @Part("photo\"; filename=\"picture_taken.jpeg\" ") RequestBody photo); 

Voici comment je l'utilise: je suis intercepta le tableau d'octets qui revient de prendre une photo avec l'objet de la caméra.

private void initCamera() { 
    if (camera == null) { 
     camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT); 

     Camera.Parameters params = camera.getParameters(); 
     params.setPictureFormat(ImageFormat.JPEG); 

     camera.setParameters(params); 
    } 
} 

/** 
* Called when image data is available after a picture is taken. 
* The format of the data depends on the context of the callback 
* and {@link Camera.Parameters} settings. 
* 
* @param data a byte array of the picture data 
* @param camera the Camera service object 
*/ 
@Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    Log.d(TAG, "onPictureTaken() called with: " + "data = [" + Arrays.toString(data) + "], camera = [" + camera + "]"); 
    handleTakenStill(data); 
} 

private void handleTakenStill(byte[] data) { 
    Log.d(TAG, "handleTakenStill() was called"); 

    RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpeg"), data); 

    havenApi.uploadPhotoStill(Utils.encodeUserCredentials(), getCurrentAlert().getId(), requestBody).enqueue(new Callback<Object>() { 
     @Override 
     public void onResponse(Response<Object> response, Retrofit retrofit) { 
      if (response.isSuccess()) { 
       Log.d(TAG, "handleTakenStill.onResponse success: " + response.body().toString()); 
      } else { 
       Log.e(TAG, "handleTakenStill.onResponse error: " + response.message()); 
      } 
     } 

     @Override 
     public void onFailure(Throwable t) { 
      Utils.logOnFailureRequest(TAG, t); 
     } 
    }); 
} 

Le succès est toujours appelé après le téléchargement de la photo. Mais la photo télécharge toujours corrompu et je n'ai aucune idée pourquoi.

+0

est l'image au format PNG? – TheSunny

+0

@TheSunny l'image est juste un byteArray saisi à partir de la méthode onPictureTaken – User051691

+0

Alors, quel format est l'image? Le commentaire ci-dessus la méthode onPictureTaken indique que le format des données dépend des paramètres transmis. Vous devriez vérifier cela et voir si cela peut être la cause du problème. – TheSunny

Répondre

0

Je n'ai jamais réussi à obtenir ce travail avec la modernisation. Mais j'étais capable de le faire avec OkHttp.

Si vous vous demandez comment est ici la solution:

/** 
* Called when image data is available after a picture is taken. 
* The format of the data depends on the context of the callback 
* and {@link Camera.Parameters} settings. 
* 
* @param data a byte array of the picture data 
* @param camera the Camera service object 
*/ 
@Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    Log.d(TAG, "onPictureTaken() called with: " + "data = [" + Arrays.toString(data) + "], camera = [" + camera + "]"); 
    handleTakenStill(data); 
} 

private void handleTakenStill(byte[] data) { 
    Log.d(TAG, "handleTakenStill() was called"); 

    Observable.create(uploadPhoto(data)) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<com.squareup.okhttp.Response>() { 
       @Override 
       public void onCompleted() { 
        Log.d(TAG, "onCompleted() was called"); 
       } 

       @Override 
       public void onError(Throwable e) { 
        Utils.logOnFailureRequest(TAG, e); 
       } 

       @Override 
       public void onNext(com.squareup.okhttp.Response response) { 
        if (response.isSuccessful()) { 
         Log.d(TAG, "handleTakenStill.onResponse success: " + response.body().toString()); 
        } else { 
         Log.e(TAG, "handleTakenStill.onResponse error: " + response.message()); 
        } 
       } 
      }); 
} 

@NonNull 
private Observable.OnSubscribe<com.squareup.okhttp.Response> uploadPhoto(final byte[] data) { 
    return new Observable.OnSubscribe<com.squareup.okhttp.Response>() { 
     @Override 
     public void call(Subscriber<? super com.squareup.okhttp.Response> subscriber) { 
      OkHttpClient client = new OkHttpClient(); 

      RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM) 
        .addFormDataPart("camera", "picture_taken.jpg", RequestBody.create(MediaType.parse("image/jpeg"), data)) 
        .build(); 

      Request request = new Request.Builder() 
        .url(url) 
        .post(requestBody) 
        .addHeader("content-type", "multipart/form-data") 
        .addHeader("authorization", Utils.encodeUserCredentials()) 
        .addHeader("accept", "application/json") 
        .addHeader("cache-control", "no-cache") 
        .build(); 

      try { 
       com.squareup.okhttp.Response response = client.newCall(request).execute(); 
       subscriber.onNext(response); 
       subscriber.onCompleted(); 
       if (!response.isSuccessful()) { 
        subscriber.onError(new Exception("Error uploading photo")); 
       } 
      } catch (IOException e) { 
       subscriber.onError(e); 
      } 
     } 
    }; 
} 
0

1) Vérifiez le type de photo comme indiqué dans les commentaires. Parfois, le format JPG résout le problème.

2) Essayez de mettre en tant que paramètres à RequestBody juste un fichier ou chemin vers le fichier (Un autre constructeur d'objet RequestBode)

J'utilise le code ci-dessous sans problème, mais je l'envoi de fichiers en tant que données de formulaire:

@Multipart 
    @POST("/api/tour/upload") 
    Call<MainFileModel> uploadTourFiles(@PartMap Map<String, RequestBody> params); 


    File mainFile = new File(fileLoad.getFile()); 
    Map params = new Map<>(); 
    params.put("file\"; filename=\"" + mainFile.getName(), 
     RequestBody.create(MediaType.parse("multipart/form-data"),         mainFile));; 


//And Make call here! 
+0

Je l'avais déjà fait de cette façon. Même chose. N'a pas travaillé. – User051691