Flash -> ByteArray -> AMFPHP -> Неверное изображение? - PullRequest
0 голосов
/ 05 июня 2009

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

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

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

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

Спасибо

--------------------------------------- ЧАСТЬ II ------ ------------------------------------

Вот код -

1) загрузить изображение во Flash player

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);

 }

Большое спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 27 октября 2009

Ваша проблема в вашем сервисе PHP. В AMFPHP данные POST абстрагированы, поэтому в скрипте AMFPHP UploadService вам нужна функция, которая принимает два входных аргумента в вашем _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" );
          }
     }
}
?>
0 голосов
/ 25 марта 2010
var dataToBeSent:ByteArray =jpgEncoder.encode(theBitmapData);
var url:String = "upload.php";
var urlReq:URLRequest = new URLRequest(url);
urlReq.data = dataToBeSent;
urlReq.method = URLRequestMethod.POST;
urlReq.contentType = "application/octet-stream";
var urlLoader:URLLoader = new URLLoader();
urlLoader.load(urlReq);

Пожалуйста разум строка contentType

PHP

$fp = fopen( $fname, "wb" );
fwrite( $fp, $GLOBALS[ 'HTTP_RAW_POST_DATA' ] );
fclose( $fp );

Для меня это работает отлично!

Оливер

0 голосов
/ 05 июня 2009

вы можете проверить тип байтов байтов? возможно, по умолчанию используется big endian

...