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