簡単な紹介
アップロードするファイルがある場合、タグのセットに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防止内存泄漏,在槽函数中释放
}
画像をアップロードした後、小さなクラウド開発プログラムコンソールを表示するには: