Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OkHttp将多个具有名称的文件上载到Python Flask服务器_Python_Flask_Okhttp - Fatal编程技术网

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

OkHttp将多个具有名称的文件上载到Python Flask服务器,python,flask,okhttp,Python,Flask,Okhttp,在服务器端,我使用Python flask: 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__ == '__m

在服务器端,我使用Python flask:

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());
    }
我进行了测试。服务器端无法从
请求中读取文件。表单

服务器上的输出:

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([])

是一个Python http客户端库。

不允许出现此错误。我被这误导了

在文档中的OkHttp配方中。描述了post a文件使用的以下代码

public static final MediaType MEDIA_TYPE_MARKDOWN
      = MediaType.parse("text/x-markdown; charset=utf-8");

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    File file = new File("README.md");

    Request request = new Request.Builder()
        .url("https://api.github.com/markdown/raw")
        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
        .build();

    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

    System.out.println(response.body().string());
  }
实际上,这种方式不是错误的,它发布一个文件,您不需要提供文件名和其他表单数据。 但这不是一个常见的用法

我们经常需要上传一个具有指定名称和一些键值表单数据的文件。我们甚至需要上传多个文件

 RequestBody requestBody = new MultipartBuilder()
                .type(MultipartBuilder.FORM)
                .addFormDataPart("username", username)
                .addFormDataPart("password", password)
                .addFormDataPart("avatar", "avatar.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
                .addFormDataPart("introduce_image", "introduce_image.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
                .build();

您能出示所提出的请求吗?-为了知道bug在哪一边:Java还是Python。
 RequestBody requestBody = new MultipartBuilder()
                .type(MultipartBuilder.FORM)
                .addFormDataPart("username", username)
                .addFormDataPart("password", password)
                .addFormDataPart("avatar", "avatar.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
                .addFormDataPart("introduce_image", "introduce_image.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
                .build();