【问题标题】:issue with aiohttp POST for a binary file upload用于二进制文件上传的 aiohttp POST 问题
【发布时间】:2015-06-07 12:17:45
【问题描述】:

我已成功使用requests 模块上传二进制文件(jpg),内容如下:

upload_url = 'http:10.1.1.1:8080/api/media/photo'
headers = {'Authorization': token_string, 'Content-Type': 'image/jpg'}
data = open('photo.JPG', 'rb')
params = {'name': 'photo.JPG'}
r = requests.post(upload_url, params=params, data=data, headers=headers)

现在尝试使用aiohttp 客户端执行此操作。这是我目前所拥有的:

def upload_photos(token):
    upload_url = '10.0.1.1:8080/api/media/photo'
    headers = {'Authorization': token, 'Content-Type': 'image/jpg'}
    data = {'file': open('photo.JPG', 'rb')}
    params = {'name': 'photo.JPG'}
    r = yield from aiohttp.request('post', upload_url, params=params, data=data, headers=headers)

if __name__ == '__main__':     
    asyncio.get_event_loop().run_until_complete(upload_photos(token))

但我得到了 400 的回报,{"detail": "Specified value is invalid: Invalid Content-Length specified"}
好像它没有正确发送photo.jpg。 aiohttp 文档提到了多部分编码文件和流式传输,但这不是我想要的。

如何在请求中形成类似的带有二进制文件的 POST,但使用 aiohttp?

【问题讨论】:

    标签: python-3.x http-post python-requests python-asyncio aiohttp


    【解决方案1】:

    感谢您提交错误报告。作为解决方法,我想使用分块传输编码:

    headers['Transfer-Encoding'] = 'chunked'
    r = yield from aiohttp.request('post', upload_url, params=params, data=data, headers=headers, chunked=1024) 
    

    配方应该可以工作,至少我们的测试套件中有非常相似的代码:https://github.com/KeepSafe/aiohttp/blob/master/tests/test_client_functional.py#L322

    我将尝试在下一个 aiohttp 版本中为您的上传方式修复 Content-Length 计算。

    【讨论】:

    • 哇,谢谢@Andrew。我最不想看到的是我看到的是一个 aiohttp 错误....我总是首先责备自己不知道自己在做什么;-)。
    • 仍然无法做到...这是我的代码 sn-p...我做错了什么吗? headers = {'Authorization': token_string, 'Content-Type': 'image/jpg', 'Transfer-Encoding': 'chunked'} params = {'name': 'photo.JPG'} with open('photo.JPG', 'rb') as f: r2 = yield from aiohttp.request('post', upload_url, params=params, data=f, chunked=1024, headers=headers)
    • 我猜是发送文件内容,而不是文件对象。类似于data=f.read()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    相关资源
    最近更新 更多