使用 ajax 和 flask 上传具有不同扩展名的文件

Uploading files with different extensions with ajax and flask

我正在使用 Flask 上传文件 ajax 代码是:

app = Flask(name) 
app.config["TEMPLATES_AUTO_RELOAD"] = True 
CORS(app) 
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

@app.route("/upload//<element_id>", methods=['GET', 'POST'])
def ws_product_upload(element_id):
    print("Starting....")
    if request.is_xhr:
        print("xhr request received")
    if request.method == 'POST':
        f = request.files['file']
        process_inmemory( element_id, file=f)
        print("file received by post")
        if request.is_xhr:
            print("xhr request received inside post")
            return json.dumps({'result': True})
        return json.dumps({'result': True})
    return 'file uploaded needs a post call'

当我发送图片时,一切正常,但对于一个简单的 txt 文件,却失败了。

我试过:

app.config["UPLOADED_FILES_ALLOW"] = ['.txt']  # with [] and with out with . and without and nothin
app.config["UPLOADED_FILES_DENY"] = 'exe'

我想用几乎所有的 mime 类型和扩展来做

我用的是nginx + gunicorn(不知道有没有关系)

才是正确的做法

所以 - 这是一些猜测:-)

"UPLOADED_FILES_ALLOW" 和 "UPLOADED_FILES_DENY" 是 Flask-Uploads 中使用的两个 env 变量名 - 这就是为什么我问你是否使用它,但你没有。

'UPLOAD_EXTENSIONS' 是 Miguel Grinberg 的大型教程中使用的环境变量 - 请参阅此处 https://blog.miguelgrinberg.com/post/handling-file-uploads-with-flask

我假设您遵循了 Miguel Grinberg 的教程,并且在您的 - 截至目前 - 隐藏的 process_inmemory 函数中,您执行了与教程中类似的操作,例如像 if file_ext not in current_app.config['UPLOAD_EXTENSIONS']:.

这样的支票

这实际上是唯一合理的解释 - 直到您真正向我们展示您的完整代码。

问题不在于上传,问题在于 chrome 和 cors,我不明白为什么但上传图片它有效。

解决方案是在像这样的函数之前放置一个cors装饰器cross_origin

from flask_cors import CORS, cross_origin
app = Flask(__name__)
CORS(app)


@app.route("/upload//<element_id>", methods=['GET', 'POST'])
@cross_origin(supports_credentials=True, origins=["https://blabla.com","http://blabla:4202"])
def ws_product_upload(element_id):
    print("Starting....")
    if request.is_xhr:
        print("xhr request received")
    if request.method == 'POST':