当前位置: 首页 > 知识库问答 >
问题:

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

赵锐
2023-03-14
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)
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([])
from flask import request

共有1个答案

吕嘉赐
2023-03-14

这个虫子不能烧瓶。我被这个答案误导了

在文档中的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();
 类似资料:
  • 本文向大家介绍PHP多个文件上传到服务器实例,包括了PHP多个文件上传到服务器实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP多个文件上传到服务器的实现方法。对于多个文件同时上传到服务器的情况来说,我们需要使用到数组形式的参数传递及数据的遍历上传即可,具体的操作步骤分析如下: 一、实例说明 上传图片到服务器,是程序开发过程中必不可少的一个功能。它不但可以达到图片共享的目的,而且可

  • 我是web服务新手,正在开发一个文档管理系统,并尝试使用Jersey restful web服务保存文件和多个对象。 我的网站。xml 运行此服务后,我面临以下错误 项目库是 所以,我找不到任何解决方案,是否有任何不同的方法可以通过一个rest调用上载具有多个对象的文件。 请在这方面指导我。

  • 我正在用Laravel5.6构建一个表单,在其中我保存了一个名字和一个用户照片,但我需要将照片与用户名一起存储。我展示了我商店的代码 我可以使用$request->nombre获得用户名; 但我不知道怎么给照片取名字

  • 问题内容: 我一直在寻找解决方案,但是已经找不到了。 基本上,我想从Android设备上将文件上传到http网站。但是,我不知道如何执行此操作。我在设备上使用Java,并且我想在服务器端使用PHP。我只想上传文件,而不想在服务器上做任何花哨的事情。 谁能提供代码和/或指向我所需的链接?我对此几乎没有经验,也很茫然。 谢谢,NS PS。我没有PHP编码经验。 问题答案: 是的,所以我找到了Java方

  • 我需要使用okhttp将捆绑在apk中的二进制文件上传到服务器。使用urlconnection,您可以简单地获得资产的inputstream,然后将其放入您的请求中。但是,okhttp只给你上传字节数组,字符串,或者文件的选项。由于您无法获得捆绑在apk中的资产的文件路径,唯一的选择是将文件复制到本地文件目录(我宁愿不这样做),然后将文件交给okhttp?难道没有办法直接使用assetinputs

  • 正如上面的问题所描述的,我正在尝试将一个文件从okhttp3上传到服务器。 我总是收到‘你没有选择一个文件上传’在我的方法从codeIgniter部分。 这是我的代码 Android: 服务器代码: 我做错了什么?谢谢!