Flash图片批量本地预览与上传实例

一直以来都梦想着做一个flash的东西出来,一直都没敢去尝试。

以前一段时间由于项目的需要,曾经对百度ueditor里的flash图片上传非常痴迷。

现在的情况可能很少遇到要使用flash的机会,但这依然打消不了我追求flash的热情。

这次这个效果一切以简单为主,一是因为没什么时间,而是as3技术水平决定了。

这次主要实现了以下几个功能:

1、本地批量预览

本地预览是flash9及as3开始提供的新功能,这也成为了它的一大特色,通过将读取的本地图片二进制话,从而实现了在flash上的图片预览效果。

另外计算每个图片块的位置也是令我头疼了好一会,每排只能排5张图片,排满了就得自动换行,这其中还包括添加按钮的排位。

flash不想html那样一个css样式表一下就批量解决了排序问题,flash中所有的元件都是绝对定位,所以这其中就得不断地取整取余。

2、自动滚动效果

flash的滚动也是其一大硬伤,当内容超过容器后就只能被遮挡。不过其还是提供了一个scrollRect属性供我们调用。

实现flash容器的滚动条拖动效果,需要监听舞台及滚动条的鼠标滚轮、上拉、下拉等事件。通过鼠标指针距离flash顶部的距离去计算滚动条及容器距离flash顶部的距离。

不过我测试了,我这个效果中还是存在一点点bug的地方,希望以后有时间改进。

3、批量上传

这次的批量上传我没有实现进度监控,以后有时间可以考虑加上。

这次为了实现form式的图片上传,需要借助一个工具类UploadPostHelper,它是帮助我们构造模拟file表单,然后将我们的图片二进制数据转换成file数据提交后台。

4、可配置服务

自定义配置是一个公共化组件的最低要求,我这次提供的配置相对较少,主要是一些非常重要的配置,以后可以稍微扩展一下。

 代码如下 复制代码

id: 'flash',//flash的name或者id
 container: 'flashContainer',//flash容器id
 flashUrl: /src/ImageUploader.swf',//flash地址
 width: 540,//flash宽度
 height: 340,//flash高度
 vars: {
 uploadUrl: /_examples/php/upload.php',//上传地址 php文件接受地址大家可自己写哦,这个很简单就不介绍了。
 fieldName: 'file',//提交时的表单名称
 selectFileCallback:"selectFileCallback",// 选择文件的回调
 exceedFileCallback:null,// 文件超出限制的最大体积时的回调
 startUploadCallback:null,// 开始上传某个文件时的回调
 uploadCompleteCallback:null,// 某个文件上传完成的回调
 uploadErrorCallback:null,// 某个文件上传失败的回调
 allCompleteCallback:"allCompleteCallback"// 全部上传完成时的回调
 }

我先发布部分源码,如果需要完整源码,请留言给我

 代码如下 复制代码

private function initMask():void
 {
 
_mask = new Sprite();
 _mask.graphics.beginFill(0x000000);
 _mask.graphics.drawRect(0,0,stage.stageWidth,stage.stageHeight);
 _mask.graphics.endFill();
 
_mask.alpha = 0.6;
 
_info = new TextField();
 _info.text = "图片正在上传中...";
 var tf:TextFormat = new TextFormat("宋体",16,0xff0000);
 _info.setTextFormat(tf);
 _info.x = (stage.stageWidth - _info.textWidth) / 2;
 _info.y = (stage.stageHeight - _info.textHeight) / 2;
 _info.autoSize = TextFieldAutoSize.CENTER;
 }
 private function initDesc():void
 {
 var desc:TextField = new TextField();
 desc.text = "copy right for 谢承雄.";
 var tf:TextFormat = new TextFormat("宋体",12,0xff0000);
 desc.setTextFormat(tf);
 desc.x = stage.stageWidth - desc.textWidth;
 desc.y = stage.stageHeight - desc.textHeight-10;
 desc.autoSize = TextFieldAutoSize.CENTER;
 addChild(desc);
 }
 private function addScrollBar():void
 {
 _scrollBar = new Sprite();
 _scrollBar.graphics.beginFill(0x000000);
 _scrollBar.graphics.drawRect(((5 * _width) + 30),2,10,30);
 _scrollBar.graphics.endFill();
 
_scrollBar.addEventListener(MouseEvent.MOUSE_DOWN,_down);
 _scrollBar.addEventListener(MouseEvent.MOUSE_UP,_up);
 }
 private function _down(e:MouseEvent):void
 {
 stage.addEventListener(MouseEvent.MOUSE_MOVE,_move);
 stage.addEventListener(MouseEvent.MOUSE_UP,_up);
 
}
 
private function _up(e:MouseEvent):void
 {
 stage.removeEventListener(MouseEvent.MOUSE_MOVE,_move);
 stage.removeEventListener(MouseEvent.MOUSE_UP,_up);
 
}
 
private function _move(event:MouseEvent):void
 {
 if (((mouseY > 0) && mouseY < _container.height - 30))
 {
 setScrollPos(mouseY);
 }
 }
 private function setScrollPos(y:Number):void
 {
 var height:Number = Math.ceil((_list.fileList.length + 1) / 5) * 105 + 5 - _container.height;
 var rect:Rectangle = _container.scrollRect;
 rect.y = height * ((y - 5) / (_container.height - 35));
 _scrollBar.y = y;
 _container.scrollRect = rect;
 }
 public function upload():void
 {
 if (_list.validList.length > 0)
 {
 _index = 0;
 addChild(_mask);
 addChild(_info);
 uploadBatch(0);
 }
 }
 private function uploadBatch(i:Number):void
 {
 if (Config.START_UPLOAD_CALLBACK && ExternalInterface.available)
 {
 ExternalInterface.call(Config.START_UPLOAD_CALLBACK, _list.validList[i]);
 }
 var jpegEncoder:JPGEncoder = new JPGEncoder(_loader.width);
 var jpegBytes:ByteArray = jpegEncoder.encode(_list.bitmapList[i]);
 
var urlRequest:URLRequest = new URLRequest();
 urlRequest.url = Config.UPLOAD_URL;
 urlRequest.method = URLRequestMethod.POST;
 
var params:Object = {};
 urlRequest.data = UploadPostHelper.getPostData(_list.validList[i].name,jpegBytes,Config.FIELD_NAME,params);
 urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control','no-cache'));
 urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type','multipart/form-data; boundary=' + UploadPostHelper.getBoundary()));
 
var urlLoader:URLLoader = new URLLoader();
 urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
 urlLoader.addEventListener(Event.COMPLETE,uploadComlete);
 urlLoader.load(urlRequest);
 }
 private function uploadComlete(evt:Event):void
 {
 if (Config.UPLOAD_COMPLETE_CALLBACK && ExternalInterface.available)
 {
 ExternalInterface.call(Config.UPLOAD_COMPLETE_CALLBACK, _list.validList[_index]);
 }
 _index++;
 if ((_index < _list.validList.length))
 {
 _info.text = "当前正在上传第" + (_index + 1) + "/" + _list.validList.length + "张图片...";
 uploadBatch(_index);
 }
 else
 {
 _info.text = "图片全部上传完成!";
 if (Config.ALL_COMPLETE_CALLBACK && ExternalInterface.available)
 {
 ExternalInterface.call(Config.ALL_COMPLETE_CALLBACK, _list.validList);
 }
 
}
 var tf:TextFormat = new TextFormat("宋体",16,0xff0000);
 _info.setTextFormat(tf);
 }
 private function selectFile(evt:MouseEvent):void
 {
 if (! _fileReferenceList)
 {
 _fileReferenceList = new FileReferenceList();
 _fileReferenceList.addEventListener(Event.SELECT,selectHandler);
 _fileReferenceList.addEventListener(Event.COMPLETE,selectCompleteHandler);
 }
 _fileReferenceList.browse();
 }
 private function selectHandler(evt:Event):void
 {
 ExternalInterface.call("console.dir",evt.target.fileList);
 _index = 0;
 _pendingFileList = evt.target.fileList;
 _list.fileList = _list.fileList.concat(_pendingFileList);
 addPendingFile(_pendingFileList[0]);
 }
 private function addPendingFile(file:FileReference):void
 {
 if (/(.jpeg|.jpg|.png|.gif|.bmp)$/g.test(file.type))
 {
 _list.validList.push(file);
 file.addEventListener(Event.COMPLETE,selectCompleteHandler);
 if (! _loader)
 {
 _loader = new Loader();
 }
 _loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadHandler);
 file.load();
 }
 else
 {
 addError(_list.itemList.length, "格式错误!");
 loadCompelete();
 }
 }
 
private function selectCompleteHandler(evt:Event):void
 {
 _loader.loadBytes(evt.target.data);
 }
 
private function loadHandler(evt:Event):void
 {
 addItem(_list.itemList.length);
 loadCompelete();
 }
 private function loadCompelete():void
 {
 _index++;
 if ((_index < _pendingFileList.length))
 {
 addPendingFile(_pendingFileList[_index]);
 }
 if ((_index == _pendingFileList.length))
 {
 if (Config.SELECT_FILE_CALLBACK && ExternalInterface.available)
 {
 ExternalInterface.call(Config.SELECT_FILE_CALLBACK, _list.validList);
 }
 if (_list.fileList.length >= 15)
 {
 ! stage.contains(_scrollBar) && addChild(_scrollBar);
 setScrollPos(_container.height - 30);
 }
 else
 {
 stage.contains(_scrollBar) && removeChild(_scrollBar);
 }
 }
 }
 
private function addPlusItem():void
 {
 _plusItem = new Sprite();
 var x:Number = 5;
 var y:Number = 5;
 _plusItem.graphics.drawRect(x,y,_width,_height);
 _plusItem.graphics.beginFill(0xefefef,1);
 _plusItem.graphics.lineStyle(1,0x000000,1);
 _plusItem.graphics.moveTo((x - 1),y - 1);
 _plusItem.graphics.lineTo(((x + _width) + 1),y - 1);
 _plusItem.graphics.lineTo(((x + _width) + 1),y + _height + 1);
 _plusItem.graphics.lineTo((x - 1),y + _height + 1);
 _plusItem.graphics.lineTo((x - 1),y - 1);
 _plusItem.graphics.endFill();
 _container.addChild(_plusItem);
 
var btnText:TextField = new TextField ;
 btnText.text = "添加图片";
 var tf:TextFormat = new TextFormat("宋体",16,0x000000);
 btnText.setTextFormat(tf);
 btnText.height = btnText.textHeight;
 btnText.x = x;
 btnText.y = y + (_height - btnText.height) / 2;
 btnText.autoSize = TextFieldAutoSize.CENTER;
 _plusItem.addChild(btnText);
 _plusItem.addEventListener(MouseEvent.CLICK,selectFile);
 }
 private function movePlusItem(i:Number):void
 {
 _plusItem.x = (_width + 5) * int((i % 5));
 _plusItem.y = (_height + 5) * int((i / 5));
 }

时间: 2024-11-25 12:43:49

Flash图片批量本地预览与上传实例的相关文章

预览待上传的本地图片

上传 上传文件是一种很普通的Web应用,尤其以上传图片更为常见.今天我们就在Web标准的范围内谈谈与这个主题相关的内容(只限前端部分,上传的实现当然就不在此列了),关键词是:Javascript.DOM和Firefox. 表单 先创建一个file表单域,我们需要用它来浏览本地文件. <form name="form1" id="form1" method="post" action="upload.php"> &l

AJAX实现图片预览与上传及生成缩略图的方法

要实现功能,上传图片时可以预览,因还有别的文字,所以并不只上传图片,实现与别的文字一起保存,当然上来先上传图片,然后把路径和别的文字一起写入数据库:同时为 图片生成缩略图,现只写上传图片方法,文字在ajax里直接传参数就可以了,若要上传多图,修改一下就可以了. 借鉴了网上资料,自己写了一下,并不需要再新加页面,只在一个页面里就OK啦. JS代码: //ajax保存数据,后台方法里实现此方法 function SaveData() { filename = document.getElementB

jquery.imgareaselect实现图片的本地预览和选择截取实现代码

第一还是要引用jquery,接着引用下载好的 jquery.imgareaselect.pack.js 文件和 imgareaselect-default.css 样式文件. 接着写一些元素标签  代码如下 复制代码  <img id="ferret" src="" alt="It's coming right for us!" title="It's coming right for us!"         styl

本地预览-服务器上到项目下载到本地后,如何预览

问题描述 服务器上到项目下载到本地后,如何预览 预览错误如下 解决方案 php服务器有没有装好,如果是iis,先在添加删除windows功能中启用php 解决方案二: 这个问题后来自己在打开phpstudy的时候发现是80端口被占用了,导致我进不去自己的站点,解除占用后就好了, 解决方案三: 1.先确认你的服务器上文件是否存在.在IIS中,选中你的WEBService,右键,浏览.文件夹中是否可以正确查看路径文件. 2.如果文件存在,选中你的WEBService,右键,管理应用程序,浏览.网页访

基于jquery实现图片上传本地预览功能_jquery

当我们在上传文件时如果每次都要上传到服务器才可以预览这个做看上合理其实是不合理的,如果网速慢或图片有问题,这样不但浪费客户时间同时也浪费服务器资源了,下面我们介绍利用js上传图片时本地实现预览,希望此方法对各位有所帮助哦.一.原理 分为两步: 当上传图片的input被触发并选择本地图片之后获取要上传的图片这个对象的URL(对象URL): 把对象URL赋值给事先写好的img标签的src属性即可把图片显示出来. 在这里,我们需要了解Javascript里File对象.Blob对象和window.UR

jquery实现兼容浏览器的图片上传本地预览功能_jquery

一.图片上传实现本地预览 由于上传图片功能,现在大多数都需要在本地实现预览,为了能够更好的让用户体验到效果,实现成品的证明,需要兼容好几种浏览器,所有通过各个例子整合了这个例子插件,兼容火狐.谷歌.ie8,其他的没有进行测试过 复制代码 代码如下: (function($){ jQuery.fn.extend({ uploadPreview: function(opts){ opts = jQuery.extend({ width: 0, height: 0, imgPreview: null,

jquery实现图片上传前本地预览功能_jquery

本文实例为大家分享了jquery实现图片上传前预览的具体代码,供大家参考,具体内容如下 介绍之前有一个小问题,一直找不到图片预览时,图片不出来的原因,原来在于图片的路径!!!一直写的是图片的本地路径,没有什么用.直接上代码. html部分: 复制代码 代码如下: <img id="pic" src="" > <input id="upload" name="file" accept="image/*

jquery 图片上传本地预览效果代码

 代码如下 复制代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.111cn.net /1999/xhtml" > <head>     <meta http-

JS上传预览图片 上传图片前预览代码

  JavaScript代码实现图片上传前预览,当然是在本地预览,这样可以让用户知道所选择的图片是否正确,实现此功能并不复杂,一段JS代码即可搞定.以下是一个完整的例子,你可以复制代码保存成html网页,然后打开这个网页测试效果.