Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.08.2013, 10:21
Daniel007 вне форума Посмотреть профиль Отправить личное сообщение для Daniel007 Найти все сообщения от Daniel007
  № 1  
Ответить с цитированием
Daniel007

Регистрация: Aug 2013
Сообщений: 2
Question пустое поле Photo в ответ на POST запрос

Перечитал, наверно, все схожие темы на этом форуме, но так и не нашел решения проблемы.
Пытаюсь загрузить фото на сервер ВК как по докам:
1) Запрашиваю при инициализации приложения photos.getWallUploadServer
Получаю: "http://csXXXXX.vk.com/upload.php?act=do_add&..."
2) Нашел на этом сайте класс MultipartURLLoader, дальше пользуюсь им:
Создал две кнопки, по первой :
Код AS3:
//Создаю 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');
По второй (рекомендовали делать по нажатию кнопки):
Код AS3:
private function uploadFileData(event:MouseEvent):void 
{
    mll.load(_upload_url);	
}
Код AS3:
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));
}
На этот момент поле TextField содержит
{"server":11111,"photo":"[]","hash":"abcdef"}
Что не так я делаю? Работаю на FleshDevelop и не имею доступа к mx.graphics с декодерами поэтому не знаю как по-другому сформировать из BitmapData -> ByteArray.

Старый 27.08.2013, 15:19
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Работаю на FleshDevelop и не имею доступа к mx.graphics с декодерами поэтому не знаю как по-другому сформировать из BitmapData -> ByteArray.
ну, во-первых, на mx.graphics свет клином не сходится. Есть другие пакеты для этого. А во-вторых, причем здесь FD? Что мешает создать не AS3 Project, а к примеру Flex 4 Project? Удалить файл Main.mxml и вместо него создать Main.as. В остальном тот же процесс. Только флексовые пакеты будут доступны.

Что касается отправки картинки, то у меня вот такой класс отвечает за это:
Код AS3:
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			= "";
		}
 
 
 
 
	}
 
}
В общем, здесь нужно только некоторые пакеты поправить под свои нужды, и скачать какой-то PNGEncoder

Для загрузки фотки в альбом или на стену в контакт, достаточно лишь вызвать соответствующий статический метод

Этот класс 100% рабочий. Успешно используется в нескольких проектах.
Класс умеет создавать новый альбом, если альбома с указанным названием у пользователя еще нет. Все это происходит автоматически, и ни о чем дополнительно париться не надо.

Старый 27.08.2013, 23:38
Daniel007 вне форума Посмотреть профиль Отправить личное сообщение для Daniel007 Найти все сообщения от Daniel007
  № 3  
Ответить с цитированием
Daniel007

Регистрация: Aug 2013
Сообщений: 2
Огромное спасибо за быстрый и очень детальный ответ! Всё работает на ура!
PS
я не понимал что есть Flex

Старый 30.08.2013, 20:45
anonrab вне форума Посмотреть профиль Отправить личное сообщение для anonrab Найти все сообщения от anonrab
  № 4  
Ответить с цитированием
anonrab

Регистрация: 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]
Я, конечно, понимаю что тут не собрание альтруистов. Так что готов отблагодарить за помощь материально..

Старый 31.08.2013, 11:20
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Уже было много тем по этому вопросу. Все решается просто, заливаем файл swf в контакт, как дополнительный, у указываем ссылку в айфрейм на него.
А чтобы, например, серверы одноклассников не ругались на нарушение изолированной среды, то добавляем к ссылке параметр ?q=odnoklassniki

Старый 02.09.2013, 07:57
bifidokk вне форума Посмотреть профиль Отправить личное сообщение для bifidokk Найти все сообщения от bifidokk
  № 6  
Ответить с цитированием
bifidokk
 
Аватар для bifidokk

Регистрация: Jan 2011
Сообщений: 200
Цитата:
А чтобы, например, серверы одноклассников не ругались на нарушение изолированной среды, то добавляем к ссылке параметр ?q=odnoklassniki
можно про это подробнее? у меня без этих параметров никакой ругани от одноклассников нет

Старый 02.09.2013, 10:44
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
можно про это подробнее? у меня без этих параметров никакой ругани от одноклассников нет
Хм. да, действительно. В подробности не вдавался откуда это взяли, не я придумал. Как-то были проблемы с одноклассниками, посоветовали добавить этот параметр

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:11.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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