2016-02-28 103 views
1

因此,继承人的事情,文件成功上传为“photo.png”,但是当我从浏览器打开照片照片已损坏。当我下载照片在我的电脑本地打开它时,照片已损坏。Retrofit 2图片上传成功,但图片上传损坏的文件

不知道为什么。

继承人的改造端点:

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

这里是我如何使用它:我正在抓的是来自拍照与摄像对象返回的字节数组。

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

上传照片后总会调用成功。但照片总是上传损坏,我不知道为什么。

+0

是在PNG格式的图像? – TheSunny

+0

@TheSunny图像只是从onPictureTaken方法中抓取的一个byteArray – User051691

+0

那么图像是哪种格式?上面onPictureTaken方法的注释表明,数据的格式取决于传入的参数。您应该检查一下,看看是否可能是问题的原因。 – TheSunny

回答

0

我从来没有得到与改造工作。但是我可以用OkHttp来完成。

如果你想知道如何在这里是解决方案:

/** 
* 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)如评论中所述检查照片类型。有时swith到JPG格式解决问题。

2)尽量把作为参数传递给RequestBody不仅仅是文件,或文件路径(RequestBode对象的另一个构造函数)

我用下面的代码没有问题,但我发送文件作为表单数据:

@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

我已经这样做了。一样。没有工作。 – User051691