<p>正如其他答案已经指出的:<a href="https://github.com/kennethreitz/requests/issues/295" rel="nofollow noreferrer">^{<cd1>} doesn't support POSTing multipart-encoded files without loading them into memory</a>。在</p>
<p>要上载大文件而不使用多部分/表单数据将其加载到内存中,可以使用<a href="http://atlee.ca/software/poster/" rel="nofollow noreferrer">^{<cd2>}</a>:</p>
<pre><code>#!/usr/bin/env python
import sys
from urllib2 import Request, urlopen
from poster.encode import multipart_encode # $ pip install poster
from poster.streaminghttp import register_openers
register_openers() # install openers globally
def report_progress(param, current, total):
sys.stderr.write("\r%03d%% of %d" % (int(1e2*current/total + .5), total))
url = 'http://example.com/path/'
params = {'file': open(sys.argv[1], "rb"), 'name': 'upload test'}
response = urlopen(Request(url, *multipart_encode(params, cb=report_progress)))
print response.read()
</code></pre>
<p>它可以调整为允许使用GET response对象而不是本地文件:</p>
^{pr2}$
<p>此解决方案要求GET响应中有一个有效的<code>Content-Length</code>头(已知文件大小)。如果文件大小未知,则分块传输编码可用于上载多部分/表单数据内容。类似的解决方案可以使用<code>urllib3.filepost</code>实现,该方案与<code>requests</code>库一起提供,例如,基于<a href="https://stackoverflow.com/a/16221027/4279">@AdrienF's answer</a>,而不使用<code>poster</code>。在</p>