You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

APIFlask跨域POST文件上传卡在OPTIONS预检请求问题求助

问题描述

我在使用APIFlask开发时遇到跨域文件上传异常:我的应用需要向同一主机不同Docker容器中的关联应用发起跨域请求,其中一项功能是上传单个约7MB的.zip文件及其他表单字段到服务器。

已为所有关联应用配置CORS,GET请求可正常执行,但携带文件的POST上传请求卡在OPTIONS预检阶段(控制台显示返回200状态码),后续未触发实际的POST请求;如果不携带.zip文件,请求可正常执行(仅返回表单验证错误)。

当前开发环境下CORS允许所有源访问,API密钥加载正常,不存在授权失败问题。

Flask路由代码

CORS(islets_api) ##adds CORS to this blueprint

@islets_api.route('/', methods=["POST", "OPTIONS"])
@login_required
def add_islet():
    """
    Add islet data to db
    """
    form_data = request.form.to_dict()
    files = request.files

    if('experiment_name' not in form_data and 'description' not in form_data
        and 'sampling' not in form_data and 'protocol' not in form_data
        and 'cell_num' not in form_data):
        return {"message": "Missing input data. Check form.",  "status": "error"}, 400
    if 'islet_data' not in files:
        return {"message": "Missing islet data (.zip). Check form.",  "status": "error"}, 400

    folder_name = uuid.uuid4().hex
    folder_path = os.path.join(current_app.config.get('APP_BASE_PATH'),
                               current_app.config.get('ISLET_DATA_FOLDER'),
                               folder_name)
    os.makedirs(folder_path)
    ext = files['islet_data'].filename.split('.')[-1]
    filename = 'islet_data.' + ext
    file_path = os.path.join(folder_path, filename)
    files['islet_data'].save(file_path)

    islet = Islet(folder = folder_name, **form_data)
    db.session.add(islet)
    db.session.commit()

    return {
        'message': 'Islet uploaded successfully.',
        'status': 'success'
    }, 200

Axios请求代码

getConfigs(){
        const api_key = member.api_key ? member.api_key : ''
        return {
            headers: {
                "Authorization": `Bearer ${api_key}`,
                "Content-Type": "multipart/form-data"
            }
        }
    }

uploadIslet(){
        const configs = this.getConfigs()
        const data = this.getFormData()
        this.startLoader()
        window.scrollTo(0, 0);
        axios.post(this.url, data, configs)
        .then(function(response){
            setMessage(response.data.message,
                this.alerts[response.data.status],
                this.messageContainer);
            window.scrollTo(0, 0);
            if(response.data.status=='success'){
                window.location.hash = 'islander-all-islets'
            }
            else{
                this.generateComponent()
            }
        }.bind(this)).catch(function(error){
            this.errorHandling(error, 'Something went wrong.')
            this.generateComponent()
        }.bind(this))
    }

内容的提问来源于stack exchange,提问作者Marko Šterk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:43:11