メイン 迷える子羊の部屋【初心者専用】 AS3で複数の変数を送信するには | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
shoot | Åê¹ÆNo.37313 投稿日時: 2008-1-23 18:19 |
半人前 居住地: つくば市 投稿: 30
使用環境:
MacOSX Snow Leopard Flash CS5 |
AS3で複数の変数を送信するには BitmapDataをJPG画像に変換して生成するプログラムを作成しており、時代もAS3に移行していくハズなので(というかAS3じゃないとBitmapからJPGに変換できないのもありますけど)、頑張ってAS3でコーディングしているのですが、CGIに任意のデータを送信するところでわからないことが出来ましたのでお力をお貸しください。
「test.cgi」にBitmapDataをJPGに変換したバイナリデータと任意の文字列を送信したいのですが、AS2の場合は var sd:LoadVars = new LoadVars(); var gt:LoadVars = new LoadVars(); gt.onLoad = function(success){ if(success){ trace("送信完了") } } sd.jpg=bin;//binにバイナリデータが入る。AS2では不可能ですけど・・・ sd.filename="hogehoge01.jpg"; sd.sendAndLoad("test.cgi",POST,gt); こんな感じで送信するときに複数のデータを送信できますよね。ところがAS3の場合、僕が見つけたサイトの方法では var urlRequest:URLRequest = new URLRequest("test.cgi"); var urlLoader:URLLoader = new URLLoader(); urlLoader.addEventListener (Event.COMPLETE,xAfterUpload); urlRequest.method = URLRequestMethod.POST; urlRequest.data = bin;//BitmapDataをJPG形式に変換したバイナリデータが入ります。 urlLoader.load (urlRequest); function xAfterUpload(event:Event){ trace("送信完了") } このように、 urlRequest.data = ***; データを一つだけしか送信できないんです。ひょっとして内容を<>とかで区切らなきゃいけないんでしょうか?(今書いてて気づきましたけど・・。) 一応今は上のAS3コーディングで動いていますが、この先作っていくと出力ファイル名の指定やID名など、バイナリデータと一緒に文字列も送信する必要が出てきます。 AS3に関する本はまだ買ってませんし、検索してもなかなかいいサイトがひっかからず、他にもっとスマートな方法がありそうで心配しています。(業者様に納品するものなので) ご教授よろしくお願いします。 |
ニノミヤ カズノリ | Åê¹ÆNo.37314 投稿日時: 2008-1-23 19:33 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: AS3で複数の変数を送信するには こちらは参考になりますでしょうか。
【バイナリデータをmultipartで送信する】 |
shoot | Åê¹ÆNo.37318 投稿日時: 2008-1-24 18:34 |
半人前 居住地: つくば市 投稿: 30
使用環境:
MacOSX Snow Leopard Flash CS5 |
Re: AS3で複数の変数を送信するには 返信ありがとうございます。
見てみたところ、Flex用のClassが紹介されていました。ですが僕の開発環境ではFlash CS3しかありませんので利用できません。 紹介されていたコードをFlash CS3ように編集してみましたがエラーが発生します。 ほかに何か方法はないでしょうか。 よろしくお願いします。 |
ニノミヤ カズノリ | Åê¹ÆNo.37320 投稿日時: 2008-1-24 18:43 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: AS3で複数の変数を送信するには 失礼ですが、FlexであってもFlash CS3にてAS3.0を使用していれば問題ありませんよ。
こちらの方で試したところ、問題なくできました。 MultiPartDataクラスはそのままコピーして、改行コード部分を直した後、MultiPartData.asで保存すれば良いです。 使い方に関しても参考サイトに載っているので、少し変えるだけでつかえるのですが… 一応エラーについて教えて頂けますか? それと参考にしたコードを載せるのは宜しくないと思います。 |
shoot | Åê¹ÆNo.37326 投稿日時: 2008-1-24 21:03 |
半人前 居住地: つくば市 投稿: 30
使用環境:
MacOSX Snow Leopard Flash CS5 |
Re: AS3で複数の変数を送信するには すみません、Class作成の件はうまくいきました。
以前、corelibというクラスファイルがFlash CS3で使えず、Flexでは使えるということがありまして、今回のClassも同じようなものかと勘違いしてしまいました。 そのままコピーペーストすればエラー表示なしで実行できました。 実行できたのはいいのですが、いざ送信してみるとCGIがなんの反応もしません。通信はできているけど値が送信できてない状態です。MultiPardDataクラスのaddBynary関数の第3引数の値もよくわかりませんし・・。 AS var multipart = new MultiPartData(); var urlRequest:URLRequest = new URLRequest("test.cgi"); var urlLoader:URLLoader = new URLLoader(); multipart.addString ('filename','flash.jpg'); multipart.addBynary ('bin',binary,'flash.jpg','application/octet-stream'); urlLoader.addEventListener (Event.COMPLETE,xAfterUpload); urlRequest.contentType = "multipart/form-data, boundary=" + multipart.boundary; urlRequest.method = URLRequestMethod.POST; urlRequest.data = multipart.data; urlLoader.load (urlRequest); CGI #!/usr/bin/perl if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach (@pairs) { ($name,$value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $in{$name} = $value; } open(I, ">$in{'filename'}"); binmode(I); print I $in{'bin'}; close(I); print "Content-type: text/html\n\n"; exit; よろしくお願いします。 |
ニノミヤ カズノリ | Åê¹ÆNo.37327 投稿日時: 2008-1-24 22:53 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: AS3で複数の変数を送信するには MultiPartDataクラスがやろうとしている事は、ファイルアップロードと同じだと考えて下さい。
addBynary関数の第3引数の値は、本来元となるファイル名となります。 ただし今回は元となるファイルが無い為、適当な名前でも良いかと思います。 CGIの方でも代入されたファイル名は参照出来ますので、出力ファイル名の指定等に使えるかもしれません。 それとCGIに関してですが、 申し訳ありませんが、私はperlが分かりません。 恐らくファイルを作成してバイナリデータを入れて保存と言う形なのでしょうが、 ファイルアップロードになりますので、CGIもそれに合わせなければなりません。 ちなみに送信出来ていないと言うのは何から判断されているのでしょうか。 教えていただければ、また何か書けるかもしれません。 |
ニノミヤ カズノリ | Åê¹ÆNo.37328 投稿日時: 2008-1-25 1:52 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: AS3で複数の変数を送信するには どなたも書かれないのでURLVariablesクラスについて書いておきます。
複数の値を送信したい時は、このURLVariablesを使います。 下の様な形でURLRequestのdataに代入し、リクエストします。
ただしこのURLVariablesにバイナリデータを入れて送信しても、 サーバー側で取得出来ないと言う話を聞きます。 実際私もphp、aspで試してみましたが取得出来ませんでした。 もしかしたらperlでは使えるかもしれません。 一度試してみてはいかがでしょうか。 出来たらCGIを変える必要もないでしょうし。 |
k-suzuki | Åê¹ÆNo.37332 投稿日時: 2008-1-25 13:00 |
新米 居住地: 東京 投稿: 7
使用環境:
windowsXP,CS3 |
Re: AS3で複数の変数を送信するには 全く見当違いでしたらすみません、
自分も、as3でCGIではなく、PHP経由ですが jpg保存をテストでやってみた事があるのですが、 Base64エンコードを入れないと、 php側で値を受け取れませんでした。 (サーバ環境にもよるのかもしれませんが・・) ご参考になればと思い、 その部分のコードを書かせていただきますね。 何かご参考になればいいのですが・・。 //flash側 var myBitmapData:BitmapData = new BitmapData(150, 210 ,false , 0xFFFFFF); myBitmapData.draw(parts);//partsにはjpg化したいbmpデータが入る //jpg byte生成// var jpgEncoder:JPGEncoder = new JPGEncoder(100); var byteArr:ByteArray = jpgEncoder.encode(myBitmapData); //64エンコード var enc:Base64Encoder = new Base64Encoder(); enc.encodeBytes(byteArr); var encStr:String = enc.flush(); //送信セット var variables:URLVariables = new URLVariables(); System.useCodePage = true; variables.imgdata = encStr; var request:URLRequest = new URLRequest('php/receive.php');//受け側phpに関しては下記参照 request.method = URLRequestMethod.POST; request.data = variables; //送るデータをセット //プラウザ自身に送る(保存ダイアログを出したいため) navigateToURL(request , "_self"); ※JPGEncoder と Base64Encoder は米adobeのサイトにあった物を使用 //php側 receive.php <? $imgdata=base64_decode($_POST['imgdata']); $imgsize=strlen($imgdata); $maxfilesize=1024*500; $conttype = "image/jpeg"; $charset = "SJIS"; $filename="out.jpg"; header("Content-type: $conttype; charset=$charset"); header("Content-Disposition: attachment; filename=\"$filename\""); header("Pragma: 'no-cache'"); if($maxfilesize<$imgsize){ exit; }//---size over echo($imgdata); exit; ?> どうぞよろしくお願いいたします。 |
ニノミヤ カズノリ | Åê¹ÆNo.37334 投稿日時: 2008-1-25 13:57 |
職人 居住地: 東京 投稿: 430
使用環境:
CS4 .4.11, .5.7 XP Pro(sp3) Flash Player 10,0,22,87, AIR 1.5.1, IE 5.5 & 6 & 7 & 8, Firefox 2.0.0.20 & 3.0.11 & 3.5, Opera 9.64, Safari 4, Google Chrome 2.0.172.31, Netscape 7.1 |
Re: AS3で複数の変数を送信するには なるほど。
良い情報だと思います。 つまりURLVariablesでバイナリデータを送る際、 そのままでは送信できないのでBase64エンコードで文字列にしてあげる訳ですね。 そしてサーバーサイドスクリプトでデコードしてあげればバイナリデータが取得出来ると。 contentTypeを気にしなければ、 現状のCGIからしてむしろこちらの方が楽そうですね。 |
shoot | Åê¹ÆNo.37346 投稿日時: 2008-1-25 20:17 |
半人前 居住地: つくば市 投稿: 30
使用環境:
MacOSX Snow Leopard Flash CS5 |
Re: AS3で複数の変数を送信するには 返信ありがとうございます。
ニノミヤ様、k-suzuki様の助言のもと、トライしてみました。 試したところ、どうもCGIに問題があるようで、修正次第でうまくいきそうです。 まだ確実に出来たわけではありませんが、頑張ってみたいと思います。 ありがとうございました。また機会があればよろしくお願いします。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |