Ion Android发送multipart / form-data

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ion Android发送multipart / form-data相关的知识,希望对你有一定的参考价值。

我正在尝试通过以下代码将图像上传到我的服务器。

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Ion.with(getContext())
                    .load("postAddress/account/upload/image")
                    .setMultipartParameter("userPhoto", "xx")
                    .setMultipartFile("upload", "image/jpeg", new File("/storage/emulated/0/Download/images.jpeg"))
                    .asJsonObject()
                    .setCallback(new FutureCallback<JsonObject>() {
                        @Override
                        public void onCompleted(Exception e, JsonObject result) {
                            e.printStackTrace();

                        }
                    });
        }
    });

但是,我得到这个错误。

10-26 17:58:51.864 19292-19292/tr.example W/System.err: com.google.gson.JsonParseException: unable to parse json
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.ion.gson.GsonParser$1.transform(GsonParser.java:55)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.ion.gson.GsonParser$1.transform(GsonParser.java:41)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.future.TransformFuture.onCompleted(TransformFuture.java:14)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.future.SimpleFuture.handleCallbackUnlocked(SimpleFuture.java:107)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.future.SimpleFuture.setComplete(SimpleFuture.java:141)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.future.SimpleFuture.setComplete(SimpleFuture.java:128)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.parser.ByteBufferListParser$3.onCompleted(ByteBufferListParser.java:43)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.DataEmitterBase.report(DataEmitterBase.java:16)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.http.AsyncHttpResponseImpl.report(AsyncHttpResponseImpl.java:92)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.http.AsyncHttpClient$4.report(AsyncHttpClient.java:424)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.FilteredDataEmitter$1.onCompleted(FilteredDataEmitter.java:24)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.DataEmitterBase.report(DataEmitterBase.java:16)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.http.filter.ContentLengthFilter.report(ContentLengthFilter.java:16)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.http.filter.ContentLengthFilter.onDataAvailable(ContentLengthFilter.java:39)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.Util.emitAllData(Util.java:23)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.AsyncNetworkSocket.onReadable(AsyncNetworkSocket.java:152)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.AsyncServer.runLoop(AsyncServer.java:821)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.AsyncServer.run(AsyncServer.java:658)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.AsyncServer.access$800(AsyncServer.java:44)
10-26 17:58:51.864 19292-19292/tr.example W/System.err:     at com.koushikdutta.async.AsyncServer$14.run(AsyncServer.java:600)

看起来它不会向我的服务器发送任何数据。

我在服务器端使用php slim框架

这是代码;

use PsrHttpMessageServerRequestInterface as Request;
use PsrHttpMessageResponseInterface as Response;

require '../vendor/autoload.php';
$app = new SlimApp;
$container = $app->getContainer();
$container['upload_directory'] = __DIR__ . '/uploads';

$app->post('/account/upload/image', function (Request $request, Response $response) {   
    $uploadedFiles = $request->getUploadedFiles();
    $directory = $this->get('upload_directory');

    $uploadedFile = $uploadedFiles['userPhoto'];
    if ($uploadedFile->getError() === UPLOAD_ERR_OK) {
        $filename = moveUploadedFile($directory, $uploadedFile);
        $response->write('uploaded ' . $filename . '<br/>');
    }


});


$app->run();

?>

服务器端实现是由slim框架提供的示例多部分/表单数据代码。

答案

您的PHP代码似乎没有响应为JSON。 但是你的android代码期待JSON。它可能会导致json解析异常。

因此,如果你想解决它的android方面,将代码asJsongObject()更改为asString()

Ion.with(getContext())
                    .....
                    .asJsonObject()   //<-- before
                    .setCallback(new FutureCallback<JsonObject>() {

=>
Ion.with(getContext())
                ...
                .asString()  //<-- after
                .setCallback(...)

以上是关于Ion Android发送multipart / form-data的主要内容,如果未能解决你的问题,请参考以下文章

使用Ion上传Android文件,但上传文件为空

multipart 中的@Part 以双引号发送字符串参数

jQuery AJAX 'multipart/form-data' 不发送数据?

如何在 python 中发送带有请求的“multipart/form-data”?

QNetworkAccessManager - 如何发送 MultiPart “PATCH” 请求

通过带有 multipart/form-data 的表单发送的文件作为空对象发送