Larry_Yanan 2024-03-01 10:17 采纳率: 66.7%
浏览 90
已结题

关于#http#的问题:Qt http上传大文件失败,报错QNetworkReply::ContentNotFoundError文件大小在0.9G

Qt http上传大文件失败,报错QNetworkReply::ContentNotFoundError
文件大小在0.9G,期间uploadProgress信号的进度回调是正常的,文件已经全部上传了,但在最后结束的时候会卡住很久,可能一分钟左右吧,就给我报错了。
上传小文件的时候是正常的,上传300M的时候,结束时也会卡,但最终提示是成功的。
不明白为什么会报ContentNotFoundError这个的错,所以请问一下会有什么原因
代码如下:

        QString baseUrl = “xxx”;
        QUrl url(baseUrl);
        // key-value
        QUrlQuery query;
        url.setQuery(query);
    
        ptr_record_accessManager = new QNetworkAccessManager(this);
        ptr_record_accessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);

        QNetworkRequest request;
        request.setUrl(url);
    //    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    //    request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");
    //    request.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\""));

        // header(忽略)
        QMap<QString, QString> rawHeader;
        rawHeader.insert("X-Access-Token",g_current_http_header.X_Access_Token);
        rawHeader.insert("X-Tenant-Id",QString("%0").arg(g_current_http_header.X_Tenant_Id));
        QMapIterator<QString, QString> iIterator(rawHeader);//添加头部数据
        while (iIterator.hasNext()) {
            iIterator.next();
            qDebug()<<"send_request:::setRawHeader:"<<iIterator.key()<<iIterator.value();
            request.setRawHeader(iIterator.key().toLatin1(),iIterator.value().toLatin1());
        }

        ptr_record_file = new QFile(filenamepath,this);
        ptr_record_file->open(QIODevice::ReadOnly);

        // 构造文件上传的表单数据
        ptr_record_multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
        QHttpPart filePart;
        filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\""+submit_record_info.fromPath+"\""));//(没有这句也会导致失败)
        filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
        filePart.setBodyDevice(ptr_record_file);
    //    ptr_record_file->setParent(ptr_record_multiPart);
        ptr_record_multiPart->append(filePart);

        // 设置头部标志
        request.setHeader(QNetworkRequest::ContentTypeHeader,"multipart/form-data;boundary=" + ptr_record_multiPart->boundary());       //去掉boundary上的双引号(这句很关键,没有就失败了)
//        request.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, false);

        //发送上传请求
        ptr_record_reply = ptr_record_accessManager->post(request, ptr_record_multiPart);
    //    ptr_record_multiPart->setParent(ptr_record_reply);
        connect(ptr_record_accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(record_replyFinished(QNetworkReply*)));
        connect(ptr_record_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(record_loadError(QNetworkReply::NetworkError)));
        connect(ptr_record_reply, SIGNAL(uploadProgress(qint64 ,qint64)), this, SLOT(record_loadProgress(qint64 ,qint64)));

  • 写回答

4条回答 默认 最新

  • Larry_Yanan 2024-03-12 09:52
    关注

    这个问题是由服务器端导致的,文件过大时,未能即时返回给我信息,且我这边模拟超时弹出弹窗。后续改变了分片上传的方式每一次最多上传100M,能够总结出规律,

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 3月1日