Почему байтовый массив JPGEncoded отправляется из AS3 в AMFPHP, что приводит к недопустимому изображению?

Я загружаю изображения во Flash и использую JPGEncoder для кодирования изображения в ByteArray и отправки его в AMF PHP, который записывает байтовый массив в файл. Все это работает правильно, и я могу абсолютно нормально загрузить полученный файл в Photoshop CS4. Когда я пытаюсь открыть его с рабочего стола или открыть обратно во Flash, он не работает... Picasa, мой браузер изображений по умолчанию, говорит "Недействительно"

Вот код, который я использую для записи массива байтов в файл:

$jpg = $GLOBALS["HTTP_RAW_POST_DATA"]; file_put_contents($filename, $jpg);

Вот и все... Я использую класс NetConnection для подключения и вызова службы, нужно ли говорить, что я отправляю данные в формате jpg? Я предположил, что JPGEncoder позаботится об этом. Как я могу проверить байтовый массив перед записью файла? Нужно ли устанавливать тип MIME или что-то в этом роде?

Спасибо - вот код:

item.load();
function _onImageDataLoaded(evt:Event):void {
  var tmpFileRef:FileReference=FileReference(evt.target);
  image_loader=new Loader  ;
  image_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onImageLoaded);
  image_loader.loadBytes(tmpFileRef.data);
}
function _onImageLoaded(evt:Event):void {
bitmap=Bitmap(evt.target.content);
bitmap.smoothing=true;
if (bitmap.width>MAX_WIDTH||bitmap.height>MAX_HEIGHT) {
  resizeBitmap(bitmap);
}
    uploadResizedImage(bitmap);
}
function resizeBitmap(target:Bitmap):void {
    if (target.height>target.width) {
        target.width=MAX_WIDTH;
        target.scaleY=target.scaleX;
    } else if (target.width >= target.height) {
        target.height=MAX_HEIGHT;
        target.scaleX=target.scaleY;
    }

}
function uploadResizedImage(target:Bitmap):void {
    var _bmd:BitmapData=new BitmapData(target.width,target.height);
    _bmd.draw(target, new Matrix(target.scaleX, 0, 0, target.scaleY));
    var encoded_jpg:JPGEncoder=new JPGEncoder(90);
    var jpg_binary:ByteArray=encoded_jpg.encode(_bmd);
    _uploadService=new NetConnection();
    _uploadService.objectEncoding=ObjectEncoding.AMF3
    _uploadService.connect("http://.../amfphp/gateway.php");
    _uploadService.call("UploadService.receiveByteArray",new Responder(success, error), jpg_binary, currentImageFilename);

 }

person undefined    schedule 08.06.2009    source источник
comment
Я не мог заставить это работать! :( ... так что теперь я отправляю изображение на обычную старую PHP-страницу, которая записывает файл без проблем... :)   -  person undefined    schedule 10.06.2009


Ответы (1)


Ваша проблема в вашем PHP-сервисе. В AMFPHP данные POST абстрагированы, поэтому в сценарии UploadService для AMFPHP вам нужна функция, которая принимает два входных аргумента в вашем _uploadService.call --jpg_binary и currentImageFilename--, например:

<?php
class UploadService {

     function receiveByteArray( $ba, $filename ) {

          $result = file_put_contents($filename, $ba->data);
          if ( $result == FALSE ) {
              trigger_error( "File save failed" );
          }
     }
}
?>
person bob quinn    schedule 27.10.2009