gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:06:44 26 4
gpt4 key购买 nike

在服务器端我使用 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());
}

然后我运行测试。服务器端无法从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 将文件上传到 Flask 服务器,并使用 request.files 进行检索。

更新

request 是 Fl​​ask 请求。

from flask import request

requests是一个 Python http 客户端库。

最佳答案

这个错误不属于 Flask。我被这个 answer 误导了

在文档中的 OkHttp 配方中。描述post一个文件使用下面的代码

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());
}

其实这种方式并没有错,它是post一个文件,你不需要提供文件名和其他表单数据。但这不是通常的用法。

我们经常需要上传一个指定名称的文件和一些key-value形式的数据。我们甚至需要上传多个文件。

 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();

关于python - OkHttp 上传多个带名称的文件到 Python Flask 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30078349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com