Как загрузить объект BitmapData прямо на мой сервер?

Я хочу загрузить с моего Flash-приложения (AS3) в imageshacks XML API. Я хочу знать, как я могу это сделать.

«В Flash мы должны выполнить POST-данные с использованием классов UrlRequest и UrlLoader, однако мы сталкиваемся с ограничением Flash API. Свойство данных UrlRequest может быть либо объектом UrlVariablesByteArray, либо нет простого способа отправить пары значений имени наряду с массивом байтов JPG. Это большая проблема, поскольку для большинства загружаемых приложений требуется имя файла и другие заголовки для сопровождения необработанных файлов данных "

Я надеялся, что кто-то поможет мне преодолеть это!

Спасибо всем

Обновить

Я попытался использовать этот учебник здесь: http://www.mikestead.co.uk/2009/01/04/upload-multiple-files-with-a-single-request-in-flash/

Проблема заключается не в несохраненных изображениях, а в том, чтобы получать изображения с вашего локального компьютера, а затем загружать их на сервер, на котором у изображений уже есть имя!

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

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

bytes = 'Content-Disposition: form-data; name="' + $fieldName + '"; filename="'; 

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

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

С уважением, Артем

Вы можете отправить данные своего имени и любые другие данные, которые вы хотите, вместе с URLRequest:

 var params:URLVariables = new URLVariables(); params.id = ride.id; params.filename = ride.map_image; params.path = 'maps/'; var req:URLRequest = new URLRequest( ModelLocator.SERVER_URL + "/php/uploadpic.php"); req.method = URLRequestMethod.GET; req.data = params; fileRef.upload(req); 

на стороне сервера в php вы получаете дополнительные переменные: $ _REQUEST ['path'] и $ _REQUEST ['filename'] и т. д.

Я не использовал API-интерфейс imageshack, но ранее я отправил BitmapData на сервер.

Вам нужно создать URLRequest и добавить bitmapData как byteArray, поэтому код, я думаю, будет выглядеть примерно так:

 var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");//this says the data your sending is binary, not text var uploadRequest:URLRequest = new URLRequest('yourImageShackUploadURL.php'); uploadRequest.requestHeaders.push (header); uploadRequest.method = URLRequestMethod.POST; uploadRequest.data = yourBitmapData.getPixels(yourBitmapData.rect); sendToURL( uploadRequest); 

Возможно, вам понадобится следующий импорт:

 import flash.net.* // for sendToURL and other net stuff import flash.geom.Rectangle; import flash.display.BitmapData; 

Вы получаете ByteArray из вашего bitmapData, используя метод getPixels () BitmapData. Для того, чтобы узнать нужную позицию и размеры, нужен экземпляр Rectangle, но если вы хотите, чтобы ByteArray для всех BitmapData, а не только его части, вы можете использовать свойство rect BitmapData. Вы создаете заголовок, используя класс URLRequestHeader, и вы вводите его в requestHeaders вашего URLRequest. Вы указываете свой метод post, используя свойство метода.

Это должно быть. Я не знаю ни одного другого конкретного API-интерфейса, поэтому надеюсь, что это поможет.

Удачи!

В любом случае, я действительно не задаю проблему вопроса. Если вопрос заключается в том, как отправить имя файла и расширение (тип изображения) из флешки в файл с байтом массива данных изображения, вы должны использовать объект URLVariables.

Этот объект также может отправлять строку запроса в виде байта вместо текста.

 var request:URLRequest = new URLRequest(); request.url = "your_server_page_for_example.php"; request.method = URLRequestMethod.POST; var variables:URLVariables = new URLVariables(); variables.name = "imgName"; variables.type = ".jpg"; variables.image = myByteArray; request.data = variables; 

Я не использовал 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.

Вы можете использовать URLVariables, просто base64-encode bytearray, так что это не двоичные данные:

 import mx.utils.Base64Encoder; // ... var urlRequest:URLRequest = new URLRequest("/whatever"); urlRequest.method = URLRequestMethod.POST; var urlVariables:URLVariables = new URLVariables(); var base64Encoder:Base64Encoder = new Base64Encoder(); base64Encoder.encodeBytes(byteArray); urlVariables.something_base64 = base64Encoder.toString(); urlRequest.data = urlVariables; navigateToURL(urlRequest, "_blank"); 

затем на стороне базы base64decode '' поле post, то есть:

PHP:

 base64_decode($_POST['something_base64']) 

рельсы:

 require 'base64'; # ... Base64.decode64(params[:something_base64]) 

Просто мои 2 цента для всех тех, кто здесь, чтобы найти PHP-версию upload.php. Если вы пробовали HTTP_RAW_POST_DATA, и он не сработал, попробуйте file_get_contents («php: // input»);

это сработало для меня

 $data = file_get_contents("php://input"); file_put_contents("filename",$data);