【问题标题】:Flash -> ByteArray -> AMFPHP -> Invalid Image?Flash -> ByteArray -> AMFPHP -> 无效图像?
【发布时间】:2009-06-05 15:07:18
【问题描述】:

我将图像加载到 Flash 中并使用 JPGEncoder 将图像编码为 ByteArray 并将其发送到 AMF PHP,后者将 bytearray 写入文件。这一切似乎都可以正常工作,我可以在 Photoshop CS4 中下载生成的文件绝对没问题。当我尝试从桌面打开它或在 Flash 中打开它时,它不起作用... Picasa 我的默认图片浏览器显示“无效”

这是我用来将字节数组写入文件的代码 -

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

就是这样...我使用NetConnection类连接和调用服务,我需要说我发送jpg数据吗?我认为 JPGEncoder 会解决这个问题。如何在写入文件之前验证字节数组?我是否需要设置 MIME 类型或其他东西.. 请原谅有点菜鸟的问题,一点知识可能是一件危险的事情。

谢谢

--------------------------------------- 第二部分 ------ ------------------------------------

这是一些代码 -

1) 将图片加载到 Flash 播放器中

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

 }

非常感谢您的帮助

【问题讨论】:

  • 所以在AMF服务器上无效?你是如何使用 JPGEncoder 的?您可以为每个步骤显示一些代码吗?图片的来源是什么格式?您是在 Flash 中将其创建为 BitmapData 吗?我猜它很早就搞砸了,因为 ByteArray 只是字节,如果你只是将它们写入文件,那么不会出错。
  • 嗨 - 我已经编辑了原始问题以包含一些代码。谢谢kekoav

标签: actionscript-3 encoding bytearray jpeg amfphp


【解决方案1】:

你能检查字节数组的字节序类型吗?也许它默认为大端

【讨论】:

  • 我会检查谢谢,你能解释一下为什么会导致问题吗?欢呼
  • 是的,endian = bigEndian。我试过 littleEndian (jpg_binary.endian = Endian.LITTLE_ENDIAN;) 但仍然遇到问题。奇怪的是,photoshop 可以正常打开图片,但 Flash、picassa 和 windows 图像查看器等不能。
  • 我最近在我的项目中编写了一些动作脚本并遇到了一个错误(无法正确读取二进制数据),直到我意识到这是错误的字节顺序(默认为大端)。
  • BigEndian 解决了问题吗?你在哪里发现和我一样?
【解决方案2】:

您的问题出在您的 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" );
          }
     }
}
?>

【讨论】:

    【解决方案3】:
    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 );
    

    对我来说效果很好!

    奥利弗

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 2016-08-15
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      相关资源
      最近更新 更多