質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3205閲覧

cocos2d-xを用いたファイルのアップロードについて

Koke1024

総合スコア31

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2016/02/08 19:01

cocos2d-xのHttpRequestを用いたファイルアップロード機能を制作しています。
multipartを利用し、以下のようなプログラムで、ファイルをアップロードしたいのですが、
※の行があると、$_POSTで送信した値が$_REQUESTに入ってしまいます。
また、$_FILEにファイルデータを送信することも成功せず、空になってしまいます。
正しい方法、解決法をご存じの方がいたら教えていただけたら幸いです。

C++

1{ 2 HttpRequest* request = new HttpRequest(); 3 string url = "http://***.ne.jp/"; 4 request->setUrl(url.c_str()); 5 request->setRequestType(HttpRequest::Type::POST); 6 7 string postString = "ownerId=1&action=upload"; 8 request->setRequestData(postString.c_str(), postString.length()); 9 10 vector<string> headers; 11 12 string data = getData(path); 13 14 headers.push_back("Content-Type: multipart/form-data; boundary=" + boundary)//←※ 15 headers.push_back("User-Agent: TestProgram"); 16 headers.push_back("--" + boundary); 17 headers.push_back("content-disposition: form-data; name=\"uploadFile\""); 18 headers.push_back(data); 19 headers.push_back("--" + boundary); 20 request->setHeaders(headers); 21 22 I(HttpClient)->send(request); 23 request->release(); 24}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決できました。
HTTPについての知識が断片的であり、リクエストの構造を把握していなかったことが原因でした。
以下のサイトでHTTPリクエストについて調べたところ、ヘッダ行とボディ部を混同していたことがわかりました。
http://www.yoheim.net/blog.php?q=20120611

そして、以下のサイトを参考に、それぞれのパラメータをバウンダリ文字列で区切った文字列をボディ部にsetRequestDataでセットしたところ、意図通りのデータを取得することが出来ました。
http://d.hatena.ne.jp/satox/20110726/1311665904

該当処理のコードは以下のようになりました。
※部分的なものなので正常に動作するかは保証出来ません。

C++

1void cGameManager::Upload(string path) { 2 HttpRequest* request = new HttpRequest(); 3 string url = "http://***.jp/"; 4 request->setUrl(url.c_str()); 5 request->setRequestType(HttpRequest::Type::POST); 6 7 string boundary = GetRandomBoundary(); 8//ヘッダ 9 vector<string> headers; 10 headers.push_back("Content-Type: multipart/form-data; boundary=" + boundary); 11 request->setHeaders(headers); 12 13//ボディー 14 map<string, string> postData = map<string, string>(); 15 postData["ownerId"] = "1"; 16 postData["action"] = "upload"; 17 string postString = GetPostString(postData, boundary); 18 postString += GetMultipartData(path, boundary); 19 request->setRequestData(postString.c_str(), postString.length()); 20 21 I(HttpClient)->send(request); 22 request->release(); 23} 24 25string GetPostString(map<string, string>& postMap, string boundary) { 26 if (postMap.size() == 0) { 27 return ""; 28 } 29 string postString = ""; 30 postString += "\r\n--" + boundary; 31 for (auto iter = postMap.begin(); iter != postMap.end(); ++iter) { 32 postString += "\r\nContent-Disposition: form-data; name=\"" + iter->first + "\""; 33 postString += "\r\n\r\n" + iter->second; 34 if ((++iter)-- != postMap.end()) { 35 postString += "\r\n--" + boundary; 36 } 37 } 38 postString += "\r\n--" + boundary; 39 return postString; 40} 41 42string GetMultipartData(string path, string boundary) { 43 auto fileData = I(FileUtils)->getDataFromFile(path); 44 string binary; 45 GetFileBinary(path, binary); 46 char length[1024]; 47 48 string body = ""; 49 body += "\r\n--" + boundary; 50 51 body += "\r\n" + string(length); 52 body += "\r\nContent-disposition: form-data; name=\"uploadFile\"; filename=\"file.zip\""; 53 body += "\r\nContent-Type: application/zip"; 54 body += "\r\n\r\n" + binary; 55 56 body += "\r\n--" + boundary; 57 58 return body; 59}

投稿2016/02/09 20:57

Koke1024

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

誤って投稿したため削除しました。

投稿2016/02/09 21:02

編集2016/02/09 21:06
Koke1024

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問