2016-04-22 3 views
0

У меня из приложения AS3 AIR, чтобы отправить изображение, помимо остальных параметров POST, в PHP-скрипт, который сделает все остальное. Я хочу как-то преобразовать массив байтов с изображением в строку и закодировать его с base64. Я был успешным, но данные изображения ошибочны.Как отправить массив байтов с изображением с AS3 на PHP?

Вот код, который я использовал, чтобы преобразовать его:

... 
//BA1 is Byte Array with an image in it 
var data:String = BA1.toString(); 
OutSql.push({t: "b1", v: Base64.encode(data)}); 
... 

Все работает отлично, эти данные отправляются на сервер, декодируются и сохраняются в виде изображения, но изображение не так. Так или иначе, это около 40 кб, а когда я сохраняю его в приложении Air, это 22 кб. Есть идеи?

p.s. Я знаю, что я могу сохранить его локально и загрузить его, но мне действительно нужно это сделать. Кроме того, BA1.readUTF() генерирует ошибку, поэтому не вариант.

Добавление:

На стороне сервера я попытался utf8_decode строку перед записью в файл, и каким-то образом я получил изображение, которое правильные размеры, но ... это изображение не то, что я хотел быть, это похоже на каракули ...

+1

делает 'BA1' содержат данные jpeg или png или просто raw bitmapData (используется 'getPixels();' для байтов)? Если его уже jpg/png использует «Base64.encode (BA1)», тогда сам B64 даст вам закодированную строку из байтов. Во всяком случае, ваш размер составляет 40kb (от 22kb), потому что вы использовали 'toString'. Рассмотрим два байта ** 0xFF ** и ** 0xD8 ** (общий размер 2) теперь как строка ** FFD8 **, которая является общим размером 4. Преобразование удваивает размер. Если возможно, просто выполните «trace» («bytes are:» + BA1), «тогда покажите мне здесь первые 8 букв байтов BA1. Легче оценить формат таким образом ... –

+0

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

+1

Вот ответ для трассы: 'байты: ÿØÿàJFIFÿÛ' , который выглядит как хороший заголовок jpeg. Но остальные данные просто перепутаны. Изображение siye верно, кстати. –

ответ

3
import com.sociodox.utils.Base64; 
..... 
//BA1 is ByteArray with an image encoded 
var enc_image=Base64.encode(BA1); 
var loader:URLLoader = new URLLoader(); 
loader.dataFormat = URLLoaderDataFormat.TEXT; 
var request:URLRequest = new URLRequest("some.php"); 
var variables:URLVariables = new URLVariables(); 
variables.decode("image="+enc_image); 
request.method = URLRequestMethod.POST; 
request.data = variables; 
loader.load(request); 

конечно, установить слушателей тоже ...

в "some.php":

$imageData = base64_decode(str_replace(" ", "+", $_POST['image'])); 
$fh = fopen("path/to/image/somename.jpg", "wb"); 
fwrite($fh, $imageData); 
fclose($fh); 

Это работает как шарм :)

1

Soultion found. Я загрузил с http://www.sociodox.com/base64.html Base64.swc, который на самом деле кодирует и декодирует изображение Byte Arrays. И поскольку моя строка была JSON-ed (как часть объекта, отправленного на PHP), мне приходилось только преобразовывать пробелы в '+' и декодировать его и записывать в файл - отлично работает! Дело закрыто.