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

11 投票
2 回答
4804 浏览
提问于 2025-04-18 12:05

我正在使用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

撰写回答