如何基于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); } }
问题原因
- 未正确设置表单字段的
Content-Disposition头,导致OpenAI API无法识别purpose和file参数 - 复用同一个
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
相关产品推荐
相关产品推荐

