从werkzeug.datastructures.FileStorage计算md5而不将对象保存为文件

Val*_*itz 7 python flask

我正在使用Flask上传文件.为了防止两次存储相同的文件,我打算从文件内容中计算md5,并将文件存储为.除非文件已经存在.

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']
        #next line causes exception
        img_key = hashlib.md5(file).hexdigest()
Run Code Online (Sandbox Code Playgroud)

不幸的是,hashlib.md5抛出异常:

TypeError: must be string or buffer, not FileStorage
Run Code Online (Sandbox Code Playgroud)

我已经尝试过file.stream - 效果相同.

有没有办法从文件中获取md5而不暂时保存?

dat*_*ata 9

request.files['file']是一种FileStorageread()方法的类型.尝试做:

file = request.files['file']

#file.read() is the same as file.stream.read()
img_key = hashlib.md5(file.read()).hexdigest() 
Run Code Online (Sandbox Code Playgroud)

更多信息FileStorage:http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage

  • @ValentinHeinitz:用`file.seek(0)`倒回文件指针. (4认同)
  • 我只是为了计算MD5而不是将整个内容读入内存中. (3认同)
  • 不幸的是,在调用file.read()之后,文件似乎变空了.因此,在调用file.save()之后,我获得了0内容的文件. (2认同)