Как я могу отправить ByteArray (из Flash) и некоторые данные формы в php?

У меня есть эскизная панель, сделанная во Flash AS3, как здесь: http://henryjones.us/articles/using-the-as3-jpeg-encoder

Я хочу отправить jpg на сервер и некоторые данные из поля формы html с php. Есть ли способ заставить Flash-фильм доставлять файл изображения при нажатии кнопки отправки?

Ответ 1

Это немного сложно: вы можете сделать это одним из двух способов:

Артем опубликовал это в другом потоке:

Это очень помогло мне: http://www.quietless.com/kitchen/upload-bitmapdata-snapshot-to-server-in-as3/

Вам необходимо изменить URLRequestWrapper для вставки поля имена и имена файлов, где это необходимо. Вот что я сделал:

bytes = 'Content-Disposition: форм-данных; name= "'+ $fieldName +'"; имя файла = "";

Он делает большинство форматирования заголовков поэтому сервер мог понять это как загрузка файла.

Кстати, если у вас есть BitmapData вам может потребоваться кодировать его в формате JPEG или Сначала PNG.

И я обычно использую это решение:

Я не использовал API-интерфейс imageshack, но вы можете попробовать использовать класс adobe JPGEncoder - вот быстрый пример, который передает имя пользователя и массив байтов JPG, это действительно довольно просто.

private function savePicToServer(bmpData:BitmapData):void
{
    var jpgEncoder:JPGEncoder = new JPGEncoder(85);
    var jpgStream:ByteArray = jpgEncoder.encode(bmpData);

    var loader:URLLoader = new URLLoader();
        configureListeners(loader);

    var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
    var request:URLRequest = new URLRequest(ModelLocator.BASE_URL + ModelLocator.UPLOAD_URL + "?user=" + ModelLocator.getInstance().username);
    request.requestHeaders.push(header);
    request.method = URLRequestMethod.POST;
    request.data = jpgStream;
    loader.load(request);
}

Обратите внимание, что переменные передаются как часть строки запроса. Вы не можете использовать URLVariables, как предложили несколько человек, поскольку URLVariables будут храниться в свойстве данных запроса, которое мы уже используем для передачи byteArray.

Ответ 2

Я хотел отправить зашифрованную форму кода авторизации Flash на PHP вместе с JPG-изображением. Невозможно было опубликовать это в переменных get, и поэтому я обошел его таким образом. Большая часть кода - это фактический сбор моментального снимка сцены, но только конкретный его регион. Часть, которая здесь имеет значение, - это использование writeMultiByte для привязки к зашифрованному паролю в конце информации об изображении jpb. Затем я отправляю длину этого пароля, используя строку URL-адресов get variables, чтобы PHP знал, что очень сильно отрубается.

var stage_snapshot:BitmapData = new BitmapData(600, 120);
var myRectangle:Rectangle = new Rectangle(0, 0, 600, 120);
var myMatrix:Matrix = new Matrix();
var translateMatrix:Matrix = new Matrix();
translateMatrix.translate(-101, -33);
myMatrix.concat(translateMatrix);
stage_snapshot.draw(stage,myMatrix,null,null,myRectangle);
trace ("creating JPGEncoder");
// Setup the JPGEncoder, run the algorithm on the BitmapData, and retrieve the ByteArray
var encoded_jpg:JPGEncoder = new JPGEncoder(100);
var jpg_binary:ByteArray = new ByteArray();
jpg_binary = encoded_jpg.encode(stage_snapshot);
var pw = cryptoSalt.encrypt("mysecretpassword");
**var pwLength = pw.length;
jpg_binary.writeMultiByte(pw,"us-ascii");**
trace ("stage snapshot taken");
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
var request:URLRequest = new URLRequest("savejpg.php?length1=" + pwLength);
request.requestHeaders.push(header);
request.method = URLRequestMethod.POST;
request.data = jpg_binary;
var loader:URLLoader = new URLLoader();
trace ("sending pic to php");
loader.load(request);
loader.addEventListener(Event.COMPLETE,finishSave);

Получающий PHP:

$pwlength = $_GET['length1'];
$jpg = $GLOBALS["HTTP_RAW_POST_DATA"];
$pw = substr($jpg, - $pwlength);
$jpg = substr($jpg,0,strlen($jpg) - $pwlength);
$filename = 'uploads/test.jpg';
file_put_contents($filename, $jpg);
file_put_contents("uploads/pw.txt",$pw);

Ответ 3

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

Ответ 4

Если вы не используете flex, попробуйте URLLoader && URLrequest, чтобы передать ваши данные как переменную POST.

Ответ 5

Вы можете использовать AMFPHP или Zend AMF, я только что закончил такой проект, мой продукт позволяет пользователю изменять цветовую схему продукта, а затем выводить данные ByteArray и другой объект AS3 непосредственно на PHP и вставлять в MySQL, вы может увидеть мой проект и AMFPHP

все прозрачные изображения PNG генерируются Flash и отправляются в AMFPHP, затем PHP генерирует PNG файл на сервере.