トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     AS3で複数の変数を送信するには
投稿するにはまず登録を

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
shoot
Åê¹ÆNo.37346
投稿日時: 2008-1-25 20:17
半人前
居住地: つくば市
投稿: 30
使用環境:
MacOSX Snow Leopard
Flash CS5
Re: AS3で複数の変数を送信するには
返信ありがとうございます。

ニノミヤ様、k-suzuki様の助言のもと、トライしてみました。
試したところ、どうもCGIに問題があるようで、修正次第でうまくいきそうです。
まだ確実に出来たわけではありませんが、頑張ってみたいと思います。

ありがとうございました。また機会があればよろしくお願いします。
ニノミヤ カズノリ
Åê¹Æ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からしてむしろこちらの方が楽そうですね。
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.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に代入し、リクエストします。
var request:URLRequest = new URLRequest("アドレス");
var variables:URLVariables = new URLVariables();
variables.hogeId = 1;
variables.hogeName = "hoge";
request.data = variables;

ただしこのURLVariablesにバイナリデータを入れて送信しても、
サーバー側で取得出来ないと言う話を聞きます。
実際私もphp、aspで試してみましたが取得出来ませんでした。

もしかしたらperlでは使えるかもしれません。
一度試してみてはいかがでしょうか。
出来たらCGIを変える必要もないでしょうし。
ニノミヤ カズノリ
Åê¹Æ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もそれに合わせなければなりません。

ちなみに送信出来ていないと言うのは何から判断されているのでしょうか。
教えていただければ、また何か書けるかもしれません。
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.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.37318
投稿日時: 2008-1-24 18:34
半人前
居住地: つくば市
投稿: 30
使用環境:
MacOSX Snow Leopard
Flash CS5
Re: AS3で複数の変数を送信するには
返信ありがとうございます。

見てみたところ、Flex用のClassが紹介されていました。ですが僕の開発環境ではFlash CS3しかありませんので利用できません。
紹介されていたコードをFlash CS3ように編集してみましたがエラーが発生します。

ほかに何か方法はないでしょうか。

よろしくお願いします。
ニノミヤ カズノリ
Åê¹Æ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.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に関する本はまだ買ってませんし、検索してもなかなかいいサイトがひっかからず、他にもっとスマートな方法がありそうで心配しています。(業者様に納品するものなので)

ご教授よろしくお願いします。
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops