QtのQHttpMultiPart(マイクロチャネルアプレットクラウドサーバアップロードファイル)

簡単な紹介

アップロードするファイルがある場合、タグのセットにenctype =「multipart / form-データを形成する必要があるページ上のフォームのフォーム、 」 マルチパート/フォームのデータにContent-Typeのセットつまり、プロパティを、マルチパート型伝送非テキスト種類は非常に便利です。同様QHttpMultiPart、QHttpPart、QHttpMultiPartに対応するQT  RFC 2046  周防は、一般的に大きなデータファイルを転送するために使用されるHTTPを介して送信されたMIMEマルチパートメッセージを、説明しました。

列挙型QHttpMultiPart :: ContentTypeを

値値 説明説明
QHttpMultiPart::MixedType 0 互いに独立の「マルチパート/混合」サブタイプ本体部材手段に相当し、RFC 2046に記載されているように。
QHttpMultiPart::RelatedType 1 2387 RFCのように、互いに関連する「マルチパート/関連する」サブタイプ本体部材手段に相当します。
QHttpMultiPart::FormDataType 2 RFC 2388に記載されているように本体は、フォーム要素を含むことを意味する「マルチパート/フォームデータ」サブタイプに対応します。
QHttpMultiPart::AlternativeType 3 本体部分はオプションであり、同一の情報がRFCに2046として表現されることを意味する「マルチパート/代替」サブタイプに対応します。

ここでは、アップロードされたファイルにマイクロチャネルクラウドサーバアプレットの規定を見て:

アップロードリンク命令

ユーザデータを得ることが返された後、パケットの組立、前記URL URLフィールドのHTTP POSTリクエストは、以下を含む、本体部分フォーマットマルチパート/フォームデータを、返されます。

キー 説明
キー この/である/ /例/ file.path 要求パケットにおけるパスフィールド
署名 Q-サインアルゴリズムSHA1 =&Q-AK = AKID9 ... 返品承認データ・フィールド
X-COS-セキュリティトークン Cukha70zkXIBqkh1Oh ... 戻りデータトークンフィールド
X-COS-メタFILEID HDze32 / qZENCwWi5 ... フィールドデータcos_file_idを返します。
ファイル ファイルの内容 ファイルのバイナリコンテンツ

前記取得した要求データが返さHttpPartキー部、署名、X-COS-セキュリティトークン、X-COS-メタFILEIDアドレス。

POST https://api.weixin.qq.com/tcb/uploadfile?access_token=ACCESS_TOKEN

私は、ファイルをアップロードする方法を知っている、そして今、私たちはその袖をロールアップして物事を行うために始めます!

ここでは、以下の強調表示されます:

我々は境界を指定する必要がないことを文書には、自動的場合、それ以外の場合は渡すことはできません、あなたがリクエストヘッダの境界線を追加する必要があるので、MIME境界の値は、事前に境界と要求で一致していなければならないという条件で、あなたの境界に追加されますカスタム境界、また頭を維持する必要があると要求が一致しています!(公式文書ではいくつかの問題と言うがあります)

QNetworkRequest mulRequest;
mulRequest.setHeader(QNetworkRequest::ContentTypeHeader,"multipart/form-data;boundary=boundary_.oOo._");

アップロードされる各フィールドのQHttpPartセットを使用して本体部分のアップロードフォームは、QHttpPartクラスは(QHttpMultiPartで表される)HTTPマルチパートMIMEメッセージのボディ部を有しています。ブロックとデータブロックのヘッダ、互いに二つの連続包装の存在をQHttpPart。(、のsetHeaderの使用ヘッダーを設定)とsetRawHeader()、小データ・ブロックを読み出す、setBody()は、データの大きなブロック場合、例えば:setBodyDevice()を使用して画像を表示します。クラウドサーバアプレットに「3.png」絵という名前のファイルをアップロードするためのコードセグメントで見てみましょう:

void JsonDataModel::sendFileData(QString path,QString url,QString authorization,QString token,QString cos_file_id){//此处为获取到的body数据,待上传用
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    QNetworkRequest mulRequest;
    mulRequest.setHeader(QNetworkRequest::ContentTypeHeader,"multipart/form-data;boundary=boundary_.oOo._");//此处boundary不能省!需要和QHttpMultiPart中的一致

    QString fileName = QFileDialog::getOpenFileName(0,
                       tr("选择图片"),QDir::currentPath(), tr("Image Files (*.png *.jpg *.bmp)"));//选择3.png的路径
    QFile *file = new QFile(fileName,multiPart);//开辟新的储存空间给文件,当释放multiPart空间时同时释放文件空间
    file->open(QIODevice::ReadOnly);

    QHttpPart keyPart;
    keyPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"key\""));
    keyPart.setBody(path.toLatin1());

    QHttpPart authorizationPart;
    authorizationPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"Signature\""));
    authorizationPart.setBody(authorization.toLatin1());

    QHttpPart tokenPart;
    tokenPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"x-cos-security-token\""));
    tokenPart.setBody(token.toLatin1());

    QHttpPart filePart;
    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"x-cos-meta-fileid\""));
    filePart.setBody(cos_file_id.toLatin1());

    QHttpPart imagePart;
    imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png"));
    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data;name=\"file\""));
//    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data;name=\"file\";filename=\"3.png\"")); 部分服务器可能需要添加filename字段,小程序云服务器不需要此字段   
    imagePart.setBodyDevice(file);

    multiPart->append(keyPart);
    multiPart->append(authorizationPart);
    multiPart->append(tokenPart);
    multiPart->append(filePart);
    multiPart->append(imagePart);

    QUrl u(url);
    mulRequest.setUrl(u);
    QNetworkReply *r = manager->post(mulRequest, multiPart);
    connect(r,SIGNAL(finished()),this,SLOT(slotSendFileData()));
    multiPart->setParent(r); // delete the multiPart with the reply防止内存泄漏,在槽函数中释放

}

画像をアップロードした後、小さなクラウド開発プログラムコンソールを表示するには:

 

 

 

リリース8元の記事 ウォン称賛14 ビュー2283

おすすめ

転載: blog.csdn.net/zjgo007/article/details/105006140