2009-06-05 2 views
0

Im загружает изображения во Flash и использует JPGEncoder для кодирования изображения в ByteArray и отправляет его в AMF PHP, который записывает bytearray в файл. Кажется, что все это работает правильно, и я могу загрузить полученный файл в Photoshop CS4 абсолютно нормально. Когда я пытаюсь открыть его с рабочего стола или открыть его обратно в Flash, он не работает ... Picasa мой браузер изображений по умолчанию говорит «Invalid»Flash -> ByteArray -> AMFPHP -> Недопустимое изображение?

Вот код, я использую, чтобы написать ByteArray в файл -

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

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

Благодаря

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

Вот несколько кодов -

1) загрузить изображение в флэш-плеер

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

} 

Большое спасибо вам помочь

+0

Значит, это неверно на сервере AMF? Как вы используете JPGEncoder? Можете ли вы показать код для каждого шага? В каком формате находится изображение? Вы создаете его во flash-качестве BitmapData? Я бы предположил, что это запуталось на ранней стадии, так как ByteArray - это просто байты, и если вы просто напишете их в файл, мало что может пойти не так. – Kekoa

+0

Привет - Ive отредактировал оригинальный вопрос, чтобы включить некоторый код. Спасибо kekoav – undefined

ответ

0

можете ли вы проверить тип конца bytearray? возможно, он по умолчанию имеет большой аргумент

+0

Я проверю спасибо, не могли бы вы объяснить, почему это вызвало бы проблему? ура – undefined

+0

Да, endian = bigEndian. Ive попробовал littleEndian (jpg_binary.endian = Endian.LITTLE_ENDIAN;), но все равно возникают проблемы. Странно, что Photoshop может открыть изображение в порядке, но Flash, picassa и windows view viewer и т. Д. Не могут. – undefined

+0

Я недавно написал некоторые actionscript в моем проекте и столкнулся с ошибкой (не смог прочитать двоичные данные правильно) до тех пор, пока не понял, что это неправильный порядок байтов (по умолчанию используется большой endian). –

0

Ваша проблема в вашей службе 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
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); 

Для меня это прекрасно работает!

Oliver

Смежные вопросы