- 浏览: 511234 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
michao:
大哥,还有aperture.exe吗? 发我一份,找不到呀,m ...
使用aperture框架让AS3与C++通信,执行本地代码 -
Aaron-Joe-William:
文件被删除了。下不了。
SQLite 数据库加密的一种解决方案 -
hanmiao:
樓主的文章不就是來自IBM Developers里的http: ...
mina 入门 -
howesen:
断包与粘包问题,需要处理下就好了
mina接收数据不全(2) -
sniciq:
git clone --recursive git://git ...
ESB学习笔记(Spring Integration实战)
进入实例讲解之前,先介绍上面所说的几点内容:
1 ExternalInterface类的使用
这里均以网页里Flash与js的通讯为例。首先,在Flash里头,ExternalInterface类是在Flash.net包里头,一般为方便以后调用该类时不输入此路径,as里会先添加
import flash.net.FileReference
添加了这一句以后,在使用该类时,就不需要重复输入flash.net了。
接着,要在Flash里头调用js的函数,可以使用call方法
call(methodName:String, [parameter1:Object])
为方便演示,我使用js一个内置的alert方法来进行测试。
新建个Flash文档,保存为ExternalInterface.fla,然后输入下面的代码:
import flash.net.FileReference;
ExternalInterface.call("alert",1);
发布一下,然后在IIS下测试你刚生成的网页,就会看到有个1的对话框出来了。就是说,Flash调用js的函数这一步已经实现。
然后,就是到js控制Flash了。js可以调用Flash里头的函数,这里,ExternalInterface类也起到重要的作用。
要使Flash里头某个函数可以被js调用,需要用ExternalInterface对其进行注册:
addCallback(methodName:String, instance:Object, method:Function) : Boolean
其中,methodName是给js调用的名称,instance是as函数所在的实例,method则是as里头函数的名称
返回一个布尔值,指示调用是否成功,不过下面的演示把这个返回值忽略。
在ExternalInterFace.fla里头,追加代码:
ExternalInterface.addCallback("gotoGoogle",this,goto_Google);
function goto_Google(){
getURL("http://www.google.com","_blank");
}
然后,用Ctrl+Enter生成下Flash影片。
在ExternalInterFace.html里头,找到</body>,在此前面添加代码:
<a href="#" onclick="ExternalInterface.gotoGoogle">gotoGoogle</a>
保存下html,运行,点上面的gotoGoogle按钮,将打开google的首页。也就是说,as里头的goto_Google函数已经通过js被调用起来了。
2 网页文件域中文件路径的获取
既然要使用文件域了,那么,文件域的路径如何获取就必须解决。使用的就是文件域的value属性,这跟文本域的获取方法一样。但是,这个属性貌似只好读
取,不好设置,设置的话,通过file.value="xxx",文件域里的文本框似乎没有跟着变化。可能有一个设置值的函数吧,但是还没找出来。
测试的代码比较简单
<input type="file" id="a" /><br />
<input type="button" onclick="alert(a.value)" value='查看'>
a为文件域的id,通过一个按钮点击以后,文件域的路径就通过对话框显示出来。
3 替代“浏览”按钮的方法
因为要在Flash里头调用,所以,用户使用的时候,是不点文件域后面的浏览按钮的。那么,如何代替这一按钮,让我们可以自行打开本地浏览窗口,并且对文件域的值进行设置呢?
为寻找这个问题的答案,我可以说是几经艰辛,虽然本帖的问题是昨晚解决的,但是FileReference类,文件域等问题就困扰了我很久。
在介绍网页制作的书里头,说到表单元素的插入时,很多都对各种表单元素如何设置值,如何设置属性都讲得很详细。Dreamweaver中,属性面板的任何
一项都介绍得相当清楚。像文本域,初始值,最大字符数等等,都会讲得一清二楚。如果书中包含js的内容,那么,如何用js对文本域进行设置也会有相应的讲
解。
然而,尽管文件域也不能躲开作者的笔下,但是,文件域的介绍总是几句带过,讲完如何插入就完事了。如何进行设置也很少进行深入讲解,同样,作者也会想方设
法在js部分省略掉文件域的内容。有的通过全面的调查表单实例,让读者感到全面,而不再追究如何使用文件域,有的则在对某一元素的设置进行讲解,而叫读者
举一反三,于是,由于文本域使用频率不高,读者看完书后,也就不会有问题反馈给作者。但实际上,他们对文本域的一些用法还是不那么了解。
但是,造成这一问题也不能完全归因于作者,毕竟文件域具有它的特殊性。
表单最初是用于给用户提交数据给后台用的。在不包含文件域的表单中,提交的数据基本上都是ASCII的字符串,或者说,提交的数据在记事本中打开不会有乱
码。后台在获取这些数据的时候,通常使用Request("xxx")就可以成功获取并进行处理了。但是,文件域所提交出去的数据则不一样,它包含了文件
域中相应文件的每个字节,可能包含二进制数据,不能为记事本所识别,用的时候,单靠Request不能成事,还需要用到上传组件,ASP的话,有的会使用
无组件上传类。虽然处理二进制数据很多时候用的是Request.BinaryRead,Request.BinaryWrite,但相比起不带文件域的
表单来说,要复杂些。在网页程序的书或教程里头,提交含文件域的表单要独立出来讲解,说明文件域在后台处理方面具有特殊性。
随着js客户端脚本的发展,以及服务器负担日益加重的趋势,表单的数据若都直接传输,服务器将更容易崩溃。因此,表单的内容很多时候都会先在前台处理一
下,以减少不必要的传输。在一些简单应用中,甚至所有表单数据都不提交到后台,一切皆为前台服务。在这情况下,文件域的应用也不广泛,如果只考虑前台,文
件域不过比文本域多了个浏览功能,可以获得一些特定的字符串,而获得这些字符串的目的,很多时候只是要读取或写入文件。然而,在网页前台进行文件的读写操
作,一般都会给浏览器的安全性禁止,于是,文件域也就失去了它特有的价值,跟文本域没什么区别了。
所以,文件域的使用会非常容易给人忽略,特别是前台脚本方面。找这个“浏览”方法,也就很让我头痛。尝试使用过for in枚举,但可惜,只能得到属性和事件,没有函数。所以,使用各大搜索引擎,用不同的关键字搜索,都无法找到答案。
经过一小时的查找和尝试,我居然在经典论坛前台区600多天前一个讨论css的帖里头一个不是很起眼的回答中找到了问题的答案。
http://bbs.blueidea.com/thread-1803020-1-1.html
3楼的marvellous
提供了一个通过隐藏文件域,添加其它表单控件来实现CSS的方法。
<input type=file name=j style="display: none;"
onchange="ye.value=value"><input name=ye style="color:
green;border: 1px solid green"> <input type=button value="File"
onclick=j.click() style="border: 1px solid green">
虽然讨论的是CSS,但是由于他通过外部控制了文件域,所以达到了我要的效果。在此,非常感谢这位版主提供的答案。
在按下一个普通按钮的时候,调用j.click()方法,j又是文件域的id,明显,click就是文件域的浏览函数啦。
有了他的这几句代码,下面的一切就很好解决了。
4 文件域里相当于FileReference类中onSelect的事件
有了上面的代码,这个事件也就不难发现了。因为显示的文本框也不是文件域本身所带的文本框,而是自己另外创建的一个文本域,在测试他代码的过程中,点了自
创建的按钮以后,选了文件,文件路径也可以显示在自己做的文本域中,文本域的id是ye,那么,让ye.value=value的事件onchange,
自然就是选了文件以后所响应的事件啦。
有了它这一模型以后,我们发现,文件域中我们需要的内容都可以获取了,只要通过ExternalInterface类,把这些内容传给as,就可以实现Flash对文件路径的获取了。
具体步骤如下:
1 在Flash里创建一动态文本或输入文本,用来显示路径,再创建一个浏览按钮。
2 在网页中创建一个隐藏的文件域,给js调用。
3 点Flash的浏览按钮后,通过ExternalInterface.call调用js的一个函数,该函数包含了网页文件域的click方法。
4 打开浏览本地文件的对话框,选择了文件后,响应onchange事件,调用flash里头的一个函数,该函数在Flash里头包含了设置动态文本框文本内容的语句。
下面跟据这些步骤,创建这个Flash版的文件域
1 新建一个Flash文档,保存为fileField.fla。
然后,在场景里头放一个动态文本框或输入文本框,实例名为fileName,再放一个按钮,实例名为browse_btn。
2 选择“文件”-“发布设置”,点下发布按钮以后,把格式选项卡中的html前的勾去掉(现在不用fscommand了,所以不用像以前那样做跟踪)。
然后,在fileField.fla所在目录下,用记事本打开fileField.html,找到</body>,在前面输入如下代码:
<input type="File" id="myFile" onchange="giveValueToFlash(myFile.value)" style="visibility:hidden">
这里有个giveValueToFlash,就是说,文件域选了文件以后,调用此函数,这一函数在后面定义,将会把文件域的value属性传给Flash。
3 回到fileField.fla,在帧里头输入代码:
import flash.external.ExternalInterface;//载入ExternalInterface类
browse_btn.onRelease = function() {
ExternalInterface.call("browse");//让Flash调用js的browse函数,这函数等下定义,用于打开浏览对话框
};
转到fileField.html,在</body>前面输入代码:
<script language="javascript">
function browse(){
myFile.click();//Flash所调用的browse函数就可以因此而打开浏览对话框了
}
</script>
4 在function browse(){}后面,追加onchange事件所响应的giveValueToFlash函数:
function giveValueToFlash(val){
fileField.setValue(val);//fileField为Flash生成的HTML的swf默认id,这句话就调用fileField的setValue方法,但是,这不是Flash自带的,需要用addCallback来注册。
}
转回fileField.fla,追加代码:
ExternalInterface.addCallback("setValue",this,setTextValue);//让setValue成
为Flash的一个方法,setTextValue的意思是:当在网页或者其它容器里头调用Flash的setValue方法时,Flash中的
setTextValue将被调用。
//所以下面这个函数就是给外部调用的
function setTextValue(val:String):Void {
fileName.text = val;//让动态文本或者输入文本的值等于文件域的value属性
}
走到这一步,文件路径已经可以为Flash所获取,但是,可以看到,FileReference类完全没有参与其中,所以,它里头的一切方法,属性,事件
你都没办法用上。所以,这一切如果可以封装成一个类就完美了。可惜的是,它要和js代码交互,js存在于网页中,不容易放到AS类里头,但是,看了
abc12hjc的保持html干净的办法以后,也可以尝试用getURL("javascript:xxx")的办法,把一部分的js写到类里头。加上
ExternalInterface类也大量减少了网页的代码,写成类还是可以尝试的。
如果你要用这一个文件域来上传文件的话,就要给回html去提交数据了。但是,html提交数据需要页面跳转,那么,如何实现像Flash一样的无跳转页
面上传?mirycat已经提到了,就是用隐藏的iframe上传。具体的我没有在演示地址里实现,不过我会继续补充的。
评论
这个自己随便写一个方法就好了
发表评论
-
十个Flex/Air疑难杂症及解决方案简略
2010-05-31 17:17 3346最近去一家台企面 ... -
Windows环境下配置+运行red5源码+AS3连接red5简单示例
2010-04-19 13:39 5185Windows环境下配置+运行red5源码+AS3连接red5 ... -
使用aperture框架让AS3与C++通信,执行本地代码
2010-04-08 16:48 3260我们都知道,AIR的效果是非常出色的,这也是大家喜欢她的原因, ... -
SQLITE入门至精通
2010-04-07 11:13 3028关键 ... -
教你解析FLEX JSON中的一个问题 关于键值 和键
2010-04-01 15:25 2328字符串:message = ' "param&quo ... -
air写文件保存在安装目录
2010-03-31 15:46 3224AIR中..保存文件我们般会像下面这样操作 var f ... -
弱弱的一个小问题,bitmapdata pngencoder base64 bytearray
2010-03-31 14:16 1156好久没写东东了,呵呵。随便写点点。关于bitmapdata如何 ... -
FLASH教程:SWF间的双向通信
2010-03-02 18:23 1363假设有一个主 SWf 名为 m ... -
如何把as文件生成swf格式文件
2010-03-02 18:22 5292一,从http://opensource.adobe.com/ ... -
Flex数据交互方法 :httpservice, webservice, RemoteObject, socket
2010-02-27 17:06 1916【转载】 文章分类:Flash编程 http://h ... -
理解Flash Player 9垃圾回收机制
2010-02-02 18:27 1089理解Flash Player 9垃圾回 ... -
BlazeDS入门教程-很详细-赞原创作者一个
2010-01-11 23:51 1723什么是BlazeDS呢?BlazeDS是一个基于服务器的Ja ... -
一些漂亮的Flex主题下载
2010-01-11 10:31 6180一些漂亮的Flex主题下载1Digg meWindows Cl ... -
通过Stratus 服务器在Flash Player中使用RTMFP 开发 点对点应用(一)
2010-01-08 17:43 5402作者:Jozsef Vass 译者:巴巴鲁 ... -
ActionScript 3.0著名开源库 大集合
2009-12-29 17:26 2048这篇文章开始于对Adrian ... -
Flex 读取XML配置文件总结
2009-11-19 11:45 1990在Flex中我 ... -
一个list定义组件,网上找了很久没有,自己做了一个。
2009-10-29 11:55 1254一个list定义组件,网上找了很久没有,自己做了一个。希望对大 ... -
如何使用Flex RemoteObject components 与JAVA交互
2009-10-08 18:04 53182008-12-25 | 22:53分类:前端开发 ... -
flex 在线录制视频语音
2009-09-12 17:45 3651<?xml version="1.0" ... -
flex 蒙板 遮罩
2009-09-11 17:09 3876方法一 <mx:Image source=&q ...
相关推荐
2. 用户选择文件后,`FileReference`对象会触发`select`事件,此时可以通过`FileReference.name`获取选中文件的名称,`FileReference.size`获取文件大小。 3. 调用`FileReference.load()`方法读取文件数据到内存中。...
2. **创建`FileReference`实例** ```as3 var fileRef:FileReference = new FileReference(); ``` 这里我们创建了一个名为`fileRef`的`FileReference`实例。`FileReference`类提供了访问本地文件系统的方法。...
### Flex中的文件上传与下载...尽管存在一些限制,如文件路径的安全访问问题,但在大多数应用场景下,这些功能已经足够满足需求。对于希望在Flex应用中加入文件上传下载功能的开发者来说,本文提供了一个很好的起点。
在Action中,我们可以使用Servlet API的Part接口或Struts2的FileItem类来获取上传的文件,并进行后续处理,如保存到服务器的特定目录。 同名文件上传是一个特殊场景,通常需要在服务器端处理文件重命名或覆盖的问题...
2. **监听事件**:`FileReference`对象提供了多个事件,如`select`、`data`和`uploadCompleteData`等。我们需要监听`select`事件,当用户选择文件后执行相应的操作。 3. **文件选择**:当用户选择文件后,`...
3. **路径问题**: 如果TXT文件和FLA文件在同一文件夹内,你可以直接使用相对路径来引用文件。例如,如果你的TXT文件名为`data.txt`,那么路径可能写为`"data.txt"`。但请注意,这种方法在发布项目时可能不适用于...
- **FileReference.save()**:使用`FileReference`的`save()`方法,指定文件名和保存路径,开始下载。同时,可以监听`download`事件来跟踪下载进度和状态。 - **安全限制**:需要注意的是,由于浏览器的安全策略,...
' 检查保存路径,确保文件夹存在 If Not Dir(savePath, vbDirectory) = "" Then MkDir "path/to/save/" ' 将文件保存到服务器 uploadedFile.SaveAs savePath ' 返回成功响应 Response.Write "Image uploaded...
当用户选择文件后,FileUpload组件会触发`change`事件,此时可以通过`event.target.selectedFile`获取FileReference对象,或者通过`event.target.selectedFiles`获取FileReferenceList对象。 - 如果需要预览图片,...
2. 监听`FileReference`的`select`事件,获取选中的文件。 3. 设置`FileReference`的`upload()`方法,指定`PHP`处理脚本的URL。 4. 启动上传过程,监听`progress`、`complete`等事件以显示进度和处理结果。 在`PHP`...
这可以通过将JAR添加到项目的类路径或者使用构建工具(如Maven或Gradle)来实现。例如,在Maven的`pom.xml`文件中添加以下依赖: ```xml <groupId>com.jthink</groupId> <artifactId>jid3lib <version>0.5.4 ...
2. Flex调用`FileReference.upload()`将文件发送到服务器。 3. Java后端接收到文件并存储,返回确认信息。 4. 用户触发下载请求,Flex发送HTTP GET请求到服务器指定的下载URL。 5. Java后端处理请求,准备文件内容并...
SWF(ShockWave Flash)是Adobe公司开发的一种矢量图形和多媒体播放器支持的文件格式,常用于创建交互式网页内容,包括...在实际项目中,还需要考虑浏览器兼容性、性能优化以及错误处理等问题,以确保功能的稳定运行。
3. **安全性考虑**:在处理用户上传的文件时,必须注意安全性问题。防止恶意用户上传木马或病毒文件,可以通过检查文件扩展名、检查文件内容类型以及限制上传大小来降低风险。同时,确保文件名的唯一性和安全性,...
2. Flash使用AS3.0的FileReferenceList和FileReference类处理文件选择,并调用upload()方法开始上传。 3. 文件数据被发送到服务器上的Servlet。 4. Servlet接收文件,进行验证和保存,并返回结果信息。 5. Flash接收...
Flex提供了Camera类来访问和控制用户的摄像头,我们可以用它的`getVideo`方法获取视频流,然后使用BitmapData的`draw`方法将每一帧绘制到位图上,最后进行保存。 3. **SaveChart-app.xml 和 SaveWebcam-app.xml** -...
为了绕过这个问题,你可以使用FileReference类来弹出一个保存对话框,让用户选择保存位置。例如: ```actionscript var fileRef:FileReference = new FileReference(); fileRef.save(excelExporter.getBytes(), ...