Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   URLRequest, отправка POST (http://www.flasher.ru/forum/showthread.php?t=161377)

syegorius 23.07.2011 18:58

URLRequest, отправка POST
 
доброе время суток. первое в акшнскрипте разбераюсь плохо!
есть вот такая вот функция:

Код AS3:

private function saveHandler(e:MouseEvent):void {
                        var canvasBmp:BitmapData = canvas.drawing();
                        var pngEncoder:PNGEncoder = new PNGEncoder();
                        var pngStream:ByteArray = PNGEncoder.encode(canvasBmp);
                        canvasBmp.dispose();
                        var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
                        var pngURLRequest:URLRequest = new URLRequest("http://prznd_d.server/");
                        pngURLRequest.requestHeaders.push(header);
                        pngURLRequest.method = URLRequestMethod.POST;
                        pngURLRequest.data = pngStream;
                        navigateToURL(pngURLRequest);
                }

вызывается по нажатию кнопки. при этом после успешного выполнения открывается новое окно браузера, в котором выводится результат с сервера.

Подскажите как сделать так, что б новое окно не открывалось и при этом с текущей страницы не редиректило на новую, а просто сервер возвращал какое-то значение, которое дальше будет обрабатываться во флешке.

примерно работало по такому принципу:

Код AS3:

var vars:LoadVars = new LoadVars();
vars.onData = function(src:String):Void{
}
vars.sendAndLoad(server, vars, "POST");

Заранее спасибо за ответы.

andrew911 23.07.2011 19:48

URLLoader

2Sun 24.07.2011 01:02

Вызов пхп скрипта и передача параметров в него:

Код AS3:

public function go():void
                {
                        var request:URLRequest = new URLRequest("http://путь на ВАШ файл.php");
                        request.method = URLRequestMethod.POST;
 
                        var variables:URLVariables = new URLVariables();
 
                        variables.one = 5;
                        variables.two = 10;
 
                        request.data = variables;
 
                        var loader:URLLoader = new URLLoader(request);
                        loader.addEventListener(Event.COMPLETE, phpComplete);
                        // ------ Это формат данных которые возвращаются с сервера, для разных типов надо будет менять. В нашем случае будут просто переменные
                        loader.dataFormat = URLLoaderDataFormat.VARIABLES;
                        // ----------------
                        loader.load(request);
                }

Теперь получаем данные из ПХП
Код AS3:

public function phpComplete (event:Event):void
{
                        var variables:URLVariables = new URLVariables( event.target.data );
                        trace (variables.res);
//Вернет 15
}

В пхп все выглядит примерно так:

Код:

<?
$one=$_POST['one'];
$two=$_POST['two'];
// или делайте с ними что хотите здесь.
$res= $one+$two;
echo '&res='.$res;
?>


syegorius 24.07.2011 16:47

пасиба! получилось) правда по началу появлялась ошибка:

Error: Error #2101: Строка, переданная в URLVariables.decode(), должна быть строкой запроса закодированного URL-адреса и содержать пары имя/значение.
at Error$/throwError()
at flash.net::URLVariables/decode()
at flash.net::URLVariables()
at flash.net::URLLoader/onComplete()

я вспомнил что где-то видел что с сервера взвращали перемынные так: res=done, и потом у меня все заработало!

Добавлено через 3 часа 51 минуту
сейчас возник еще один вопрос:

Код AS3:

var pngStream:ByteArray = PNGEncoder.encode(canvasBmp);
                        var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
                        var pngURLRequest:URLRequest = new URLRequest("http://prznd_d.server/");
                        pngURLRequest.requestHeaders.push(header);
                        pngURLRequest.method = URLRequestMethod.POST;
                        pngURLRequest.data = pngStream;
                        var loader:URLLoader = new URLLoader(pngURLRequest);
                        loader.addEventListener(Event.COMPLETE, phpComplete);
                        loader.load(pngURLRequest);

когда функция выглядет вот так все нрмально работает...
но мне помимо этого нужно отправить на сервер несколько переменных, например user_id и message_id.
когда я пределываю функцию вот так:

Код AS3:

var pngStream:ByteArray = PNGEncoder.encode(canvasBmp);
                      var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
                        var pngURLRequest:URLRequest = new URLRequest("http://prznd_d.server/");
                        pngURLRequest.requestHeaders.push(header);
                        pngURLRequest.method = URLRequestMethod.POST;
                              var variables:URLVariables = new URLVariables();
                              variables.image = pngStream;
                              variables.user_id = 1;
                              variables.message_id = 1;
                        pngURLRequest.data = variables;//pngStream;
                        var loader:URLLoader = new URLLoader(pngURLRequest);
                        loader.addEventListener(Event.COMPLETE, phpComplete);
                        loader.load(pngURLRequest);

то на сервере $_POST['image'] содержит только "png ", подскажите в чем дело?

2Sun 24.07.2011 20:43

syegorius, да, нужно вывод с пхп делать пара-значение, в голове моей опилки.
Код:

echo '&res='.$res;

syegorius 25.07.2011 01:18

сейчас возник еще один вопрос:

Код AS3:

var pngStream:ByteArray = PNGEncoder.encode(canvasBmp);
                        var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
                        var pngURLRequest:URLRequest = new URLRequest("http://prznd_d.server/");
                        pngURLRequest.requestHeaders.push(header);
                        pngURLRequest.method = URLRequestMethod.POST;
                        pngURLRequest.data = pngStream;
                        var loader:URLLoader = new URLLoader(pngURLRequest);
                        loader.addEventListener(Event.COMPLETE, phpComplete);
                        loader.load(pngURLRequest);

когда функция выглядет вот так все нрмально работает...
но мне помимо этого нужно отправить на сервер несколько переменных, например user_id и message_id.
когда я пределываю функцию вот так:

Код AS3:

var pngStream:ByteArray = PNGEncoder.encode(canvasBmp);
                      var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
                        var pngURLRequest:URLRequest = new URLRequest("http://prznd_d.server/");
                        pngURLRequest.requestHeaders.push(header);
                        pngURLRequest.method = URLRequestMethod.POST;
                              var variables:URLVariables = new URLVariables();
                              variables.image = pngStream;
                              variables.user_id = 1;
                              variables.message_id = 1;
                        pngURLRequest.data = variables;//pngStream;
                        var loader:URLLoader = new URLLoader(pngURLRequest);
                        loader.addEventListener(Event.COMPLETE, phpComplete);
                        loader.load(pngURLRequest);

то на сервере $_POST['image'] содержит только "png ", подскажите в чем дело?

2Sun 25.07.2011 02:03

Все просто - ByteArray так не передается.

Закодируйте его в JSON а потом передавайте.

syegorius 25.07.2011 02:33

вообще я только что нашел решение проблемы оно ниже если кому пригодится и реально настолько просто, что я даже упустил это из головы),
но тем не менее хотелось бы узнать вот что - при кодировании байт-массива в JSON насколько вырастет его размер? если например то, что у меня сейчас есть, создает картинку в среднем размером около 100кб, т.е. как я понимаю на сервер отправляется около 100кб какой-то информации..

а это тот способ, которым можно отправить остальные переменные:

The thing is, there is no actual documentation when you want to send both a byteArray and variables. As you can see in the examples, when you send variables, you set the data property of the URLRequest equal the your URLVariables, but when you send a byteArray you also set the data property equal to your byteArray. So you cannot send both type of data at the same time this way. The way I found is actually pretty simple and I don’t why others have not blogged about this (trust me I have looked for this). What you do is you set the data of the URLRequest equal to the byteArray, but you put your variables in the url String of the URLRequest. Here is some code showing it:

Код AS3:

package {
  import flash.display.Sprite;
  import flash.net.URLLoader;
  import flash.net.URLRequest;
  import flash.net.URLRequestMethod;
  import flash.display.BitmapData;
  import flash.utils.ByteArray;
  import com.adobe.images.JPGEncoder;
 
  public class  ByteArrayAndVariableSendExample extends Sprite {
    public function  ByteArrayAndVariableSendExample() {
      var url:String = "http://www.[yourDomain].com/receiveFile.php?exampleSessionId=" + new Date().getTime() + "&amp;exampleUserLabel=guest" ;
 
      var someBitmapData:BitmapData = new BitmapData();//let say we have some bitmapdata
 
      //using the jpeg encoder from the core library
      var jpgEncoder:JPGEncoder = new JPGEncoder(80);
      var myByteArray:ByteArray = jpgEncoder.encode(someBitmapData);
 
      var request:URLRequest = new URLRequest(url);
      request.method = URLRequestMethod.POST;
 
      request.data = myByteArray;
      var loader:URLLoader = new URLLoader();
 
      loader.load(request)
    }
  }
}


2Sun 25.07.2011 12:47

Этот пример от Вашего ничем не отличается, кроме кодирования в jpg вместо png - но Вы ведь писали, что Вам нужно еще какие то параметры передать. А здесь этого нет.

syegorius 26.07.2011 02:07

ну да, только теперь я эти параметры отправляю через get, в самом адресе, а саму картинку как и было через пост и на сервере беру ее из $GLOBALS['http_raw_post_data'];


Часовой пояс GMT +4, время: 02:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.