我正在使用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而不暂时保存?
答案 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()