|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Aug 2013
Сообщений: 2
|
пустое поле Photo в ответ на POST запрос
Перечитал, наверно, все схожие темы на этом форуме, но так и не нашел решения проблемы.
Пытаюсь загрузить фото на сервер ВК как по докам: 1) Запрашиваю при инициализации приложения photos.getWallUploadServer Получаю: "http://csXXXXX.vk.com/upload.php?act=do_add&..." 2) Нашел на этом сайте класс MultipartURLLoader, дальше пользуюсь им: Создал две кнопки, по первой : //Создаю ByteArray для fileData из существующего currentImage: BitmapData var ba: ByteArray = new ByteArray(); ba.writeUnsignedInt(currentImage.width); ba.writeBytes(currentImage.getPixels(currentImage.rect)); _fileData = ba; mll.addEventListener(Event.COMPLETE, onUploadCompleteThroughAlarm); mll.addFile(_fileData, "file.jpg", "photo", 'image/jpg'); private function onUploadCompleteThroughAlarm(event:Event):void { event.currentTarget.removeEventListener(event.type, arguments.callee); tf.text = event.currentTarget.loader.data as String; savePhotos(parseServerAck(event.currentTarget.loader.data as String)); } {"server":11111,"photo":"[]","hash":"abcdef"} Что не так я делаю? Работаю на FleshDevelop и не имею доступа к mx.graphics с декодерами поэтому не знаю как по-другому сформировать из BitmapData -> ByteArray. |
|
|||||
Цитата:
Что касается отправки картинки, то у меня вот такой класс отвечает за это: package social.photos { import social.api.com.adobe.images.PNGEncoder; import flash.display.Bitmap; import flash.events.Event; import flash.events.IOErrorEvent; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.net.URLRequestHeader; import flash.net.URLRequestMethod; import flash.utils.ByteArray; import flash.utils.getTimer; import social.vk.api.MD5; import social.vk.api.serialization.json.Json; import social.vk.APIConnection; public class VKPhoto { private var _vk: APIConnection = null; private var _callback: Function = null; private var _albumID: String = ""; private var _vkUploadServer: String = null; private var _image: Bitmap = null; private var _albumDescription: String = null; private var _albumTitle: String = null; private var _onUploadedFunction: Function = null; private var _message: String = ""; private var _erCallback: Function = null public function VKPhoto(vk:APIConnection) { _vk = vk; } public static function saveAlbumPhoto(image:Bitmap, vk:APIConnection, callback:Function, erCallback:Function, albumTitle:String = "", albumDescription:String = ""):void { var vkPhoto:VKPhoto = new VKPhoto(vk); vkPhoto.saveAlbumPhoto(image, callback, erCallback, albumTitle, albumDescription); } public static function saveWallPhoto(image:Bitmap, vk:APIConnection, callback:Function, erCallback:Function, message:String = ""):void { var vkPhoto: VKPhoto = new VKPhoto(vk); vkPhoto.saveWallPhoto(image, callback, erCallback, message); } public function saveAlbumPhoto(image:Bitmap, callback:Function, erCallback:Function, albumTitle:String = "", albumDescription:String = ""):void { _image = image; _callback = callback; _erCallback = erCallback; _albumDescription = albumDescription; _albumTitle = albumTitle; _onUploadedFunction = onVkPhotoUploaded; if (_callback == null || _image == null || _albumDescription == null) { throw new ArgumentError("one of the arguments is null"); } _vk.api("photos.getAlbums", { }, onAlbums, onVkError ); } public function saveWallPhoto(image:Bitmap, callback:Function, erCallback:Function, message:String = ""):void { _image = image; _callback = callback; _erCallback = erCallback; _message = message; _onUploadedFunction = onVkWallPhotoUploaded; if (_callback == null || _image == null) { throw new ArgumentError("one of the arguments is null"); } requestVkWallUploadServer(); } private function requestVkWallUploadServer():void { // получение сервера загрузки сообщения на стену _vk.api("photos.getWallUploadServer", {}, onVkUploadServer, onVkError); } private function onAlbums(params:Object):void { if (params is Array) { var arr:Array = params as Array; } else { arr = [params]; } var albumFound:Boolean = false; for (var i:String in arr) { if (arr[i].title == _albumTitle) { _albumID = arr[i].aid; albumFound = true; break; } } if (albumFound == false) { _vk.api("photos.createAlbum", { title: _albumTitle, description: _albumDescription, comment_privacy: 0, privacy: 0 }, onAlbumCreated, onVkError); } else { requestVkUploadServer(); } } private function requestVkUploadServer():void { _vk.api("photos.getUploadServer", { aid: _albumID }, onVkUploadServer, onVkError); } private function onAlbumCreated(params:Object):void { _albumID = params.aid; requestVkUploadServer(); } private function onVkUploadServer(params:Object):void { _vkUploadServer = params.upload_url; uploadVkPhoto(); } private function uploadVkPhoto():void { var imageStream:ByteArray = PNGEncoder.encode(_image.bitmapData); var stream:ByteArray = new ByteArray(); var boundary:String = "----------Ij5ae0ae0KM7GI3KM7"; var imageName:String = MD5.encrypt(getTimer() + "") + ".png"; stream.writeUTFBytes("--" + boundary + '\r\nContent-Disposition: form-data; name="file1"; filename="' + imageName + '"\r\nContent-Type: image/png\r\n\r\n'); stream.writeBytes(imageStream); stream.writeUTFBytes("\r\n--" + boundary + '--\r\n'); var header:URLRequestHeader = new URLRequestHeader ("Content-type", "multipart/form-data; boundary=" + boundary); var urlRequest:URLRequest = new URLRequest(_vkUploadServer); urlRequest.requestHeaders.push(header); urlRequest.method = URLRequestMethod.POST; urlRequest.data = stream; var urlLoader:URLLoader = new URLLoader(); urlLoader.dataFormat = URLLoaderDataFormat.TEXT; urlLoader.addEventListener( Event.COMPLETE, _onUploadedFunction ); urlLoader.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError ); try { urlLoader.load( urlRequest ); } catch (e:Error) { trace(e.getStackTrace()); } } private function onVkPhotoUploaded(e:Event):void { e.target.addEventListener( Event.COMPLETE, _onUploadedFunction ); e.target.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError ); var responce: Object = Json.decode(unescape(String(e.target.data))); var server: String = responce.server; var hash: String = responce.hash; var photosList: String = responce.photos_list; var aid: String = responce.aid; _vk.api("photos.save", { photos_list: photosList, aid: aid, hash: hash, server: server }, onVkPhotoSaved, onVkError ); } private function onVkWallPhotoUploaded(e:Event):void { e.target.addEventListener( Event.COMPLETE, _onUploadedFunction ); e.target.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError ); var responce: Object = Json.decode(unescape(String(e.target.data))); var server: String = responce.server; var hash: String = responce.hash; var photo: String = responce.photo; _vk.api("photos.saveWallPhoto", { photo: photo, hash: hash, server: server }, onWallPhotoSaved, onVkError ); } private function onWallPhotoSaved(params:Object):void { var imageID:String = params[0].id; //trace("THIS IS IMAGE ID", imageID, "VKPhotoUploader"); _vk.api("wall.post", { message: _message, attachments: imageID }, function(o:Object):void {}, function(p:Object):void { } ); } private function onVkPhotoSaved(params:Object):void { if (_callback != null) { _callback.call(); _callback = null; } dispose(); } private function photoUploadError(e:IOErrorEvent):void { e.target.addEventListener( Event.COMPLETE, _onUploadedFunction ); e.target.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError ); if (_erCallback != null) { _erCallback.call(); } dispose(); } private function onVkError(param:Object):void { trace(Json.encode(param)); if (_erCallback != null) { _erCallback.call(); } dispose(); } private function dispose():void { if (_image) { _image.bitmapData.dispose(); _image = null; } _erCallback = null; _albumTitle = null; _albumDescription = null; _onUploadedFunction = null; _message = ""; } } } Для загрузки фотки в альбом или на стену в контакт, достаточно лишь вызвать соответствующий статический метод Этот класс 100% рабочий. Успешно используется в нескольких проектах. Класс умеет создавать новый альбом, если альбома с указанным названием у пользователя еще нет. Все это происходит автоматически, и ни о чем дополнительно париться не надо. |
|
|||||
Регистрация: Aug 2013
Сообщений: 2
|
Огромное спасибо за быстрый и очень детальный ответ! Всё работает на ура!
PS я не понимал что есть Flex |
|
|||||
Регистрация: Jun 2013
Сообщений: 8
|
Уже который раз пытаюсь реализовать сохранение на стену и в альбом - одна беда. Нарушение политики изолированной среды. И даже 100% рабочий код уважаемого caseyryan не работает:
Error #2044: Unhandled securityError:. text=Error #2048: Security sandbox violation: http://app.hair.su/Hairs.swf?1377877469333 cannot load data from http://cs402626.vk.com/upload.php?act=do_add&mid=193717568&aid=179035830&gid=0&hash=578beddf9c334dbccfbe29fc92cd5ab5&rhash=5fd557794a0428b8a4ef49fd441edb81&swfupload=1&api=1. at social.photos::VKPhoto/uploadVkPhoto()[C:\hairs\Hairs\src\social\photos\VKPhoto.as:139] at social.photos::VKPhoto/onVkUploadServer()[C:\hairs\Hairs\src\social\photos\VKPhoto.as:122] at Function/<anonymous>()[C:\hairs\Hairs\src\vk\APIConnection.as:111] at vk::APIConnection/apiCallback()[C:\hairs\Hairs\src\vk\APIConnection.as:230] |
|
|||||
Уже было много тем по этому вопросу. Все решается просто, заливаем файл swf в контакт, как дополнительный, у указываем ссылку в айфрейм на него.
А чтобы, например, серверы одноклассников не ругались на нарушение изолированной среды, то добавляем к ссылке параметр ?q=odnoklassniki |
|
|||||
Регистрация: Jan 2011
Сообщений: 200
|
Цитата:
|
|
|||||
Цитата:
|
Часовой пояс GMT +4, время: 07:11. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|