从werkzeug.datastructures.FileStorage计算md5而不保存为文件
我正在使用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 个回答
2
来自Flask文档
文件
这是一个MultiDict,里面存放的是通过POST或PUT请求上传的文件。每个文件都以FileStorage对象的形式存储。它基本上就像你在Python中熟悉的标准文件对象,不过它还有一个save()函数,可以把文件保存到你的电脑上。
如果它和文件对象是一样的,你应该可以这样做
img_key = hashlib.md5(file.read()).hexdigest()
17
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