设为首页 收藏本站
查看: 1596|回复: 0

[经验分享] as3+php上传图片的三种方式

[复制链接]

尚未签到

发表于 2015-8-23 05:25:38 | 显示全部楼层 |阅读模式
  这里的三种方式分别为:
  1、二进制传输(BINARY)
  2、字符串传输(String)
  3、文件流上传(File)
  
  开发IDE:FlashDevelop、Zend Studio。
  1)设置FlashDevelop使用flash player10(debug版本,因为有一个demo使用了本地预览)
  “工具”菜单 –》 “软件设置”(快捷键F10)—》 点击左侧的“AS3Context”,在Language中的“Default Flash Version”修改为10,选择Player Debug 的路径
DSC0000.png
DSC0001.png
  2、因为在flashDevelop中使用到了fl组件,所以需要先下载fl.swc,可以在google code上下载的到,下载链接地址>>  (关于在flashdevelop中如何使用swc,可以gg一下)
  3、使用到了Adobe的官方组件PNGEncoder,google code上的下载地址>>
  4、使用到了as3的base64Encode,google code上的链接地址>>
  
  
  一、使用二进制上传图片
  完整的as3代码:
  
   package
{
    import com.adobe.images.JPGEncoder;
    import com.adobe.images.PNGEncoder;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import fl.controls.Button;
    import flash.events.MouseEvent;
    import flash.filters.GlowFilter;
    import flash.net.*;
    import flash.filters.BitmapFilterQuality;
    import flash.utils.ByteArray;
    /**
     * ...
     * @author ZhangYi
     */
    public class Main extends Sprite
    {
        private var _base:Shape;
        private var _btn:Button;
        private var _loader:Loader;
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            inited();
        }
        private function inited():void {
            var mc:MovieClip = new MovieClip();
                mc.graphics.beginFill(0x000000, 0.2);
                mc.graphics.drawRect(0, 0, 320, 455);
                mc.x = 30;
                mc.y = 60;
            addChild(mc);
            _loader = new Loader();
            _loader.load(new URLRequest("../assets/1.png"));
            mc.addChild(_loader);
            _loader.addEventListener(MouseEvent.ROLL_OVER, addFilterHandler);
            _loader.addEventListener(MouseEvent.ROLL_OUT, removeFilterHandler);
            _btn = new Button();
            _btn.label = "截图";
            _btn.x = 30;
            _btn.y = 30;
            addChild(_btn);
            _btn.addEventListener(MouseEvent.CLICK, clickHandler);
        }
        private function clickHandler(evt:MouseEvent):void {
            var bitmapData:BitmapData = new BitmapData(_loader.width, _loader.height, true, 0);
                bitmapData.draw(_loader);
            //var encoder:JPGEncoder = new JPGEncoder(100);
            //var bytes:ByteArray = encoder.encode(bitmapData);
            var bytes:ByteArray = PNGEncoder.encode(bitmapData);
            var req:URLRequest = new URLRequest("http://meteoric.com/test/uploadFile/upload_1.php");
                req.data = bytes;
                req.method = URLRequestMethod.POST;
                req.contentType = "application/octet-stream";
            var loader:URLLoader = new URLLoader();
                loader.dataFormat = URLLoaderDataFormat.BINARY;
                loader.load(req);
                loader.addEventListener(Event.COMPLETE, completeHandler);
        }
        private function completeHandler(evt:Event):void {
            trace(evt.target.data);
        }
        private function addFilterHandler(evt:MouseEvent):void {
            var filtersArr:Array = new Array();
            filtersArr = _loader.filters;
            filtersArr.push(getBitmapFilter());
            _loader.filters = filtersArr;
        }
        private function removeFilterHandler(evt:MouseEvent):void {
            _loader.filters = null;
        }
        private function getBitmapFilter():GlowFilter {
            var color:Number = 0xFF0000;
            var alpha:Number = 1;
            var blurX:Number = 5;
            var blurY:Number = 5;
            var strength:Number = 4;
            var inner:Boolean = false;
            var knockout:Boolean = false;
            var quality:Number = BitmapFilterQuality.LOW;
            return new GlowFilter(color, alpha, blurX, blurY, strength, quality, inner, knockout);
        }
    }
}

  
  后台php的代码:



<?php
    $filename=&quot;teststream.jpg&quot;;//要生成的图片名字
    $xmlstr =  $GLOBALS[HTTP_RAW_POST_DATA];
    if(empty($xmlstr)) {
        $xmlstr = file_get_contents('php://input');
    }
    $jpg = $xmlstr;//得到post过来的二进制原始数据
    $file = fopen(&quot;image/&quot;.$filename,&quot;w&quot;);//打开文件准备写入
    fwrite($file,$jpg);//写入
    fclose($file);//关闭
    echo &quot;ok~~~&quot;;
?>


  
  运行后,可以在相应的目录中看到图片已经上传成功了,如下图所示:
DSC0002.png
  
DSC0003.png
  以下说明转载至<as3传byteArray,php接二进制文件>
  PHP默认只识别application/x-www.form-urlencoded标准的数据类型。
  因此,对型如text/xml 或者 soap 或者 application/octet-stream 之类的内容无法解析,如果用$_POST数组来接收就会失败!
故保留原型,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。
  另外还有一项 php://input 也可以实现此这个功能
  php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input和 $HTTP_RAW_POST_DATA 不能用于 enctype=”multipart/form-data”。’
  而在前台则使用JPGEncoder或是PNGEncoder将BitmapData转成二进制,使用post传给php
  
  二、使用字符串提交(采用Base64编码)
  as3代码:



package  
{
    import com.adobe.images.JPGEncoder;
    import com.adobe.images.PNGEncoder;
    import com.hurlant.util.Base64;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import fl.controls.Button;
    import flash.events.MouseEvent;
    import flash.filters.GlowFilter;
    import flash.net.*;
    import flash.filters.BitmapFilterQuality;
    import flash.utils.ByteArray;
    /**
     * ...
     * @author ZhangYi
     */
    public class Base64Test extends Sprite
    {
        private var _base:Shape;
        private var _btn:Button;
        private var _loader:Loader;
        public function Base64Test()
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            inited();
        }
        private function inited():void {
            var mc:MovieClip = new MovieClip();
                mc.graphics.beginFill(0x000000, 0.2);
                mc.graphics.drawRect(0, 0, 320, 455);
                mc.x = 30;
                mc.y = 60;
            addChild(mc);
            _loader = new Loader();
            _loader.load(new URLRequest(&quot;../assets/1.png&quot;));
            mc.addChild(_loader);
            _loader.addEventListener(MouseEvent.ROLL_OVER, addFilterHandler);
            _loader.addEventListener(MouseEvent.ROLL_OUT, removeFilterHandler);
            _btn = new Button();
            _btn.label = &quot;截图&quot;;
            _btn.x = 30;
            _btn.y = 30;
            addChild(_btn);
            _btn.addEventListener(MouseEvent.CLICK, clickHandler);
        }
        private function clickHandler(evt:MouseEvent):void {
            addFilterHandler();
            var bitmapData:BitmapData = new BitmapData(_loader.width, _loader.height, true, 0);
                bitmapData.draw(_loader);
            var bytes:ByteArray = PNGEncoder.encode(bitmapData);
            var pngString:String = Base64.encodeByteArray(bytes);
            var variables:URLVariables = new URLVariables();
                variables.png = pngString;
                variables.name = &quot;photo002&quot;;
            var req:URLRequest = new URLRequest(&quot;http://meteoric.com/test/uploadFile/upload_2.php&quot;);
                req.data = variables;
                req.method = URLRequestMethod.POST;
            var urlloader:URLLoader = new URLLoader();
                urlloader.dataFormat = URLLoaderDataFormat.VARIABLES;
                urlloader.addEventListener(Event.COMPLETE, completeHandler);
                urlloader.load(req);
            trace(pngString);
        }
        private function completeHandler(evt:Event):void {
            trace(evt.target.data);
        }
        private function addFilterHandler(evt:MouseEvent=null):void {
            var filtersArr:Array = new Array();
            filtersArr = _loader.filters;
            filtersArr.push(getBitmapFilter());
            _loader.filters = filtersArr;
        }
        private function removeFilterHandler(evt:MouseEvent):void {
            _loader.filters = null;
        }
        private function getBitmapFilter():GlowFilter {
            var color:Number = 0xFF0000;
            var alpha:Number = 1;
            var blurX:Number = 5;
            var blurY:Number = 5;
            var strength:Number = 4;
            var inner:Boolean = false;
            var knockout:Boolean = false;
            var quality:Number = BitmapFilterQuality.LOW;
            return new GlowFilter(color, alpha, blurX, blurY, strength, quality, inner, knockout);
        }
    }
}

  后台php代码:



<?php
function base64_to_png($inputfile, $outputfile ) {
    $imageData = $inputfile;
    $file = fopen( $outputfile, &quot;w&quot; );
    fwrite( $file, base64_decode( $imageData ) );
    fclose($file);
}
base64_to_png(&quot;&quot;.$_POST['png'], &quot;image/&quot;. $_POST[&quot;name&quot;] . &quot;.png&quot;);
print &quot;info=ok!!&quot;;
?>


  
  
  
DSC0004.png
  控制台上可以看到将bitmapdata转为字符串的结果:
DSC0005.png
  后台保存得到的图片:
DSC0006.png
  
  三、使用FileReference类进行上传
  as3代码:



package  
{
    import fl.controls.Button;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.DataEvent;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.BevelFilter;
    import flash.net.FileFilter;
    import flash.net.FileReference;
    import flash.net.URLRequest;
    import flash.utils.ByteArray;
    /**
     * ...
     * @author ZhangYi
     */
    public class FileReferenceUpload extends Sprite
    {
        private var _btn:Button;
        private var _fileRef:FileReference;
        private var _loader:Loader;
        public function FileReferenceUpload()
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            inited();
        }
        private function inited():void {
            _btn = new Button();
            _btn.label = &quot;选择图片&quot;;
            _btn.x = 100;
            _btn.y = 100;
            addChild(_btn);
            _btn.addEventListener(MouseEvent.CLICK, clickHandler);
            _loader = new Loader();
            _loader.x = 100;
            _loader.y = 150;
            addChild(_loader);
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, resizeImage);
        }
        private function resizeImage(evt:Event):void {
            var size:uint = 300;
            var w:Number = _loader.width;
            var h:Number = _loader.height;
            var scale:Number = w / h;
            if (w > h) {
                _loader.width = size;
                _loader.height = size / scale;
            } else if (h > w) {
                _loader.height = size;
                _loader.width = size * scale;
            } else {
                _loader.height = _loader.width = size;
            }
            var req:URLRequest = new URLRequest(&quot;http://meteoric.com/test/uploadFile/upload_3.php&quot;);
            _fileRef.upload(req);
        }
        private function getImageFilter():FileFilter {
            return new FileFilter(&quot;支持的图片类型(*.jpg;*.jpeg;*.gif;*.png)&quot;, &quot;*.jpg;*.jpeg;*.gif;*.png&quot;);
        }
        private function getFilterTypes():Array {
            return [
                getImageFilter(),
                new FileFilter(&quot;GIF 文件 (*.gif)&quot;, &quot;*.gif&quot;),
                new FileFilter(&quot;PNG 文件 (*.png)&quot;, &quot;*.png&quot;),
                new FileFilter(&quot;JPG 文件 (*.jpg)&quot;, &quot;*.jpg;*.jpeg&quot;)
            ];
        }
        private function clickHandler(evt:MouseEvent):void {
            _fileRef = null;
            _fileRef = new FileReference();
            _fileRef.addEventListener(Event.SELECT, selectHandler, false, 0, true);
            _fileRef.addEventListener(Event.COMPLETE, onloadedHandler, false, 0, true);
            _fileRef.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadImageCompleteHandler, false, 0, true);
            _fileRef.browse(getFilterTypes());
        }
        private function selectHandler(evt:Event):void {
            _fileRef.removeEventListener(Event.SELECT, selectHandler);
            _fileRef.load();
        }
        private function onloadedHandler(evt:Event):void {
            _fileRef.removeEventListener(Event.COMPLETE, onloadedHandler);
            _loader.loadBytes(_fileRef.data);
        }
        private function uploadImageCompleteHandler(evt:DataEvent):void {
            trace(evt.data);
            _fileRef.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadImageCompleteHandler);
            _fileRef = null;
        }
    }
}

  后台php代码:



<?php
if ($_FILES [&quot;Filedata&quot;] [&quot;error&quot;] > 0) {
    exit(&quot;Error: &quot; . $_FILES [&quot;Filedata&quot;][&quot;error&quot;]);
}
$fileName = iconv(&quot;utf-8&quot;,&quot;gb2312&quot;, $_FILES [&quot;Filedata&quot;][&quot;name&quot;]);
$reallyName = &quot;image/&quot;.$fileName;
if (file_exists ($reallyName)) {
    unlink($reallyName);
}
     
     if (!is_dir(&quot;upload&quot;)) {
         mkdir(&quot;upload&quot;);
     }
   move_uploaded_file( $_FILES [&quot;Filedata&quot;][&quot;tmp_name&quot;],  $reallyName);
   echo &quot;Stored in: &quot; . &quot;image/&quot; . $fileName;
?>



程序运行后的效果(对预览图片进行了等比压缩处理,可以在列出的图中看出原图很大):  
DSC0007.png
DSC0008.png
DSC0009.png
  
  
  
  
  
  
  
  
  
  
  
  以上三种方式,在不同的场景下面可能应用不太一样,比如第二种,使用编码后的字符串方式进行传输的,这样就可以通过socket通道传输数据了(虽然这很浪费而且耗费带宽,环境允许的话还是应该优先考虑使用web接口进行处理)。针对不同的上传方式,后台处理各不一样,可以看到上面的三个php写的都不一样。
  
  在Flex中,可以使用内置的一些类、方法将bitmapdata转化为字符串,在线例子:converting-an-imagesnapshot-object-into-a-base-64-encoded-string-in-flex-3
  
  用到的类也比较简单(ImageSnapshot中的encodeImageAsBase64、captureImage):




private function getBase64StringFromBody():String
{
            var _matrix:Matrix = new Matrix(1,0,0,1,0,0);
                _matrix.scale(1,1);
            var bitmapData:BitmapData = new BitmapData(320,455,true,0);
            bitmapData.draw(photoEditContainer, _matrix);
            var bt:Bitmap = new Bitmap(bitmapData,&quot;auto&quot;,true);
            var tempCan:Canvas = new Canvas();
            tempCan.rawChildren.addChild(bt);
            _matrix = new Matrix(1,0,0,1,0,0);
            bitmapData = new BitmapData(320,455,true,0);
            bitmapData.draw(tempCan,_matrix);
            var codeStr:String = ImageSnapshot.encodeImageAsBase64( ImageSnapshot.captureImage( bitmapData ) );
            tempCan.rawChildren.removeChild(bt);
            bitmapData.dispose();
            bitmapData = null
            return codeStr;
}


  
  
  提供本文中所有as3的源代码下载,后台可以用自己熟悉的任何一门语言写写就好:java、.net、python或是其它…

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-102773-1-1.html 上篇帖子: paypal php 对接 下篇帖子: 彻底理解PHP的SESSION机制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表