我在使用Multipart上传将图像上传到Restful服务时遇到问题
我正在使用OKHttp示例中的Recipe。
由于某种原因,上传没有找到图像。
我验证文件是否有效(我可以输出有关文件的信息,并查看是否找到它),但当上传应该发生时,我收到一个错误,告诉找不到文件。
有人能看出我做错了什么吗?
这是我的代码:
@Override
protected Boolean doInBackground(Void... params) {
Bitmap bmp = attachment.getBitmap(getActivity(), ATTACHMENT_IMG_SIZE);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 70, bos);
File file = new File(attachment.getFilename(getActivity()));
try {
Log.d("MSW", "The file Canonical Path: " + file.getCanonicalPath());
Log.d("MSW", "The file name: " + file.getName());
Log.d("MSW", "The file Path: " + file.getPath());
} catch (IOException e) {
e.printStackTrace();
}
OkHttpClient client = new OkHttpClient();
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
client.networkInterceptors().add(loggingInterceptor);
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addFormDataPart("method_name", "upload_attach")
.addFormDataPart("forum_id", getArguments().getString(ARG_FORUM_ID))
.addFormDataPart("attachment[]", file.getName(), RequestBody.create(MediaType.parse("image/png"), file))
.build();
Request request = new Request.Builder()
.url(AppConfig.MOBIQUO_ATTACH_URL)
.post(requestBody)
.build();
String respStr = "";
Log.d("MSW", "BEFORE ---: ");
try {
Log.d("MSW", "BEFORE RESP: ");
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
Log.d("MSW", "Response UNSuccessful: ");
throw new IOException("Unexpected code " + response);
} else {
Log.d("MSW", "Response Successful: " + response.body().string());
respStr = response.body().string();
System.out.println(response.body().string());
}
} catch (IOException e) {
Log.d("MSW", "Exception: " + e);
e.printStackTrace();
}
Log.d("MSW", "Response is: " + respStr);
return parseResponse(respStr);
}
这是错误消息:
11-23 16:03:17.525 27377-27956/com.androidcentral.app D/MSW﹕ The file Canonical Path: /4970.jpg
11-23 16:03:17.525 27377-27956/com.androidcentral.app D/MSW﹕ The file name: 4970.jpg
11-23 16:03:17.525 27377-27956/com.androidcentral.app D/MSW﹕ The file Path: 4970.jpg
11-23 16:03:17.618 27377-27956/com.androidcentral.app D/MSW﹕ BEFORE ---:
11-23 16:03:17.618 27377-27956/com.androidcentral.app D/MSW﹕ BEFORE RESP:
11-23 16:03:17.763 27377-27956/com.androidcentral.app D/OkHttp﹕ --> POST /mobiquo/upload.php HTTP/1.1
11-23 16:03:17.763 27377-27956/com.androidcentral.app D/OkHttp﹕ Content-Type: multipart/form-data; boundary=46df9530-8ac4-4943-a980-fc61b4879002
11-23 16:03:17.763 27377-27956/com.androidcentral.app D/OkHttp﹕ Content-Length: 449
11-23 16:03:17.763 27377-27956/com.androidcentral.app D/OkHttp﹕ Host: forums.androidcentral.com
11-23 16:03:17.763 27377-27956/com.androidcentral.app D/OkHttp﹕ Connection: Keep-Alive
11-23 16:03:17.764 27377-27956/com.androidcentral.app D/OkHttp﹕ Accept-Encoding: gzip
11-23 16:03:17.764 27377-27956/com.androidcentral.app D/OkHttp﹕ Cookie: acsessionhash=6cddfd7c1fe76a344309c9dfac7dfac0; PassportLocalSession=6e64cce2-7e01-4a2d-803e-dc9d1636704c-54c6048c-5152-4419-884f-d1301e7baf5f; acpassword=ae7da81dda3b79580a2351049281767f; PassportSessionDate=1448323386; acuserid=2669245; SESSf659a72bed167194167ec3641e600b60=9ct3V89eQufYoRYvRpIVEWg5R69E4GqVzQD7x3B2n0o; PassportSession=6e64cce2-7e01-4a2d-803e-dc9d1636704c-54c6048c-5152-4419-884f-d1301e7baf5f
11-23 16:03:17.764 27377-27956/com.androidcentral.app D/OkHttp﹕ User-Agent: okhttp/2.6.0
11-23 16:03:17.819 27377-27956/com.androidcentral.app D/OkHttp﹕ --> POST /mobiquo/upload.php HTTP/1.1
11-23 16:03:17.819 27377-27956/com.androidcentral.app D/OkHttp﹕ Content-Type: multipart/form-data; boundary=46df9530-8ac4-4943-a980-fc61b4879002
11-23 16:03:17.819 27377-27956/com.androidcentral.app D/OkHttp﹕ Content-Length: 449
11-23 16:03:17.819 27377-27956/com.androidcentral.app D/OkHttp﹕ Host: forums.androidcentral.com
11-23 16:03:17.819 27377-27956/com.androidcentral.app D/OkHttp﹕ Connection: Keep-Alive
11-23 16:03:17.819 27377-27956/com.androidcentral.app D/OkHttp﹕ Accept-Encoding: gzip
11-23 16:03:17.819 27377-27956/com.androidcentral.app D/OkHttp﹕ Cookie: acsessionhash=6cddfd7c1fe76a344309c9dfac7dfac0; PassportLocalSession=6e64cce2-7e01-4a2d-803e-dc9d1636704c-54c6048c-5152-4419-884f-d1301e7baf5f; acpassword=ae7da81dda3b79580a2351049281767f; PassportSessionDate=1448323386; acuserid=2669245; SESSf659a72bed167194167ec3641e600b60=9ct3V89eQufYoRYvRpIVEWg5R69E4GqVzQD7x3B2n0o; PassportSession=6e64cce2-7e01-4a2d-803e-dc9d1636704c-54c6048c-5152-4419-884f-d1301e7baf5f
11-23 16:03:17.819 27377-27956/com.androidcentral.app D/OkHttp﹕ User-Agent: okhttp/2.6.0
11-23 16:03:17.820 27377-27956/com.androidcentral.app D/MSW﹕ Exception: java.io.FileNotFoundException: 4970.jpg: open failed: ENOENT (No such file or directory)
11-23 16:03:17.820 27377-27956/com.androidcentral.app W/System.err﹕ java.io.FileNotFoundException: 4970.jpg: open failed: ENOENT (No such file or directory)
11-23 16:03:17.826 27377-27956/com.androidcentral.app W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:456)
11-23 16:03:17.827 27377-27956/com.androidcentral.app W/System.err﹕ at java.io.FileInputStream.<init>(FileInputStream.java:76)
11-23 16:03:17.827 27377-27956/com.androidcentral.app W/System.err﹕ at okio.Okio.source(Okio.java:163)
11-23 16:03:17.827 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.RequestBody$3.writeTo(RequestBody.java:117)
11-23 16:03:17.827 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.MultipartBuilder$MultipartRequestBody.writeOrCountBytes(MultipartBuilder.java:277)
11-23 16:03:17.827 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.MultipartBuilder$MultipartRequestBody.writeTo(MultipartBuilder.java:297)
11-23 16:03:17.827 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:163)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:867)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:748)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.Call.getResponse(Call.java:277)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:234)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:196)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at com.squareup.okhttp.Call.execute(Call.java:79)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at com.androidcentral.app.fragments.AttachmentListFragment$UploadAttachmentTask.doInBackground(AttachmentListFragment.java:269)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at com.androidcentral.app.fragments.AttachmentListFragment$UploadAttachmentTask.doInBackground(AttachmentListFragment.java:220)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
11-23 16:03:17.828 27377-27956/com.androidcentral.app W/System.err﹕ Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
11-23 16:03:17.829 27377-27956/com.androidcentral.app W/System.err﹕ at libcore.io.Posix.open(Native Method)
11-23 16:03:17.829 27377-27956/com.androidcentral.app W/System.err﹕ at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
11-23 16:03:17.829 27377-27956/com.androidcentral.app W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:442)
11-23 16:03:17.829 27377-27956/com.androidcentral.app W/System.err﹕ ... 20 more
11-23 16:03:17.829 27377-27956/com.androidcentral.app D/MSW﹕ Response is:
11-23 16:03:17.832 27377-27956/com.androidcentral.app E/AttachmentListFragment﹕ org.xmlpull.v1.XmlPullParserException: unexpected type (position:END_DOCUMENT null@1:1 in java.io.StringReader@24f2e54a)
at org.kxml2.io.KXmlParser.nextTag(KXmlParser.java:2054)
at com.androidcentral.app.fragments.AttachmentListFragment$UploadAttachmentTask.parseResponse(AttachmentListFragment.java:296)
at com.androidcentral.app.fragments.AttachmentListFragment$UploadAttachmentTask.doInBackground(AttachmentListFragment.java:285)
at com.androidcentral.app.fragments.AttachmentListFragment$UploadAttachmentTask.doInBackground(AttachmentListFragment.java:220)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
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)
该文件不存在。您可以通过使用FileInputStream读取它的第一个字节来确认这一点。
文件规范路径:/4970.jpg
对于任何普通的Android设备来说,这都是不可能的文件路径,因为根目录不仅永远不可写,而且是应用程序,而且一般来说是只读文件系统。
这表示您的函数是用无效参数调用的,需要在调用方中解决此问题。