📅  最后修改于: 2023-12-03 15:12:53.040000             🧑  作者: Mango
在 Flask 中,文件上传是非常常见的操作。上传的文件可以通过 request.files 中的字典对象进行获取。然而,若直接使用 request.files 某些情况下会导致错误,例如上传大尺寸文件。这时应该使用 file 对象的 save() 方法。但是,有时候即使使用了 save() 方法,仍然会出现预期的 str、bytes 或 os.PathLike 对象,而不是FileStorage
的错误。这个错误是因为 save() 方法还是返回了一个FileStorage对象。所以,我们必须将这个对象转换为其他类型的对象。
为了避免这个错误,我们可以先使用 Flask 内置的 secure_filename() 方法对文件名进行安全处理,然后把文件保存在本地,并返回保存的文件名。 以下是一些避免错误的方法:
from flask import Flask, request
from werkzeug.utils import secure_filename
import os
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads/'
@app.route('/', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return 'No file uploaded', 400
file = request.files['file']
if file.filename == '':
return 'No selected file', 400
filename = secure_filename(file.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(file_path)
return 'File uploaded successfully', 200
在以上代码中,我们使用 secure_filename() 方法对文件名进行了安全处理,并将其保存在本地。接下来,您可以根据需要将路径作为字符串返回或使用其他必要的对象,而不是 FileStorage。
总结一下,对于任何需要保存上传文件的 Flask 应用程序,我们都应该避免使用 FileStorage 对象,而应该使用预期的 str、bytes 或 os.PathLike 对象。为了避免这个错误,我们可以先使用 Flask 内置的 secure_filename() 方法对文件名进行安全处理,然后把文件保存在本地,并返回保存的文件名。