我试图创建一个最小的Flask服务器/客户端python电影文件上传器,但是我的客户端代码似乎无法正常工作,我想知道是否还需要更多?
Server.py
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST', 'PUT'])
def hello_world():
file = request.files
return(str(file))
运行方式:烧瓶运行
Uploader.py
import requests
files = {'file': open("BigBuckBunny_320x180.mp4")}
r = requests.post("http://127.0.0.1:5000/", files)
print(r.text)
运行为:python Uploader.py
但是hello_world
方法返回ImmutableMultiDict([])
出于调试目的,我使用了以下似乎可行的curl片段:
curl -i -X PUT -F filedata=@BigBuckBunny_320x180.mp4 "http://localhost:5000/"
并返回
ImmutableMultiDict([('file', <FileStorage: u'BigBuckBunny_320x180.mp4' ('application/octet-stream')>)])
知道Uploader.py
为什么失败了吗?
答案 0 :(得分:0)
我尝试了您给我们的示例,并在我的机器上解决了您的问题。
经过一番挖掘,我发现您可以stream requests使用请求模块:
请求支持流式上传,这使您可以发送大型流或文件而无需将其读入内存。
您只需要提供要流式传输的文件,然后以读取二进制模式 rb 打开它即可。
在flask应用程序方面,我还发现了this条文章。
因此,解决您的问题的方法是:
app.py
from flask import Flask, request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST', 'PUT'])
def hello_world():
# 'bw' is write binary mode
with open("BigBuckBunny_320x180_flask_upload.mp4", "bw") as f:
chunk_size = 4096
while True:
chunk = request.stream.read(chunk_size)
if len(chunk) == 0:
return 'Done'
f.write(chunk)
if __name__ == '__main__':
app.run()
Uploader.py
import requests
# Give proper path to your file, I used mine from flask app directory
with open('BigBuckBunny_320x180.mp4', 'rb') as f:
requests.post('http://127.0.0.1:5000/', data=f)