📜  预期的 str、bytes 或 os.PathLike 对象,而不是 FileStorage (1)

📅  最后修改于: 2023-12-03 15:12:53.040000             🧑  作者: Mango

文件上传时避免使用FileStorage

在 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() 方法对文件名进行安全处理,然后把文件保存在本地,并返回保存的文件名。