Я для этого написал готовый класс, и использую его во всех прилоениях, где нужен такой функционал
Код AS3:
package {
import vk.APIConnection;
import vk.api.serialization.json.Json;
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 api.com.adobe.images.PNGEncoder;
import vk.api.MD5;
/**
* используется просто, вызовом либо VKPhoto.saveAlbumPhoto()
* либо VKPhoto.saveAlbumPhoto()
*/
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;
}
/**
*
* @param image картинка, которую нужно сохранить в альбом
* @param vk ссылка на объект APIConnection
* @param callback метод, который будет вызыван после сохранения в альбом
* @param erCallback метод, вызываемый при ошибке
* @param albumTitle навание для альбома. Если такого альбома не существует, он будет создан
* @param albumDescription описание альбома
*/
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);
}
/**
* @param image картинка, которую нужно сохранить
* @param vk ссылка на объект APIConnection
* @param callback метод, который будет вызыван после сохранения на стену
* @param erCallback метод, вызываемый при ошибке
* @param message сообщение, добавляемуе вместе с картинкой
*/
public static function saveWallPhoto(image:Bitmap, vk:APIConnection, callback:Function,
erCallback:Function, message:String = ""):void {
if (!vk) {
trace("VK IS NULL, VKPhoto.as")
image.bitmapData.dispose();
return;
}
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 {
if (_image) {
if (_image.bitmapData) {
_image.bitmapData.dispose();
}
_image = null;
}
_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 {
if (!_image || !_image.bitmapData) return;
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());
}
_image.bitmapData.dispose();
_image = null;
}
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 { // {"response":[{"pid":304710821,"id":"photo5495786_304710821","aid":-14,"owner_id":5495786,"src":"http:\/\/cs310520.vk.me\/v310520786\/e86\/OmTNZyBed-k.jpg","src_big":"http:\/\/cs310520.vk.me\/v310520786\/e87\/hj5i19qujd0.jpg","src_small":"http:\/\/cs310520.vk.me\/v310520786\/e85\/AydkwTofv-c.jpg","width":338,"height":302,"text":"","created":1371100727}]}
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 { } );
if (_callback != null) {
_callback.call();
_callback = null;
}
}
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;
}
_callback = null;
_erCallback = null;
_albumTitle = null;
_albumDescription = null;
_onUploadedFunction = null;
_message = "";
}
}
}