Python requests 发送字符串作为文件

12 投票
1 回答
9401 浏览
提问于 2025-04-18 11:17
with open(full_path, 'r+b') as f:
  i=0
  while True:
  chunk = f.read(max_chunk_size)
  if not chunk:
    break
  with tempfile.TemporaryFile() as t:
    t.write(chunk)
    t.seek(0)
    r = requests.post(endpoint + 'upload_chunk',
                      files={'chunk':t},
                      data={'mod_time':file_update_time,
                            'directory':'/'.join(subdirs),
                            'filename':filename,
                            'chunk_pos':i},
                      auth=auth)
    i+=max_chunk_size

在我的代码中,我现在把一个文件分成小块,然后把这些小块读入一个临时文件,再把这个临时文件传给请求。请问有没有办法直接把这些小块发送到服务器,而不需要先写入临时文件,然后再让requests.post去读取这个文件呢?我更希望不需要修改服务器端的代码。我想这样就能省去额外读写4兆字节的数据,从而提高执行速度。

把文件分块是必要的;这段代码还没有完成。

1 个回答

21

可以看看Requests的快速入门页面,特别是上传多部分编码文件这一部分。

在那儿你会看到这样一句话:

如果你想的话,可以发送字符串,让它们被当作文件接收:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "some,data,to,send\\nanother,row,to,send\\n"
  },
  ...
}

注意,"file"是服务器期待的文件上传字段的名字。它对应的HTML代码如下:

<input type="file" name="file">

撰写回答