Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача ByteArray (картинка) на сервер (http://www.flasher.ru/forum/showthread.php?t=135894)

ExtendedPlay 04.02.2010 15:08

Передача ByteArray (картинка) на сервер
 
Привет всем!

Возникла следующая задача - сохранить картинку JPEG в виде ByteArray на сервере (плюс передать ещё пару переменных).

Вот у меня счас так:
Код AS3:

//Провожу операции с изображением и затем конвертирую в джипег
var jpgEncoder:JPEGEncoder = new JPEGEncoder(90);
var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
 
//Задаю переменные для отправки
var vars:URLVariables = new URLVariables();
vars.action = 'flashLoad';
vars.image = jpgStream;
 
//Создаю URLRequest
var req:URLRequest = new URLRequest();
req.url = "/files/uploader.php";
req.data = vars;
req.method = URLRequestMethod.POST;
 
//Отправляю
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(req);

так вот, переменная 'action' передаётся нормально. а вот 'image' (он же jpgStream) передаётся очень странно... если в пхп попытаться просто вывести его как $_POST['image'], то выводятся постоянно 4 одинаковых символа - ÿØÿà
может я не то отправляю? может я отправляю ссылку на ByteArray ? подскажите плиз где ошибка)

Заранее спасибо откликнувшимся!

ratin 04.02.2010 15:33

Возможно, вы забыли указать Content-type
Код AS3:

var req:URLRequest = new URLRequest();
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "multipart/form-data;");
req.requestHeaders.push(header);

Как-то так..

iflamberg 04.02.2010 15:41

1) не передовать текстовые данные (т.е. переменные) и бинарные в одном пакете, они херят друг-друга. Т.е.
req.data = myByteArrayInstance;
а не req.data = myObjectInstance;
не совсем правда, можно в ByteArray запихнуть и переменные и картинку, но распаковать это придется ручками(тогда смотреть в сторону amf).
2) читать бинарные данные не из $_POST, а из $GLOBALS["HTTP_RAW_POST_DATA"];

ну, вот хороший пример.

ExtendedPlay 04.02.2010 16:18

Спасибо за предложения)
ratin, хедеры не помогли)
iflamberg, ну повидиму они действительно "херят" друг друга) а жаль)

Вобщем на данный момент работает так:
Код AS3:

        var req:URLRequest = new URLRequest();
        req.url = "/files/uploader.php?name=myPicture";
        req.method = URLRequestMethod.POST;
        req.contentType = 'application/octet-stream';
        req.data = jpgStream;
 
        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE,uploadComplete);
        loader.load(req);

в пхп:
PHP код:

$fileData $GLOBALS['HTTP_RAW_POST_DATA'];
$fileName $_GET['name'].'.jpg';
$fp fopen($fileName"w");
fwrite($fp,$fileData);
fclose($fp);
echo 
"file write - OK $fileName"

Возник ещё вопрос: Можно ли переменную name передаватьне не через GET (POST хотелось бы).
С использованием URLVariables() почему-то не проходит)

iflamberg 04.02.2010 17:04

представь себе, что ты через script.php?var1=val&var2=val пытаешься передать бинарные данные(где, в том числе встречаются %,&,? и любые другие символы). Примерно то же самое происходит, когда ты пытаешься передать и картинку и переменные через POST.

Если ты хочешь передать картинку через POST, как переменную, то тебе её нужно закодировать так, как кодируют бинарные данные при передаче по эл. почте, т.е. base64 алгоритмом. Готовые решения base64 легко нагуглить.

Другой способ - это сериализовать данные в flash в ByteArray и распаковать их в пхп.
Сериализовать:
Код AS3:

...
var obj:Object = {};
obj.reportData = this.reportData;
obj.periodData = this.periodData;
obj.graph = byteArrayOfPic;
 
var ba:ByteArray = new ByteArray();
ba.writeObject(obj);
 
req.data = ba;
...

но, чтобы распаковать это, нужен zend_amf, sabreamf или другой пакет для работы с amf-протоколом в пхп.
C zend например так:
PHP код:

$amf file_get_contents('php://input');
if (!
$amf) return;
$amf substr($amf1);
// Create a Parser
$stream = new Zend_Amf_Parse_InputStream($amf);
// Deseriaize string into AMF3
$d = new Zend_Amf_Parse_Amf3_Deserializer($stream);
// Read as native PHP object
$data $d->readObject();
$reportData $data->reportData;
$periodData $data->periodData;
$type $data->reportType

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

Короче говоря, выбраный тобой способ - по GET передавать переменные, по POST - бинарник - не самый худший способ.

ExtendedPlay 04.02.2010 19:40

iflamberg, да, ты прав) я уже понял что способ неверный) поэтому решил перегонять всё POST`ом, предварительно закодировав ByteArray в base64.

Вот такой получился код:
Код AS3:

 
        var jpgEncoder:JPEGEncoder = new JPEGEncoder(90);
        var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
 
        var jpgEncoded:String = encodeByteArray(jpgStream);
 
        var vars:URLVariables = new URLVariables();
        vars.action='testVar';
        vars.image=jpgEncoded;
 
        var req:URLRequest = new URLRequest();
        req.url='/files/uploader.php';
        req.method=URLRequestMethod.POST;
        req.data=vars;
 
        var loader:URLLoader = new URLLoader();
        loader.dataFormat = URLLoaderDataFormat.BINARY;
        loader.addEventListener(Event.COMPLETE,uploadComplete);
        loader.load(req);

в пхп просто вытаскиваю из поста эти переменные (action и image) и декодерую image с помощью стандартного base64_decode ))))))))))))))

Rzer 04.02.2010 21:11

http://designreviver.com/tutorials/a...ges-from-flash

Только там пхп не сохраняет, а выдаёт пользователю рисунок назад. Думаю не проблема его поправить.

iflamberg 04.02.2010 21:23

2Rzer:
потрясающе! Ничего, что парень уже решил свои проблемы, а ссылка, что ты привел, приведена мною в посте №3?

ExtendedPlay 04.02.2010 21:26

ГГГггг))))))))
Rzer, спасибо за участие)))))))
iflamberg, ниругайся)

Rzer 05.02.2010 01:39

С кем не бывает..


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

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