OkHttp将带有名称的多个文件上传到Python Flask服务器

时间:2015-05-06 13:33:12

标签: python flask okhttp

在服务器端,我使用Python烧瓶:

from flask import Flask, request
app = Flask(__name__)

@app.route("/upload", methods=["POST"])
def upload():
    print request.files
    print request.form
    return "200 ok"

if __name__ == '__main__':
    app.run(port=5000)

Java测试代码块:

public void test_Upload() throws Exception{
        MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
        MediaType MEDIA_TYPE_XO = MediaType.parse("image/png");
        RequestBody requestBody = new MultipartBuilder()
                .type(MultipartBuilder.FORM)
                .addPart(
                        Headers.of("Content-Disposition", "form-data; name=\"title\""),
                        RequestBody.create(null, "Square Logo"))
                .addPart(
                        Headers.of("Content-Disposition", "form-data; name=\"image\""),
                        RequestBody.create(MEDIA_TYPE_PNG, new File("/Users/lollipop/Downloads/ic_launch.png")))
                .addPart(
                        Headers.of("Content-Disposition", "form-data; name=\"google\""),
                        RequestBody.create(MEDIA_TYPE_XO, new File("/Users/lollipop/Downloads/google-logo.png")))
                .build();
        Request request = new Request.Builder()
                .url("http://localhost:5000/upload")
                .post(requestBody)
                .build();
        Response resp = httpClient.newCall(request).execute();
        System.out.println(resp.body().string());
    }

我正在进行测试。服务器端无法从request.forms

读取文件 服务器上的

输出:

ImmutableMultiDict([])
ImmutableMultiDict([('image', u'5 ...many data ... fffd'), ('google', u'5i\u ...many data ... fffd'),('title', u'Square Logo')])

为什么我的文件上传到request.form而不是request.files。并且所有二进制文件数据都被解析为unicode字符串。

接下来,我在Python请求中进行测试。遵循代码:

resp = requests.post("http://localhost:5000/upload",
                         files={
                             "image": open("/Users/lollipop/Downloads/ic_launch.png", "rb"),
                             "title": open("/Users/lollipop/Downloads/ic_launch.png", "rb"),
                             "google": open("/Users/lollipop/Downloads/google-logo.png", "rb")
                         })

服务器端输出反转:

ImmutableMultiDict([('image', <FileStorage: u'ic_launch.png' (None)>), ('google', <FileStorage: u'google-logo.png' (None)>), ('title', <FileStorage: u'ic_launch.png' (None)>)])
ImmutableMultiDict([])

上传文件位于request.files而非request.form,这是我的预期结果。

因此。如何使用OkHttp将文件上传到烧瓶服务器,并使用request.files进行检索。

更新

request是Flask requst。

from flask import request

requests是一个Python http客户端库。

0 个答案:

没有答案