Форум 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 тут уже не помощник.

cleptoman 15.02.2010 23:05

ну, если не ошибаюсь, то под 10-ку эта проблема не актуальна

udaaff 15.02.2010 23:15

Ошибаетесь.

cleptoman 16.02.2010 12:18

хм..действительно..data рид онли(

Bgg 16.02.2010 15:09

Цитата:

Сообщение от CrazyFlasher (Сообщение 886732)
Код AS3:

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


Спасибо.

Косяк в отправке, где ума не приложу, хелп.

Код AS3:

 
var myBitmap:BitmapData = new BitmapData(150, 150, true, 0x80FF3300);
ba = new JPGEncoder().encode(myBitmap);
 
//кликаем мышью
 
var vars:URLVariables = new URLVariables();
vars.photo = ba;
 
var req:URLRequest = new URLRequest();
req.url= DataKeeper.uploadUrl;
req.method = URLRequestMethod.POST;
req.contentType = "multipart/form-data";
req.data = vars;
 
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
 
loader.addEventListener(Event.COMPLETE, completeUpload);
loader.load(req);

В результате всё тотже Invalid photo и "photo": ""

udaaff 16.02.2010 17:08

Content Type должен соответствовать типу содержимого (data). У вас же содержимое — это экземпляр URLVariables (application/x-www-form-urlencoded).
Поэтому сначала приведите содержимое к необходимому виду (multipart/form-data) в соответствии с rfc1867 :)
Пример есть в хелпе по классу FileReference.

upd:
Код:

POST /handler.cfm HTTP/1.1
  Accept: text/*
  Content-Type: multipart/form-data;
  boundary=----------Ij5ae0ae0KM7GI3KM7
  User-Agent: Shockwave Flash
  Host: www.example.com
  Content-Length: 421
  Connection: Keep-Alive
  Cache-Control: no-cache
 
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="Filename"
 
  MyFile.jpg
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="Filedata"; filename="MyFile.jpg"
  Content-Type: application/octet-stream
 
  FileDataHere
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="Upload"
 
  Submit Query
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

Т.е. вам необходимо добавить в определение contentType информацию о границе, допустим "multipart/form-data; boundary=----------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7". Или любое другое сочетание символов, которое с маленькой вероятностью может встретиться в другом месте запроса.
Ну а затем в ByteArray все остальное запихать. Можно ограничиться этим:
Код:

------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="Photo""
  Content-Type: application/octet-stream
 
  FileDataHere
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

ByteArray#writeUTFBytes() и ByteArray#writeBytes() в помощь.

Bgg 18.02.2010 14:10

udaaff, спасибо, разобрался наконец таки.

udaaff 18.02.2010 14:42

Выложил несколько минималистических ) классов для загрузки фото в альбом пользователя http://vkontakte.typing.by/ . В пакете net.: PhotoLoader и MultipartData. До загрузки аватара еще не добрался, но можно по аналогии сделать. Возможно, вам пригодятся.

-МастеР- 26.03.2010 18:49

Попробовал все примеры с постом фотографий, включая эти, в тоге вместо:

В ответ приложение получает следующие данные в формате JSON:
Код AS1/AS2:

{"server": '1', "photos": '1', "hash": '12345abcde'}

Стабильно получаю строку вида:
Код AS1/AS2:

"mid": "3044055", "gid": "0", "server": "10370", "photo": "", "hash": "d4ba6afa03049e1af3752fb205d76407"

В чем может быть проблемма? подобный отклик на загрузку картинки получается в результате всех примеров, что я нашел на данном форуме.

udaaff 26.03.2010 18:58

http://vkontakte.ru/pages.php?o=-1&p...F2%E0%EA%F2%E5

-МастеР- 26.03.2010 19:34

Там к сожалению нет объяснения почему сервер выдает не то, что описано на данной странице.

mikhailk 27.03.2010 10:14

-МастеР-,
у Вас там в ответе сервера "photo": ""
т.е., переданное изображение не было корректным и не сохранилось на сервере.

Вот код, который штатно работает у меня:

Код AS3:

// Подготавливаем изображение bmpdata к передаче
var byteArray : ByteArray = new JPGEncoder().encode(bmpdata);                       
 
// Отправляем на сервер saverURL (получен через getPhotoUploadServer)
var fileContentType:String = 'image/jpeg';
var mpLoader:MultipartURLLoader = new MultipartURLLoader();
mpLoader.addEventListener(Event.COMPLETE, imageForWallUploaded);       
mpLoader.addFile(byteArray, "photo.jpg", "photo", fileContentType);
mpLoader.load(saverURL);

Классы JPGEncoder и MultipartURLLoader - из этой темы.

sersche 29.05.2010 14:22

Цитата:

MultipartURLLoader - из этой темы.
в упор не вижу.. где скачать? нашел какой то в инете, а он работать не хочет..


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

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