【问题标题】:Flask passing uploaded file to another service using requestsFlask 使用请求将上传的文件传递给另一个服务
【发布时间】:2018-10-26 19:51:12
【问题描述】:

我有一个接收文件的 Python 烧瓶网络服务:

标题:

内容类型:multipart/formdata

内容:

“fileTest”:上传的文件

当我使用 requests lib 将文件传递给另一个服务时,我遇到了上传文件未传递的问题。

我的代码:

files = {}
for form_file_param in request.files:
    fs = request.files[form_file_param]  # type: FileStorage
    files[form_file_param] = (fs.filename, fs.read())

req_headers = {
    "content-type": u "multipart/form-data; boundary=X-INSOMNIA-BOUNDARY",
}

r = requests.request(method='POST',
                     url=url,
                     headers=req_headers,
                     files=files)

我直接通过邮递员联系我的其他服务,它成功运行。我似乎无法弄清楚我在上面的代码中做错了什么。

【问题讨论】:

    标签: python-2.7 flask python-requests


    【解决方案1】:

    您需要遵循请求文档。

    http://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file

    url = 'https://httpbin.org/post'
    files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
    r = requests.post(url, files=files)
    r.text
    

    改变。观看 OP 响应后,标题引起的问题 - Content-Type

    这是一种特殊的内容类型,可以在一个大请求中可视化为多个子请求。这些子请求中的每一个(一个表单数据元素)都有自己的一组标题。实际数据的内容类型在里面。1

    注意:fsfs.read() 之间没有区别

    #models.py line 149
    if isinstance(fp, (str, bytes, bytearray)):
        fdata = fp
    else:
        data = fp.read()
    

    【讨论】:

    • 所以我发现了这个问题。 fs 是一个文件存储对象,而不是请求接收的类文件对象。它有一个名为 fs.stream 的方法,它是一个类文件对象。我使用了它,我发现标题中的boundary=X-INSOMNIA-BOUNDARY 也导致了这个问题,所以我删除了它并且它起作用了。还是谢谢你。
    • param files: (optional) Dictionary of ``'filename': file-like-objects`` for multipart encoding upload. requests.request.__doc__ 。您还可以看到 Content-Type 如何在 models.py 第 154 行 @NahinB 上创建
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多