PDA

Просмотр полной версии : [Вконтакте] UrlLoad.load не запускается.


kiloT
04.07.2011, 18:47
Здравствуйте. Пытаюсь отправить фотографию в альбом Вконтакте. Собственно в переменной url лежит адрес сервера для загрузки. В последней строчке вызываю метод load. Но проблема в том, что функция ничего не отправляет и не выводит ошибок. В чем проблема?

var ba:ByteArray = new ByteArray();
var encoder:PNGEncoder = new PNGEncoder();
var bd:BitmapData = new BitmapData(CityFarm.instance.width, CityFarm.instance.height);
var mul:MultipartURLLoader = new MultipartURLLoader();

bd.draw(world.layer);
ba = encoder.encode(bd);
ba = MultipartData.addFile(ba, "image1");

var request:URLRequest = new URLRequest();
request.url = url;
request.requestHeaders.push(new URLRequestHeader("Content-type", "multipart/form-data; boundary=" + MultipartData.BOUNDARY));
request.method = URLRequestMethod.POST;
request.data = ba;

var imageLoader:URLLoader = new URLLoader();
imageLoader.dataFormat = URLLoaderDataFormat.BINARY;
imageLoader.addEventListener(Event.COMPLETE, onLoaderComplete);
imageLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOErrorHandler);
imageLoader.load(request);

MultipartData
package org.flashgate.external.uploader {
import flash.utils.ByteArray;
/**
* ...
* @author rzer
*/
public class MultipartData{

public static const BOUNDARY:String = "----------cH2gL6ei4Ef1gL6GI3Ij5Ef1Ef1Ef1";
private static const CRLF:String = "\r\n";
private static const HYPHENS:String = "--";

public static function addFile(file:ByteArray, name:String = "Filedata", fileName:String = "name.jpg"):ByteArray {

var data:ByteArray = new ByteArray();
data.writeUTFBytes(HYPHENS + BOUNDARY + CRLF);
data.writeUTFBytes("Content-Disposition: form-data; name=" + name + "; filename=" + fileName + CRLF);
data.writeUTFBytes("Content-Type: application/octet-stream" + CRLF + CRLF);
data.writeBytes(file);
data.writeUTFBytes(CRLF);

var result:ByteArray = new ByteArray();
result.writeBytes(data);
result.writeUTFBytes(HYPHENS + BOUNDARY + HYPHENS);
return result;
}

}

}

alatar
04.07.2011, 19:01
Возможно дело в политике безопасности (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/net/URLLoader.html#load()).
В приложении Flash Player 10 и более поздней версии при использовании типа содержимого multipart (например, multipart/form-data), в котором содержится отправка (обозначена параметром filename в заголовке content-disposition в теле оператора POST), к операции POST применяются правила безопасности для отправок:

Операция POST должна быть выполнена в ответ на действие, инициированное пользователем, такое как щелчок мыши или нажатие клавиши.
Если операция POST является междоменной (назначением операции POST не является сервер, на котором содержится SWF-файл, отправляющий запрос POST), целевой сервер должен предоставить файл политик URL, в котором разрешен междоменный доступ.
Кроме того, все объекты multipart Content-Type должны иметь допустимый синтаксис (в соответствии со стандартами RFC2046). Если синтаксис является недопустимым, к операции POST применяются правила безопасности, действующие для загрузок.

kiloT
04.07.2011, 19:05
а почему try catch ничего не ловит?

если я использую такой способ тогда вываливается ошибка про безопасность:

mul.addEventListener(Event.COMPLETE, onLoaderComplete);
mul.addFile(ba, "file1.png", "file1", 'image/png');
mul.load(url);

а с приведенным в самом начале нет.

И вообще можно ли как нибудь обойтись без действий пользователя?

alatar
04.07.2011, 19:19
а почему try catch ничего не ловит?
try catch ничего и не словит на асинхронной операции.
И вообще можно ли как нибудь обойтись без действий пользователя?
К счастью нет.

kiloT
04.07.2011, 19:37
Спасибо за разъяснения.

Добавлено через 15 минут
Делаю так:
mul.addEventListener(Event.COMPLETE, onLoaderComplete);
mul.addFile(ba, "file1.png", "file1", 'image/png');

world.addEventListener(MouseEvent.CLICK, function load(e:Event):void {
try{
mul.load(url);
}catch (e:Error) {
new MessageWindow("ERROR", e.message).show();
}
}
);
Но все равно глухо как в танке. Вообще кто нибудь отправлял фотографии в альбом?:)