Как загрузить фото в альбом на сервер вкотакте.

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
Аватара пользователя
BANAN
Сообщения: 96
Зарегистрирован: 10 мар 2010, 22:24

Как загрузить фото в альбом на сервер вкотакте.

Сообщение BANAN »

Загрузка фотографий на сервер ВКонтакте от имени пользователи осуществляется приложением в 3 этапа:

1. С помощью метода photos.getUploadServer приложение узнает http-адрес для загрузки фотографий. При вызове этого метода можно указать параметр save_big равным 1, тогда помимо стандартных размеров фотографии будут сохраняться в более высоком качестве.

2. Приложение формирует POST-запрос на полученный адрес.
Запрос должен содержать поля file1-file5, которые содержат файлы с изображениями (JPG, PNG, BMP или GIF).

В ответ приложение получает следующие данные в формате JSON:
{"server": '1', "photos_list": '2,3,4', "aid": '5', "hash": '12345abcde'}

3. С помощью метода photos.save приложение передает серверу полученные данные (server, photos_list, aid и hash) и получает данные о загруженных изображениях.

Фотографии загружены.

Как реализовать второй шаг, т.е как сформировать этот POST запрос и задать file1-file5?

Делал так (AS 3.0):

Код: Выделить всё

 private function getPhotosUploadServer(aid:*):void{            query=api.getPhotosUploadServer(aid);            url_request=new URLRequest(query);            url_loader=new URLLoader();            url_loader.addEventListener(Event.COMPLETE, photoLoaded);    url_loader.load(url_request); }        private function photoLoaded(e:Event):void{    var responsePhoto:XML = new XML(url_loader.data);    upload_url = responsePhoto.upload_url;    var req:URLRequest = new URLRequest(upload_url + "&file1="); //вот тут думаю проблема. Как задать file1            req.method = URLRequestMethod.POST;            load = new URLLoader();     load.addEventListener(Event.COMPLETE, photoSaveInAlbum);    this.load.load(req); //получаю {"server": '1', "photos_list": '', "aid": '5', "hash": '12345abcde'}. photos_list             соответственно пустой.} private function photoSaveInAlbum(e:Event):void{    var data: Object = JSON.decode(load.data);    var q:* = api.savePhotos(data.aid, data.server, data.photos_list, data.hash);             url_request=new URLRequest(q);            url_loader=new URLLoader();            url_loader.addEventListener(Event.COMPLETE, photoSave);    url_loader.load(url_request); }        private function photoSave(e:Event):void {            menu_item.panel.addChild( VK.addText("фото загружено в альбом", 20, 100 ) );                } 
Аватара пользователя
BANAN
Сообщения: 96
Зарегистрирован: 10 мар 2010, 22:24

Re: Как загрузить фото в альбом на сервер вкотакте.

Сообщение BANAN »

Все ,я разобрался. вообщем нужно использовать FileReference.
POST запрос сформировать можно так:

Код: Выделить всё

       rq = new URLRequest();      rq.url = upload_url;      rq.method = URLRequestMethod.POST;      rq.requestHeaders.push( new URLRequestHeader( "Cache-Control", "no-cache" ) ); 
file1 можно задать так:

Код: Выделить всё

 private var file:FileReference = new FileReference;file.upload( rq, "file1" ); 
Аватара пользователя
revizor
FL Team
FL Team
Сообщения: 1034
Зарегистрирован: 18 ноя 2009, 20:22

Re: Как загрузить фото в альбом на сервер вкотакте.

Сообщение revizor »

дай плыз исходник получившегося если не жалко
Аватара пользователя
BANAN
Сообщения: 96
Зарегистрирован: 10 мар 2010, 22:24

Re: Как загрузить фото в альбом на сервер вкотакте.

Сообщение BANAN »

Думаю исходник сильно не поможет, главное идею понять. Тут все написано http://help.adobe.com/ru_RU/AS3LCR/Flas ... mpleteData
Ну а код я уже выше привел, вот такойже код, но с соответствующими дополнениями

Код: Выделить всё

 private var file:FileReference;//наш файл с изоброжениемprivate var url_loader:URLLoader;private var url_request:URLRequest;private var upload_url:* = null;private var button1:* = null;private var rq:URLRequest = null; button1 = VK.createRoundButton( "loade", 10, 200 ); //кнопка для выбора фотоmenu_item.panel.addChild( button1 );button1.addEventListener( MouseEvent.CLICK, onSelectFile ); private function onSelectFile( e:MouseEvent ):void{       load_Photo("ID албома");    file = new FileReference();    file.browse();    file.addEventListener( Event.SELECT, selectHandler );    file.addEventListener( DataEvent.UPLOAD_COMPLETE_DATA,uploadCompleteDataHandler );} private function selectHandler( e:Event ):void{   file.upload( rq, "file1" );} private function uploadCompleteDataHandler( e:DataEvent ):void{     var data: Object = JSON.decode(e.data);     var q:* = api.savePhotos(data.aid, data.server, data.photos_list, data.hash);//третий шаг, сохраняем фото, передав полученные данне     url_request=new URLRequest(q);     url_loader=new URLLoader();     url_loader.addEventListener(Event.COMPLETE, photoSave);     url_loader.load(url_request);} private function load_Photo(aid:*):void{    query=api.getPhotosUploadServer(aid);//первый шаг по загрузке файла, получаем url    url_request=new URLRequest(query);    url_loader=new URLLoader();    url_loader.addEventListener(Event.COMPLETE, photoLoaded);    url_loader.load(url_request); }        private function photoLoaded(e:Event):void{   var responsePhoto:XML = new XML(url_loader.data);   upload_url = responsePhoto.upload_url;   rq = new URLRequest();//второй шаг, формируем POST запрос на полученный url   rq.url = upload_url;   rq.method = URLRequestMethod.POST;   rq.requestHeaders.push( new URLRequestHeader( "Cache-Control", "no-cache" ) );} private function photoSave(e:Event):void{   menu_item.panel.addChild( VK.addText("Фото успешно загружено в альбом", 20, 100 ) );} 
Аватара пользователя
Garrat
Сообщения: 36
Зарегистрирован: 15 июл 2010, 14:44

Re: Как загрузить фото в альбом на сервер вкотакте.

Сообщение Garrat »

Вроде бы все сделал, а все равно photos_list пустой. Подскажите, пожалуйста, в чем проблема

Код: Выделить всё

                 private function addPhoto(event:Event):void{                getPhotoServer();                file=new FileReference();                 file.addEventListener(Event.SELECT, select);                file.browse();            }            private function getPhotoServer():void{                     //1 этап                aid=txtIn.text;                var sig:String=MD5.encrypt(viewer_id+'aid='+aid+'api_id='+api_id+                    'method=photos.getUploadServertest_mode=1v=2.0'+api_secret);                var request:URLRequest=new URLRequest(a_url+'?api_id='+api_id+                    '&method=photos.getUploadServer&test_mode=1&aid='+aid+'&v=2.0&sig='+sig);                loader2.addEventListener(Event.COMPLETE, onGetPhotoServerComplete);                loader2.load(request);            }            private function onGetPhotoServerComplete(event:Event):void{                var externalXML=new XML(loader2.data);                upl_url=externalXML..upload_url;                                rq=new URLRequest();                                    //2этап                rq.url=upl_url;                rq.method=URLRequestMethod.POST;                rq.requestHeaders.push(new URLRequestHeader("Cache-Control", "no-cache"));            }            private function select(event:Event):void{                file.upload(rq, "file1");            }            private function uploadNow(event:Event):void{     //запускается отдельной кнопкой (все остальные функции заведомо успели выполниться)                                                        loader3.addEventListener(Event.COMPLETE, uploadComplete);                loader3.load(rq);            }            private function uploadComplete(event:Event):void{                var data:*=JSON.decode(loader3.data);            Alert.show(loader3.data.toString());     // Показывает все правильно, кроме: "photos_list":""             }
Аватара пользователя
Евгений
FL Team
FL Team
Сообщения: 776
Зарегистрирован: 10 июн 2010, 11:01

Re: Как загрузить фото в альбом на сервер вкотакте.

Сообщение Евгений »

Garrat, Исходник в студию!
Аватара пользователя
Garrat
Сообщения: 36
Зарегистрирован: 15 июл 2010, 14:44

Re: Как загрузить фото в альбом на сервер вкотакте.

Сообщение Garrat »

Да это, практически, и вся программа. Остальная часть написана на mxml, если это поможет - привожу ниже текст целиком.

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"                 xmlns:s="library://ns.adobe.com/flex/spark"                 xmlns:mx="library://ns.adobe.com/flex/mx"                creationComplete="Main(event)">         <fx:Script>        <![CDATA[             import com.adobe.serialization.json.*;                        import flash.display.*;            import flash.events.*;            import flash.net.URLLoader;            import flash.net.URLRequest;            import flash.text.*;                        import mx.controls.Alert;            import mx.core.UIComponent;            import org.osmf.utils.URL;                            private var api_id:Number=1905756; // id вашего приложения            private var api_secret:String="0txjzQhgSU"; // секретный ключ            private var loader:URLLoader = new URLLoader();            private var loader1:URLLoader = new URLLoader();            private var loader2:URLLoader = new URLLoader();            private var loader3:URLLoader = new URLLoader();            private var viewer_id:Number;            private var u_id:String;            private var a_url:String;            private var params:Object;            private var Title:String;            private var aid:String;            private var file:FileReference;            private var rq:URLRequest;            private var upl_url:*;                    ----------------------------------------------------------------------------------------------------------------------------------------------------------            public function Main(event:Event):void {    //Простейший вывод имени и фамилии пользователя (можно смело пропустить)                params=this.parameters;                viewer_id =parseInt(params['viewer_id']);                a_url=params['api_url'];                getProfile(viewer_id);            }                                private function getProfile(u_id:Number):void {                var sig:String=MD5.encrypt(viewer_id+'api_id='+api_id+'fields=bdatemethod=getProfilesuids='+                    u_id+'v=2.0'+api_secret);                var request:URLRequest=new URLRequest(a_url+"?api_id="+api_id+                    "&fields=bdate&method=getProfiles&uids="+u_id+"&v=2.0&sig="+sig);                loader.addEventListener(Event.COMPLETE, onComplete);                loader.load(request);            }                                private function onComplete(event:Event):void {                    var externalXML=new XML(loader.data);                                        var bdate = externalXML..bdate;                    bdate_txt.text=bdate;                                                var uname = externalXML..first_name + ' ' + externalXML..last_name;                    name_txt.text=uname;            } ----------------------------------------------------------------------------------------------------------------------------------------------------------------------            private function addAlbum(event:Event):void{                 //создание нового альбома (важна только переменная aid, а так тоже можно пропустить)                Title=txtIn.text.toString();                                var sig:String=MD5.encrypt(viewer_id+'api_id='+api_id+'method=photos.createAlbumtitle='+                    Title+'v=2.0'+api_secret);                var request:URLRequest=new URLRequest(encodeURI(a_url+'?api_id='+api_id+                    '&method=photos.createAlbum&title='+Title+'&v=2.0&sig='+sig));                loader1.addEventListener(Event.COMPLETE, onComplete1);                loader1.load(request);            }            private function onComplete1(event:Event):void{                var externalXML=new XML(loader1.data);                                name_txt.text=externalXML.toString();                aid=externalXML..aid;                txtIn.text=aid.toString();            }                                    -------------------------------------------------------------------------------------------------------------------------------------------------------------                                   private function addPhoto(event:Event):void{                getPhotoServer();                file=new FileReference();                               //1 этап                file.addEventListener(Event.SELECT, select);                file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, completeUpload);                file.browse();            }            private function uploadNow(event:Event):void{                loader3.addEventListener(Event.COMPLETE, uploadCompleteData);                loader3.load(rq);            }            private function getPhotoServer():void{                     //1 этап                aid=txtIn.text;                var sig:String=MD5.encrypt(viewer_id+'aid='+aid+'api_id='+api_id+                    'method=photos.getUploadServertest_mode=1v=2.0'+api_secret);                var request:URLRequest=new URLRequest(a_url+'?api_id='+api_id+                    '&method=photos.getUploadServer&test_mode=1&aid='+aid+'&v=2.0&sig='+sig);                loader2.addEventListener(Event.COMPLETE, onGetPhotoServerComplete);                loader2.load(request);            }            private function onGetPhotoServerComplete(event:Event):void{                var externalXML=new XML(loader2.data);                upl_url=externalXML..upload_url;                                rq=new URLRequest();                                    //2этап                rq.url=upl_url;                rq.method=URLRequestMethod.POST;                rq.requestHeaders.push(new URLRequestHeader("Cache-Control", "no-cache"));            }            private function select(event:Event):void{                file.upload(rq, 'file1');            }            private function completeUpload(event:Event):void{                Alert.show("complete upload!");            }            private function uploadCompleteData(event:Event):void{                var data:*=JSON.decode(loader3.data);            Alert.show(loader3.data.toString());            }        ]]>    </fx:Script>    <s:layout>        <s:VerticalLayout/>    </s:layout>    <s:Label id="name_txt" text=""/>    <s:Label id="bdate_txt" text=""/>    <s:Label text="Название альбома:"/>    <s:TextInput id="txtIn"/>    <s:Button label="Создать!" click="addAlbum(event)"/>    <s:Button label="Добавить фото" click="addPhoto(event)"/>    <s:Button label="Загрузить!" click="uploadNow(event)"/></s:Application>
Последний раз редактировалось Garrat 17 июл 2010, 16:24, всего редактировалось 1 раз.
Аватара пользователя
112
Модератор
Модератор
Сообщения: 2215
Зарегистрирован: 02 фев 2010, 21:53

Re: Как загрузить фото в альбом на сервер вкотакте.

Сообщение 112 »

Garrat писал(а):Да это, практически, и вся программа. Остальная часть написана на mxml, если это поможет - привожу ниже текст целиком.

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"                 xmlns:s="library://ns.adobe.com/flex/spark"                 xmlns:mx="library://ns.adobe.com/flex/mx"                creationComplete="Main(event)">         <fx:Script>        <![CDATA[             import com.adobe.serialization.json.*;                        import flash.display.*;            import flash.events.*;            import flash.net.URLLoader;            import flash.net.URLRequest;            import flash.text.*;                        import mx.controls.Alert;            import mx.core.UIComponent;            import org.osmf.utils.URL;                            private var api_id:Number=1905756; // id вашего приложения            private var api_secret:String="0txaHQhgSU"; // секретный ключ            private var loader:URLLoader = new URLLoader();            private var loader1:URLLoader = new URLLoader();            private var loader2:URLLoader = new URLLoader();            private var loader3:URLLoader = new URLLoader();            private var viewer_id:Number;            private var u_id:String;            private var a_url:String;            private var params:Object;            private var Title:String;            private var aid:String;            private var file:FileReference;            private var rq:URLRequest;            private var upl_url:*;                    ----------------------------------------------------------------------------------------------------------------------------------------------------------            public function Main(event:Event):void {    //Простейший вывод имени и фамилии пользователя (можно смело пропустить)                params=this.parameters;                viewer_id =parseInt(params['viewer_id']);                a_url=params['api_url'];                getProfile(viewer_id);            }                                private function getProfile(u_id:Number):void {                var sig:String=MD5.encrypt(viewer_id+'api_id='+api_id+'fields=bdatemethod=getProfilesuids='+                    u_id+'v=2.0'+api_secret);                var request:URLRequest=new URLRequest(a_url+"?api_id="+api_id+                    "&fields=bdate&method=getProfiles&uids="+u_id+"&v=2.0&sig="+sig);                loader.addEventListener(Event.COMPLETE, onComplete);                loader.load(request);            }                                private function onComplete(event:Event):void {                    var externalXML=new XML(loader.data);                                        var bdate = externalXML..bdate;                    bdate_txt.text=bdate;                                                var uname = externalXML..first_name + ' ' + externalXML..last_name;                    name_txt.text=uname;            } ----------------------------------------------------------------------------------------------------------------------------------------------------------------------            private function addAlbum(event:Event):void{                 //создание нового альбома (важна только переменная aid, а так тоже можно пропустить)                Title=txtIn.text.toString();                                var sig:String=MD5.encrypt(viewer_id+'api_id='+api_id+'method=photos.createAlbumtitle='+                    Title+'v=2.0'+api_secret);                var request:URLRequest=new URLRequest(encodeURI(a_url+'?api_id='+api_id+                    '&method=photos.createAlbum&title='+Title+'&v=2.0&sig='+sig));                loader1.addEventListener(Event.COMPLETE, onComplete1);                loader1.load(request);            }            private function onComplete1(event:Event):void{                var externalXML=new XML(loader1.data);                                name_txt.text=externalXML.toString();                aid=externalXML..aid;                txtIn.text=aid.toString();            }                                    -------------------------------------------------------------------------------------------------------------------------------------------------------------                                   private function addPhoto(event:Event):void{                getPhotoServer();                file=new FileReference();                               //1 этап                file.addEventListener(Event.SELECT, select);                file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, completeUpload);                file.browse();            }            private function uploadNow(event:Event):void{                loader3.addEventListener(Event.COMPLETE, uploadCompleteData);                loader3.load(rq);            }            private function getPhotoServer():void{                     //1 этап                aid=txtIn.text;                var sig:String=MD5.encrypt(viewer_id+'aid='+aid+'api_id='+api_id+                    'method=photos.getUploadServertest_mode=1v=2.0'+api_secret);                var request:URLRequest=new URLRequest(a_url+'?api_id='+api_id+                    '&method=photos.getUploadServer&test_mode=1&aid='+aid+'&v=2.0&sig='+sig);                loader2.addEventListener(Event.COMPLETE, onGetPhotoServerComplete);                loader2.load(request);            }            private function onGetPhotoServerComplete(event:Event):void{                var externalXML=new XML(loader2.data);                upl_url=externalXML..upload_url;                                rq=new URLRequest();                                    //2этап                rq.url=upl_url;                rq.method=URLRequestMethod.POST;                rq.requestHeaders.push(new URLRequestHeader("Cache-Control", "no-cache"));            }            private function select(event:Event):void{                file.upload(rq, 'file1');            }            private function completeUpload(event:Event):void{                Alert.show("complete upload!");            }            private function uploadCompleteData(event:Event):void{                var data:*=JSON.decode(loader3.data);            Alert.show(loader3.data.toString());            }        ]]>    </fx:Script>    <s:layout>        <s:VerticalLayout/>    </s:layout>    <s:Label id="name_txt" text=""/>    <s:Label id="bdate_txt" text=""/>    <s:Label text="Название альбома:"/>    <s:TextInput id="txtIn"/>    <s:Button label="Создать!" click="addAlbum(event)"/>    <s:Button label="Добавить фото" click="addPhoto(event)"/>    <s:Button label="Загрузить!" click="uploadNow(event)"/></s:Application>
я не очень понимаю но это же вроде flex
Аватара пользователя
Garrat
Сообщения: 36
Зарегистрирован: 15 июл 2010, 14:44

Re: Как загрузить фото в альбом на сервер вкотакте.

Сообщение Garrat »

112
Ну конечно! :)

Если кто может помочь - указать, где ошибка в AS коде - отпишитесь, пожалуйста!
Аватара пользователя
Garrat
Сообщения: 36
Зарегистрирован: 15 июл 2010, 14:44

Re: Как загрузить фото в альбом на сервер вкотакте.

Сообщение Garrat »

Help :!:

Если кто-то знает, как загрузить фото в альбом пользователя другим путем - буду очень признателен!
Неужели никто не сталкивался? :(
Ответить