创建一个最小的flask / request文件上传器

时间:2018-11-04 07:58:37

标签: python flask

我试图创建一个最小的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为什么失败了吗?

1 个答案:

答案 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)