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

时间:2014-07-04 08:38:58

标签: 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()

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

TypeError: must be string or buffer, not FileStorage

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

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

2 个答案:

答案 0 :(得分:8)

request.files['file']属于FileStorage类型,其read()方法。 尝试做:

file = request.files['file']

#file.read() is the same as file.stream.read()
img_key = hashlib.md5(file.read()).hexdigest() 

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

答案 1 :(得分:2)

来自Flask docs

  

文件

     

将文件作为POST或PUT的一部分上传的MultiDict   请求。每个文件都存储为FileStorage对象。基本上   表现得像你从Python中知道的标准文件对象   区别在于它还有一个可以存储文件的save()函数   在文件系统上。

如果它与文件对象相同,则应该能够执行此操作

img_key = hashlib.md5(file.read()).hexdigest()