Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Передача bitmapData на сервер POST в виде .jpeg (http://www.flasher.ru/forum/showthread.php?t=136249)

ZergMaster 12.02.2010 18:26

Передача bitmapData на сервер POST в виде .jpeg
 
добрый день.

у меня такая задача. Есть приложение вконтакте. В приложении есть кнопка butScreen, при нажатии на которую производится снимок экрана при помощи BitmapData.
Код AS3:

var bitmapData:BitmapData = new BitmapData(foner.width, foner.height, false);
bitmapData.draw(foner);
var bm:Bitmap = new Bitmap(bitmapData);

далее мне нужно POST запросом отправить на сервер эту битмапу.
Пишу
Код AS3:

var sendAdress:* = new URLRequest(urla+"&photo="+bm);
sendAdress.method = URLRequestMethod.POST;                                                                                                        var loader:URLLoader = new URLLoader();                        loader.addEventListener(Event.COMPLETE, completeHandler);                        loader.load(sendAdress);

и в итоге запрос выглядит так:
PHP код:

http://cs244.vkontakte.ru/upload.php?act=do_add_posted&mid=****&hash=******b96b415aa5&rhash=********bf027681ab2c43251e&swfupload=1&photo=[object%20Bitmap] 

, что, конечно же, не есть хорошо и в ответ мне приходит совсем не то, что нужно.

Вопрос. как мне вытащить из этой битмапдаты файл .jpeg или .bmp, чтобы была возможность послать его на сервер?
Облазил уже все, что можно... Ответьте, пожалуйста, если кто имеет представление об этом? Желательно более-менее подробно. Ну или вообще хоть как-нибудь!

udaaff 12.02.2010 18:44

Для начала http://code.google.com/p/as3corelib/.../JPGEncoder.as

ZergMaster 12.02.2010 19:12

ага... класс JPGEncoder.as.. звучит многообещающе...

вот нашел такой пример

Код AS3:

function saver():void {
        var createName = 'mypict.jpg'; //--имя картинки при сохранении
        var outputpath='images/'; //--папка, в которую будут сохранятся картинки
        var bmd:BitmapData=new BitmapData(foner.width, foner.height, false); //--создаем bitmapdata
        bmd.draw(foner); //--рисуем в битмапе интересующий мувиклип
        var byteArray : ByteArray = new JPGEncoder(85).encode(bmd); //--в массив кодированное  изображение? 85 - качество.
        var urlRequest : URLRequest = new URLRequest();
        urlRequest.url = 'saver.php?path='+outputpath; //--php скрипт, который будет сохранять
        urlRequest.contentType = 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary();
        urlRequest.method = URLRequestMethod.POST;
        urlRequest.data = UploadPostHelper.getPostData(createName, byteArray);
        urlRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );
        var urlLoader : URLLoader = new URLLoader();
        urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
        urlLoader.addEventListener( Event.COMPLETE, onImageCreated); //--функция обработчик  события создания фотки
        urlLoader.addEventListener( ProgressEvent.PROGRESS, onImgCreateProgress); //--функция обработчик процесса загрузки фотки
        urlLoader.load(urlRequest);
        }

попробовал применить, но UploadPostHelper ругается
1120: Access of undefined property UploadPostHelper. ...

cleptoman 12.02.2010 19:23

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

у вконтакта есть готовый пример на загрузку фотки

ZergMaster 12.02.2010 20:29

ну да, я пробовал так:

Код AS3:

var sendAdress:* = new URLRequest(urla+"&photo="+bm.byteArray);


Bgg 15.02.2010 19:33

ZergMaster, вы загрузили фотку?
Я помоему както криво получают байтовый массив:
Код AS3:

var bitmap:BitmapData = new BitmapData(80, 30, false, 0xFFCC00);
var rect:Rectangle = new Rectangle(10, 10, 40, 10);
bitmap.fillRect(rect, 0xFF0000);
 
var urlRequest:URLRequest = new URLRequest();
urlRequest.url = DataKeeper.uploadUrl + "&photo=" +bit2arr(bitmap, "ddd.jpg");
urlRequest.method = URLRequestMethod.POST;
 
var loader:URLLoader = new URLLoader();
 
loader.addEventListener(Event.COMPLETE, completeUpload);
loader.load(urlRequest);
 
private function bit2arr( bitmap:BitmapData, filename:String):ByteArray
{
        var pix:ByteArray = bitmap.getPixels(bitmap.rect);
        pix.writeShort(bitmap.width);
        pix.writeShort(bitmap.height);
        pix.writeShort(bitmap.transparent ? 1 : 0);
        pix.writeUTFBytes(filename.toLowerCase());
        pix.writeBytes(pix, 0, pix.bytesAvailable);
        pix.compress();
        return pix;
}

Выхлоп: ..."photo": "", "hash": "b484e2414a97ddc547b03809e38c9f53"}Error: Invalid photo :umnik2:

CrazyFlasher 15.02.2010 19:38

Код AS3:

var ba:ByteArray = new JPGEncoder().encode(myBitmapData);


udaaff 15.02.2010 21:09

Цитата:

Сообщение от cleptoman (Сообщение 885983)
это не он ругается, а на него..потому как его нет...
для вашего запроса просто в него притулите ваш byteArray картинки и отправьте. если не ошибаюсь - параметр photo

Что-то все мои старания по поводу загрузки одиночного фото без извращений оказались тщетными. Единственный способ, которым получилось: через ByteArray формировать multipart/form-data. По аналогии с примером из хелпа: http://www.adobe.com/livedocs/flash/...Reference.html
Тогда все нормально аплоадится. Видимо, туплю в чем-то, или чего-то не понимаю, или, действительно — это единственный приемлимый способ.

Цитата:

Сообщение от cleptoman (Сообщение 885983)
у вконтакта есть готовый пример на загрузку фотки

Все примеры, которые видел, или с multipart, или с FileReference.

cleptoman 15.02.2010 21:49

ну а чем FileReference не угодил то? )

udaaff 15.02.2010 22:26

Если с локального диска грузить, то да. А если нужно модифицировать предварительно, или с нуля создать изображение, то FileReference тут уже не помощник.


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

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