Как загрузить BitmapData на сервер (ActionScript 3)?

У меня есть растровые данные. Я хочу загрузить его на сервер с помощью URLLoader. Пробовал много способов, но безрезультатно. Это мой текущий код в ActionScript 3:

import flash.net.URLLoader;
import flash.net.URLRequest;
import mx.graphics.codec.JPEGEncoder;
...
var jpg:JPEGEncoder = new JPEGEncoder();
var myBytes:ByteArray = jpg.encode(bitmapData);
var uploader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("uploadFile.php");
request.contentType = "application/octet-stream";
request.data = myBytes;
uploader.load(request);

Я беру объект bitmapData и кодирую его в jpg. После этого пытаюсь отправить jpg-байты в файл "uploadFile.php" на сервере. Но нет ни ошибок, ни положительного результата. Буду признателен за любые предложения/советы.


person serg66    schedule 13.01.2012    source источник


Ответы (2)


Это код AS3, который я использовал для этого раньше — он делает запрос POST с двоичными данными в теле запроса:

var url_request:URLRequest = new URLRequest();
url_request.url = "http://server.com/upload.php";
url_request.contentType = "binary/octet-stream";
url_request.method = URLRequestMethod.POST;
url_request.data = myByteArray;
url_request.requestHeaders.push(
 new URLRequestHeader('Cache-Control', 'no-cache'));

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
// attach complete/error listeners
loader.load(url_request);

Я заметил, что вы не устанавливаете .dataFormat в BINARY или .method в POST.

Обратите внимание, что это может быть проблема безопасности, с которой вы столкнулись. Я видел случаи, когда подобный код должен выполняться в ответ на действие пользователя (например, нажатие кнопки).

Вам также следует проверить журналы вашего сервера, чтобы узнать, поступает ли запрос на сервер. Обратите внимание, что без полного URL-адреса (начинающегося с http://) предполагается, что сервер обслуживает ваш PHP-файл из того же места, что и ваш SWF-файл.

person Jeff Ward    schedule 13.01.2012

Ваша кодировка изображения сломает его, потому что данные jpg содержат символы, отличные от ascii.
Изменение типа содержимого на "image/jpeg" должно исправить это, однако это утверждение не проверено.

Когда я отправляю JPG на сервер, я всегда сначала кодирую его в base64, а затем декодирую на стороне сервера.

import mx.utils.Base64Encoder;

var b64:Base64Encoder = new Base64Encoder()
b64.encodeBytes( myBytes )
var encodedb64.toString();

request.data = b64.toString();
person The_asMan    schedule 14.01.2012