Страница 1 из 3
Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 10 мар 2010, 22:48
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 ) ); }
Re: Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 11 мар 2010, 22:21
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" );
Re: Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 12 мар 2010, 17:36
revizor
дай плыз исходник получившегося если не жалко
Re: Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 12 мар 2010, 20:56
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 ) );}
Re: Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 17 июл 2010, 15:25
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":"" }
Re: Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 17 июл 2010, 15:51
Евгений
Garrat, Исходник в студию!
Re: Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 17 июл 2010, 16:02
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>
Re: Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 17 июл 2010, 16:05
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
Re: Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 17 июл 2010, 16:08
Garrat
112
Ну конечно!
Если кто может помочь - указать, где ошибка в AS коде - отпишитесь, пожалуйста!
Re: Как загрузить фото в альбом на сервер вкотакте.
Добавлено: 17 июл 2010, 19:51
Garrat
Help
Если кто-то знает, как загрузить фото в альбом пользователя другим путем - буду очень признателен!
Неужели никто не сталкивался?
