Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.02.2010, 15:08
ExtendedPlay вне форума Посмотреть профиль Отправить личное сообщение для ExtendedPlay Найти все сообщения от ExtendedPlay
  № 1  
Ответить с цитированием
ExtendedPlay
 
Аватар для ExtendedPlay

Регистрация: Nov 2007
Сообщений: 51
Cool Передача 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 ? подскажите плиз где ошибка)

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

Старый 04.02.2010, 15:33
ratin вне форума Посмотреть профиль Отправить личное сообщение для ratin Найти все сообщения от ratin
  № 2  
Ответить с цитированием
ratin
 
Аватар для ratin

Регистрация: Sep 2009
Сообщений: 127
Возможно, вы забыли указать Content-type
Код AS3:
var req:URLRequest = new URLRequest();
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "multipart/form-data;");
req.requestHeaders.push(header);
Как-то так..

Старый 04.02.2010, 15:41
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 3  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

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

ну, вот хороший пример.
__________________
мой пустой блог

Старый 04.02.2010, 16:18
ExtendedPlay вне форума Посмотреть профиль Отправить личное сообщение для ExtendedPlay Найти все сообщения от ExtendedPlay
  № 4  
Ответить с цитированием
ExtendedPlay
 
Аватар для ExtendedPlay

Регистрация: Nov 2007
Сообщений: 51
Спасибо за предложения)
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() почему-то не проходит)

Старый 04.02.2010, 17:04
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 5  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
представь себе, что ты через 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 - бинарник - не самый худший способ.
__________________
мой пустой блог

Старый 04.02.2010, 19:40
ExtendedPlay вне форума Посмотреть профиль Отправить личное сообщение для ExtendedPlay Найти все сообщения от ExtendedPlay
  № 6  
Ответить с цитированием
ExtendedPlay
 
Аватар для ExtendedPlay

Регистрация: Nov 2007
Сообщений: 51
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 ))))))))))))))

Старый 04.02.2010, 21:11
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 7  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 613
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
http://designreviver.com/tutorials/a...ges-from-flash

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

Старый 04.02.2010, 21:23
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 8  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
2Rzer:
потрясающе! Ничего, что парень уже решил свои проблемы, а ссылка, что ты привел, приведена мною в посте №3?
__________________
мой пустой блог

Старый 04.02.2010, 21:26
ExtendedPlay вне форума Посмотреть профиль Отправить личное сообщение для ExtendedPlay Найти все сообщения от ExtendedPlay
  № 9  
Ответить с цитированием
ExtendedPlay
 
Аватар для ExtendedPlay

Регистрация: Nov 2007
Сообщений: 51
ГГГггг))))))))
Rzer, спасибо за участие)))))))
iflamberg, ниругайся)

Старый 05.02.2010, 01:39
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 10  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 613
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
С кем не бывает..

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:46.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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