无法使用 OKHttp 上传 PNG 文件 - 找不到文件



我在使用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设备来说,这都是不可能的文件路径,因为根目录不仅永远不可写,而且是应用程序,而且一般来说是只读文件系统。

这表示您的函数是用无效参数调用的,需要在调用方中解决此问题。

最新更新