У меня есть эскизный блок, сделанный во Flash AS3, как этот: http://henryjones.us/articles/using-the-as3-jpeg-encoder
Я хочу отправить jpg на сервер и некоторые данные из поля формы html с php. Есть ли способ заставить Flash-фильм доставлять файл изображения при нажатии кнопки отправки?
это немного сложно: вы можете сделать это одним из двух способов:
Arthem опубликовал это в другой теме:
Это очень помогло мне: http://www.quietless.com/kitchen/upload-bitmapdata-snapshot-to-server-in-as3/
Вам нужно изменить URLRequestWrapper, чтобы в случае необходимости вставлять имена полей и имена файлов. Вот что я сделал:
bytes = 'Content-Disposition: form-data; name = "'+ $ fieldName +'"; имя файла = "";
Он делает большинство форматирования заголовков, чтобы сервер мог понять его как загрузку файла.
Кстати, если у вас есть BitmapData, вам может понадобиться сначала закодировать его в формате JPEG или PNG.
И я обычно использую это решение:
Я не использовал API-интерфейс imageshack, но вы можете попробовать использовать класс JPGEncoder от adobe – вот краткий пример, который передает имя пользователя и массив байтов 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.
Я хотел отправить зашифрованную форму кода авторизации Flash на PHP вместе с изображением JPG. Невозможно было опубликовать это в переменных get, и поэтому я обошел его таким образом. Большая часть кода – это фактический сбор моментального снимка сцены, но только конкретный его регион. Часть, которая здесь имеет значение, – это использование writeMultiByte для привязки к зашифрованному паролю в конце информации об изображении jpb. Затем я отправляю длину этого пароля, используя строку ur переменных 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);
Вы можете использовать HTTPService для отправки данных. Вот введение в учебник.
Если вы не используете flex, попробуйте URLLoader && URLrequest, чтобы передать ваши данные как переменную POST.
Вы можете использовать AMFPHP или Zend AMF, я только что закончил такой проект, мой продукт позволяет пользователю изменять цветовую схему продукта, а затем выводить данные ByteArray и другой объект AS3 непосредственно на PHP и вставлять в MySQL, вы можете видеть мои проекта и AMFPHP
все прозрачные изображения PNG генерируются Flash и отправляются в AMFPHP, затем PHP генерирует PNG-файл на сервере.