Android Retrofit:带有JSON有效负载和附加图像的POST请求

时间:2015-07-03 18:27:49

标签: android json retrofit

我在我的应用程序中使用Square的Retrofit库。我需要POST到特定端点。将有一个JSON有效负载,一个Authorization标头以及附加的图像。我的图像文件当前位于图片目录中。

POST("/" + ENDPOINT_POST_PICTURE_SET)
@Multipart
SendPictureSetResponse sendPictureSet(@Header("Authorization") 
String token, @Part("key1") TypedString value1,
@Part("key2") TypedString value2,
@PartMap Map<Integer, TypedFile> files);

我提到https://stackoverflow.com/a/26735421/1606296。然而, 我得到了

Caused by: android.system.ErrnoException: open failed: ENOENT (No such   file or directory)

即使这些文件存在。另一个问题是我无法在日志中看到有效负载(我尝试添加@body参数:它表示我无法将其添加到多部分请求中。) 我已经使用

添加了文件(我从相机保存的图像到图片目录中的文件夹)
Map<Integer, TypedFile> files = new HashMap<Integer, TypedFile>();
files.put(0, new TypedFile("image/jpg", 
new File(application.getImageFilePaths().get(0))));
        files.put(1, new TypedFile("image/jpg", 
new  File(application.getImageFilePaths().get(1))));
        files.put(2, new TypedFile("image/jpg", 
new File(application.getImageFilePaths().get(2))));

编辑:堆栈跟踪

07-04 01:07:13.501  27594-27705/com.rohanmahale.test D/Retrofit﹕ java.io.FileNotFoundException: /storage/emulated/0/Pictures/TestApp/Current/TestApp_20150704_010712.jpg: open failed: ENOENT (No such file or directory)
        at libcore.io.IoBridge.open(IoBridge.java:456)
        at java.io.FileInputStream.<init>(FileInputStream.java:76)
        at retrofit.mime.TypedFile.writeTo(TypedFile.java:74)
        at  retrofit.mime.MultipartTypedOutput$MimePart.writeTo(MultipartTypedOutput.java:54)
at retrofit.mime.MultipartTypedOutput.writeTo(MultipartTypedOutput.java:144)
        at retrofit.Utils.readBodyToBytesIfNecessary(Utils.java:62)
        at retrofit.RestAdapter.logAndReplaceRequest(RestAdapter.java:438)
        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:317)
        at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
        at java.lang.reflect.Proxy.invoke(Proxy.java:397)
        at $Proxy0.sendPictureSet(Unknown Source)
        at com.rohanmahale.test.helpers.WebServicesHelper.sendPicturesToServer(WebServicesHelper.java:79)
        at com.rohanmahale.test.fragments.DemoCameraFragment.sendPicsToServer(DemoCameraFragment.java:300)
        at com.rohanmahale.test.fragments.DemoCameraFragment_.access$201(DemoCameraFragment_.java:28)
        at com.rohanmahale.test.fragments.DemoCameraFragment_$6.execute(DemoCameraFragment_.java:172)
        at org.androidannotations.api.BackgroundExecutor$Task.run(BackgroundExecutor.java:393)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
 Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
        at libcore.io.Posix.open(Native Method)
        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
        at libcore.io.IoBridge.open(IoBridge.java:442)
at java.io.FileInputStream.<init>(FileInputStream.java:76)
at retrofit.mime.TypedFile.writeTo(TypedFile.java:74)
    at retrofit.mime.MultipartTypedOutput$MimePart.writeTo(MultipartTypedOutput.java:54)
    at retrofit.mime.MultipartTypedOutput.writeTo(MultipartTypedOutput.java:144)
            at retrofit.Utils.readBodyToBytesIfNecessary(Utils.java:62)
            at retrofit.RestAdapter.logAndReplaceRequest(RestAdapter.java:438)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:317)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
            at java.lang.reflect.Proxy.invoke(Proxy.java:397)
            at $Proxy0.sendPictureSet(Unknown Source)
            at com.rohanmahale.test.helpers.WebServicesHelper.sendPicturesToServer(WebServicesHelper.java:79)
            at com.rohanmahale.test.fragments.DemoCameraFragment.sendPicsToServer(DemoCameraFragment.java:300)
            at com.rohanmahale.test.fragments.DemoCameraFragment_.access$201(DemoCameraFragment_.java:28)
            at com.rohanmahale.test.fragments.DemoCameraFragment_$6.execute(DemoCameraFragment_.java:172)
            at org.androidannotations.api.BackgroundExecutor$Task.run(BackgroundExecutor.java:393)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
07-04 01:07:13.501  27594-27705/com.rohanmahale.test D/Retrofit﹕ ---- END ERROR

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我得到了它的工作。

@POST("/" + ENDPOINT_POST_PICTURE_SET)
void sendPictureSet(@Body MultipartTypedOutput attachments,Callback<String> response)

对于MulipartTypedOutput,我使用了

 MultipartTypedOutput multipartTypedOutput = new MultipartTypedOutput();
 multipartTypedOutput.addPart("imageArray[]", new TypedFile("image/jpg", new File(application.getImageFilePaths().get(0))));
 multipartTypedOutput.addPart("imageArray[]", new TypedFile("image/jpg", new File(application.getImageFilePaths().get(1))));
 multipartTypedOutput.addPart("imageArray[]", new TypedFile("image/jpg", new File(application.getImageFilePaths().get(2))));
 multipartTypedOutput.addPart("key2", new TypedString("val2")); 

感谢@Louis Loo,https://stackoverflow.com/a/25260556/1606296