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

如何基于QT C++代码实现OpenAI Assistant API文件上传

解决QT调用OpenAI文件上传API的问题

问题背景

使用QT Creator开发C++客户端,基于QT 6.5的QNetworkManager和QNetworkRequest实现OpenAI Assistant API的文件上传功能,调用POST /v1/files接口时返回错误:

{"error": {"code": null, "message": "'file' is a required property", "param": null, "type": "invalid_request_error"}}

错误代码片段

原代码对多表单字段的处理不符合接口要求:

#define OpenAI_UPLOAD_FILE_URL "https://api.openai.com/v1/files"
/*
 * Supporting function only
 * Pretty Print API response from JSON Object
 */
void AI_Dialog::printJson(QJsonObject json){
    QJsonDocument doc(json);
    QString jsonString = doc.toJson(QJsonDocument::Indented);
    qDebug().noquote() << jsonString.toStdString().c_str();
}

/*
 * Wrapper function to OpenAI to upload a file
 * Note: reply is defined in AI_Dialog class as QNetworkReply *reply.
 *       OpenAI_apiKey is key to OpenAI key (not shown)
 */
bool AI_Dialog::upload_file()
{
    QUrl APIurl(OpenAI_UPLOAD_FILE_URL);

    QNetworkRequest request(APIurl);
    bool status = false;

    //If not API key do not proceed
    if (this->OpenAI_apiKey.isEmpty())
        return false;

    //Setup RestAPI Header
    request.setHeader(QNetworkRequest::ContentTypeHeader, QByteArray("multipart/form-data"));
    request.setRawHeader("Authorization", "Bearer " + this->OpenAI_apiKey.toUtf8());


    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    QHttpPart valuePart;
    valuePart.setRawHeader("purpose", "assistants");
    multiPart->append(valuePart);

    valuePart.setRawHeader("file", "@contents.json");
    valuePart.setBody("bla bla");
    multiPart->append(valuePart);

    // Do REST API Post operation
    reply = this->network_access_manager.post(request, multiPart);

    //Setup REST AI completion callbacks. Mian one is ReadyRead
    status = connect(reply, &QNetworkReply::readyRead, this, &AI_Dialog::readyRead);
    return true;
}

//Rest API callback completion for POST, GET etc to OPenAI
void AI_Dialog::readyRead()
{
    QUrl url;
    QJsonArray array;
    QJsonObject ar1;

    if (reply->error() == QNetworkReply::NoError){

        //Get Data from reply
        QString reply_str = reply->readAll();

        QByteArray byte_array = reply_str.toUtf8();
        QJsonDocument doc = QJsonDocument::fromJson(byte_array);
        QJsonObject obj = doc.object();

        //Debug Only
        printJson(obj);
    }
}

问题原因

  1. 未正确设置表单字段的Content-Disposition头,导致OpenAI API无法识别purpose和file参数
  2. 复用同一个QHttpPart对象添加两个字段,前一个字段的配置被覆盖,请求格式不符合multipart/form-data规范

修正后的代码

正确配置每个表单字段的Header,确保API能正确识别参数:

QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

QHttpPart valuePart;
valuePart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain");
valuePart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"purpose\"");
valuePart.setBody("assistants");
multiPart->append(valuePart);

QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"file\"; filename=\"Hello_There.json\"");
filePart.setBody("{bla bla}");

multiPart->append(filePart);

内容的提问来源于stack exchange,提问作者seany

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:41:17