我正在将可能很大的文件上传到Web服务器.目前我这样做:
import urllib2
f = open('somelargefile.zip','rb')
request = urllib2.Request(url,f.read())
request.add_header("Content-Type", "application/zip")
response = urllib2.urlopen(request)
Run Code Online (Sandbox Code Playgroud)
但是,这会在发布之前将整个文件的内容读入内存.我怎样才能将文件流式传输到服务器?
我正在通过POST将带有urllib2的相当大的文件上传到服务器端脚本.我想显示一个显示当前上传进度的进度指示器.是否有urllib2提供的钩子或回调,允许我监控上传进度?我知道您可以通过连续调用连接的read()方法进行下载,但是我没有看到write()方法,只是向请求添加数据.
我在 Windows 10 上使用 Python 3.8 使用该requests
模块。正如标题所示,我正在将非常大的文件发布到 HTTP 服务器,并且我想提供上传的状态。
我已经阅读了 10-20 个关于这个主题的 Stack Overflow 帖子,阅读了互联网上散布的文章,并深入研究了 GitHub 上我现在甚至不记得的项目的源代码。我试图实现我读到的所有内容,但无济于事。关于这个主题的很多信息已经有很多年了,并且该requests
模块自那以后已经得到了很大的改进 - 因此一些信息可能已经过时。
我遇到的问题是使用 发送文件块requests.Response.post('Some-URL', data=file_chunk, header=header)
。如果上传了 5 个文件块,则服务器上有 5 个单独的文件,而不是 1 个组合文件。
为了提供文件上传的状态,我创建了一个类似于下面所示示例的生成器函数。
def read_in_chunks(file_object, chunk_size=1024):
"""Generator to read a file piece by piece.
Default chunk size: 1k."""
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
Run Code Online (Sandbox Code Playgroud)
然后我迭代了这样创建的生成器对象:
with open('Some-File.zip', 'rb') as file_obj:
for file_chunk in read_in_chunks(file_obj):
requests.Response.post('Some-URL', data=file_chunk.encode('utf-8'), header=header)
Run Code Online (Sandbox Code Playgroud)
这不起作用。在文件块上传到的服务器上,每个块作为单独的文件存储在服务器上。如果文件被分成 5 个块,那么现在就有 5 个文件。在 …
借助Seafile,人们可以创建公共上传链接(例如https://cloud.seafile.com/u/d/98233edf89/
),以通过不带身份验证的浏览器上传文件。
Seafile webapi不支持任何不带身份验证令牌的上传。
我该如何使用curl或python脚本从命令行使用此类链接?
python ×4
urllib2 ×3
http ×2
chunks ×1
curl ×1
http-post ×1
http-upload ×1
post ×1
python-3.x ×1