Как загрузить объект BitmapData прямо на мой сервер? - PullRequest
5 голосов
/ 18 апреля 2009

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

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

Я надеялся, что кто-нибудь поможет мне преодолеть все вышеперечисленное!

Спасибо всем

Обновление

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

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

Ответы [ 7 ]

4 голосов
/ 23 апреля 2009

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

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

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

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

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

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

2 голосов
/ 24 апреля 2009

Вы можете отправить данные вашего имени файла и любые другие данные, которые вы хотите вместе с 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'] etc

0 голосов
/ 25 февраля 2012

Просто мои 2 цента всем тем, кто здесь, чтобы найти реализацию php файла upload.php. Если вы пробовали HTTP_RAW_POST_DATA и это не помогло, попробуйте file_get_contents ("php: // input");

у меня сработало

$data = file_get_contents("php://input");
file_put_contents("filename",$data);
0 голосов
/ 23 сентября 2009

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

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 '' на стороне сервера, то есть:

PHP:

base64_decode($_POST['something_base64'])

рельсы:

require 'base64';
# ...
Base64.decode64(params[:something_base64])
0 голосов
/ 22 апреля 2009

Я все равно не понимаю проблемы вопроса: Если вопрос заключается в том, как отправить имя файла и расширение (тип изображения) из флэш-памяти вместе с byteArray данных изображения, вам следует использовать объект 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;
0 голосов
/ 22 апреля 2009

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

0 голосов
/ 18 апреля 2009

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

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

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 вещей, поэтому надеюсь, что это поможет.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...