【发布时间】:2015-09-21 15:10:24
【问题描述】:
我在我的应用中使用 Square 的 Retrofit 库。我需要 POST 到特定的端点。将有一个 JSON 有效负载、一个授权标头以及附加的图像。我的图像文件当前位于图片目录中。
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
我该如何解决这个问题?
【问题讨论】:
-
发布完整的堆栈跟踪。
-
@njzk2 添加了堆栈跟踪。
-
您的文件似乎不存在。
-
@njzk2 文件肯定存在。我可以在那个特定的文件夹中看到它们。事实上..我使用毕加索在以下活动中显示图像。
-
@njzk2。你是对的。代码中有一个错误。第三张图像没有保存,这是找不到文件异常的问题。我现在如何向此请求添加 JSON 有效负载。我必须发送一些 K,V 对。