Flash上传文件(结合asp.net) (转)
在某些场合,我们需要使用Flash进行“文件上传”,原因是Flash 能制作出表现力丰富的UI界面。
(自负又孤陋寡闻的我在这里做一个补充:Flash使用flash.net包中的FileReference是可以发送文件数据到一个asp,asp.net或php页的,可以看浪子的[Flash FileUpload]用flash.net.FileReference实现ASP.NET无刷新文件上传,codeproject有这样的示例:Multiple File Upload With Progress Bar Using Flash and ASP.NET,Flash8的帮助中有FileReference的详细说明及示例。)
所以本文是用另一个方法来实现Flash的文件上传的,本文Flash上传文件的实现原理是:
通过Flash和页面中的Javascript通信(这时候是Flash->Javascript),调用JavaScript控制一个隐藏的含有文件域的表单,发送文件数据到后台程序页面(asp,aspx,php等),后台程序接收到上传的文件数据后,进行保存等处理,最后反馈信息给Flash(这时候就是Javascript->Flash)。
我们先来看下面这个截图:
这是一个Flash界面,可以“实现文件上传”,并进行相应提示(成功/失败),下面我们就来制作这样的程序。
二、准备工作。
本文的目的就是教大家制作这样功能的Flash程序,在进行之前,我们需要一些技术上的准备,我们需要知道:
·Flash如何调用Html页面中的JavaScript?
·JavaScript如何发送数据给Flash?
1. Flash如何调用Html页面中的JavaScript?(Flash->Javascript)
下面介绍两种方法:
A.在Flash中使用getURL 函数:
将来自特定 URL 的文档加载到窗口中,或将变量传递到位于所定义的 URL 的另一个应用程序。若要测试此函数,请确保要加载的文件位于指定的位置。若要使用绝对 URL(例如,http://www.myserver.com),则需要网络连接。
可用性:Flash Player
4;ActionScript1.0参数url:String - 可从该处获取文档的 URL。
window:String
[可选]- 指定应将文档加载到其中的窗口或 HTML 帧。您可输入特定窗口的名称,或从下面的保留目标名称中选择:_self 指定当前窗口中的当前帧。
_blank 指定一个新窗口。
_parent 指定当前帧的父级。
_top 指定当前窗口中的顶级帧。
method:String
getURL 函数的原义是,在指定的Html页面框架(frame)中,打开指定的网页。
这里,我们把url网址写成一段Javascript脚本即可在页面中执行,如:
getURL("Javascript:alert('OK')");
这句的执行效果相当于在Html中的:
</script>
在Flash中使用getURL函数,可以调用当前Html页面中的任何Javascript脚本。
B.在Flash中使用fscommand函数:
fscommand
(command:String, parameters:String) : Void
在Web浏览器中,
执行后将调用JavaScript函数fscommand
()moviename_DoFScommand
,该函数位于包含 SWF文件的Web页中。moviename为用于EMBED
标签的NAME
属性或OBJECT
标签的ID属性。
如:我们对SWF文件指定OBJECT标签的ID=myMovie
,则调用JavaScript函数myMovie_DoFScommand
。
在这种用法下,command
和parameters
参数可以是任意的字符串或表达式。
如Flash中执行:
则web页中的:
}
函数将被执行,两个函数的参数依次相对应,即会有command="upload",args="";
另外,在web页中使用fscommand时,还应该指定一个参数swLiveConnect=true,如:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="445" height="50" id="FlashUpload" align="middle">
<param name="movie" value="FlashUpload.swf" />
<param name="allowScriptAccess" value="always" />
<param name="swLiveConnect" value="true" />
<embed src="FlashUpload.swf" width="445" allowScriptAccess="always" height="50" name="FlashUpload" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" swLiveConnect="true"/>
</object>
swLiveConnect属性的含义是:指定此参数会让Flash Player在第一次加载时,启动Java,从而使fscommand可以起作用。
2. JavaScript如何发送数据给Flash? (Javascript->Flash)
方法是在Javascript中使用SetVariable。
语法:SetVariable( variableName, value )
如下这段Javascript脚本的执行后会将Flash中名为txtbox的变量值修改为"1234":
flash.SetVariable("txtbox", "1234");
更多关于Flash和Javascript通信的内容,可以看这里:
JavaScript 和 Flash 的通信
FLASH与JAVASCRIPT的通信
三、制作Flash。
启动Flash,新建一个空白文档,命名为:FlashUpload.fla;
如上图所示,场景背景色设为绿色,然后放置两个“动态文本”框:
上边带框线的文本框变量设置为:file,制作一个“浏览”按钮与其组合后来模仿web页中的文件域;
下边的文本框变量设置为:msg,用来显示提示信息;
最后还有一个“上传”按钮。
“浏览”按钮上添加如图代码:
“上传”按钮上添加如图代码:
这里的Flash对Javascript通信我使用了fscommand,fscommand的参数内容可以任意,我们让“浏览”按钮传递“browser”字符串过去,“上传”按钮传递“upload”字符串。后边的web页中会根据这两个字符串来进行不同的操作。使用getURL时,浏览器会产生“哒”的声音,使用fscommand则不会产生声音。
完成后保存,编译(ctrl+enter),生成FlashUpload.swf文件。
四、将FlashUpload.swf文件插入FlashUpload.html文件。
创建一个html文件:FlashUpload.html,插入FlashUpload.swf,同时编写响应fscommand命令的Javascript函数:FlashUpload_DoFScommand,完整的html文件内容如下:
{
file.click();
}if(command=="upload"&&file.value!="")
{
window.uploadFrame.setFlash("msg","正在上传文件,请稍候");
form1.submit();
}elseif(file.value==""){
window.uploadFrame.setFlash("msg","请选择一个文件.");
}
}if(navigator.appName&&navigator.appName.indexOf("Microsoft")!=-1&&navigator.userAgent.indexOf("Windows")!=-1&&navigator.userAgent.indexOf("Windows 3.1")==-1) {
document.write('<SCRIPT LANGUAGE=VBScript\>\n');
document.write('on error resume next \n');
document.write('Sub FlashUpload_FSCommand(ByVal command, ByVal args)\n');
document.write(' Call FlashUpload_DoFScommand(command, args)\n');
document.write('End Sub\n');
document.write('</SCRIPT\>\n');
}
//--></SCRIPT></head><body><objectclassid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"width="445"height="50"id="FlashUpload"align="middle"><paramname="movie"value="FlashUpload.swf"/><paramname="allowScriptAccess"value="always"/><paramname="swLiveConnect"value="true"/><embedsrc="FlashUpload.swf"width="445"allowScriptAccess="always"height="50"name="FlashUpload"align="middle"type="application/x-shockwave-flash"pluginspage="http://www.macromedia.com/go/getflashplayer"swLiveConnect="true"/></object><BR><iframeframeborder="0"name="uploadFrame"width="0"height="0"src="Upload.aspx"></iframe></body></html>
这里就是注意一些变量和值的使用,我用不同的颜色做了标识。下一步要出现的Upload.aspx文件被放置在一个宽、高、边框均为0的Iframe里,达到隐藏效果。
Flash中的fscommand使用执行后,web页中的FlashUpload_DoFScommand函数会被执行,此函数中又对隐藏的Iframe进行操作,从而进行文件上传。
五、Upload.aspx:文件保存页面。
if(IsPostBack)
{
stringmsg=string.Empty;
try{
if(File1.PostedFile.ContentLength>0)
{
//在此进行文件合法性判断,然后进行保存.
//
//File1.PostedFile.SaveAs(@"C:\abc.ext"); msg="文件"+File1.PostedFile.FileName.Replace(@"\",@"\\")+"("+File1.PostedFile.ContentLength.ToString()+"字节)上传成功.";
}else{
msg=("请选择一个有效的文件.");
} }catch{
msg="上传文件失败.";
}
this.RegisterClientScriptBlock("setFlash","<script>setFlash('msg','"+msg+"');<"+"/script>");
}}</script>
<html><head><title>SaveFile</title><script language=javascript>//javascript->flashvar flash=parent.document.getElementById("FlashUpload");
function setFlash(obj,value)
{
flash.SetVariable(obj, value);
}</script></head><body bgcolor="#99ff33"><form id="form1"runat="server"><div><input id="File1"runat="server"type="file"onChange="setFlash('file',this.value);"/></div></form></body></html>
这个页的内容比较简单,目的是用来接收数据并保存,单独运行效果如下:
因为这个页面中表单的提交是通过Flash调用Javascript脚本来进行的,所以这个页面中没有提交按钮,假如有提交按钮,这个页本身应该可以进行文件上传。最后这个页是被放置在一个隐藏的IFrame框架中的,用户并不可见。
需要注意是就是这个页中使用SetVariable向Flash发送数据(回馈信息)。
完成后的整体运行效果,就是本文开头的那张图片。
本文示例在Flash8+.Net1.1下制作并在IE下测试通过。
本文完整的源代码下载(122K)>>
(由于文件上传的特殊性,Flash上传文件必须这么“麻烦”的调用Javascript 和隐藏的表单来完成。除此之外,Flash是支持直接Post数据到一个aspx页面的,如使用sendAndLoad方法。另外有国外闪客写了一个yamzbrowser的Flash插件,能够使用Flash实现文件上传功能,但原理也基于此。)
转载于:https://www.cnblogs.com/dengxxdd/archive/2008/04/05/1138037.html
Flash上传文件(结合asp.net) (转)相关推荐
- SWFUpload免费FLASH上传组件(ASP…
SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统<input ty ...
- SWFUpload免费FLASH上传组件(ASP修改版)
者:Q人甲 SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术 为WEB开发者提供了一个具有丰富功能继而超越传统<i ...
- 通过Flash上传文件提示出错:onHTTPError
通过Flash上传文件提示出错:onHTTPError 这种错误是因为此FLASH上传功能需要ASP.NET 2.0的支持,虽然服务器上默认都安装了ASP.NET 2.0,但需要在IIS里面选择当前网 ...
- Esp8266的Flash读写操作以及Flash上传文件
1.Flash的读写操作 Esp8266的Flash为4M,其中1M用于存储程序,其他的空间有一部分用于系统,3M中剩下的大部分空间可以用来存放文件. #include <FS.h> St ...
- 解决使用FireFox下Flash上传文件时SESSION丢失的问题(swfupload)
解决使用FireFox下Flash上传文件时SESSION丢失的问题(swfupload) 这几天在项目中遇到的问题,稍微整理一下. HTML 表单是我们常用来进行浏览器与服务器数据交互的途径,除了传 ...
- 火狐浏览器获取flash上传文件的
火狐浏览器获取flash上传文件的 火狐浏览器中flash上传获取不到. 主要是因为flash在火狐浏览器上传的过程中新建立了一个session 一个独立于浏览器的session.这里我们成为page ...
- 基于jQuery的uploadify(flash上传文件)控件v1.6.2 bug修正
最近在http://www.open-open.com/ajax/Upload.htm上找了好多借用flash来选择文件上传的控件,对基于jQuery的uploadify甚是喜欢.于是就拿来应用到项目 ...
- flash 上传文件 java_Flash 二进制传图片到后台Java服务器接收
需求:把客户端处理过的图片返还给服务器 Flash端代码 01 package { 02 import com.adobe.images.JPGEncoder; 03 import f ...
- 使用Kindeditor的多文件(图片)上传时出现上传失败的解决办法/使用Flash上传多文件(图片)上传时上传失败的解决办法
近来用户反映希望我们把在线编辑器中的多图片上传功能实现,因为他们在编辑商品描述时经常会有一次上传多张图片的需求,如果要逐张选择的话效率很低,客户的需求就是我们的追求,很快我们就把完善功能排到了日程表中 ...
- ASP.NET 2.0使用FileUpload控件上传文件示例
在ASP.NET 2.0中使用FileUpload服务器控件很容易的就能将文件上传到服务器,一个简单的例子如下: aspx: 程序代码 <%@ Page Language="C#&qu ...
最新文章
- ASA防火墙透明模式ACL总结
- php蜘蛛池搭建教程,【小旋风教程】万能蜘蛛池x4安装教程 _ 惠州SEO
- 联想android4.4.2版本,联想YOGA 平板2系统是什么?能升级安卓4.2吗?
- SAP Fiori Elements - smart filter bar study - filter display logic
- go语言值得学习的开源项目推荐
- 数据库:MySQL 团队开发规范,太详细了,建议收藏!
- S3C2440、S3C2450和S3C6410之间区别
- cesium广告牌_公路广告牌
- 交流充电桩电路图_直流充电桩和交流充电桩给电动汽车充电过程中是如何工作的?...
- 一个O-RAN YANG语言文件:o-ran-interfaces.yang
- 源码0501-07-GCD的基本使用
- python可视化案例书籍推荐_我用python5年后,我发现学python编程必看的三本书!...
- Rust: map中的问题,两种写法有什么不同?
- webqq机器人java_一步一步来做WebQQ机器人-(二)(第一次登陆)
- npm install报错error 404 Not Found - GET httpsregistry.npm.taobao.org@xt
- 什么是ROOT?ROOT权限有什么用?
- lwIP配置宏整理(部分)
- [No0000158]思维模型1-20
- 学会爬虫不用再收藏了,直接把网站拍照留念
- 论劳动者的休息权及其法律保障
热门文章
- 学习记录:由技术而产品,由产品而商务
- oracle和mysql用户名_oracle的SID和用户名和角色
- 项目拉去某个版本的_项目管理的“背后军师”——高层领导
- java update needed_JAVA update()方法 求详解
- 多个安卓设备投屏到电脑_无线投屏器投屏不需要网络
- 信息与计算科学偏计算机的学校,信息与计算科学:披着计算机“外衣”的数学专业...
- rbac 一个用户对应多个账号_SaaS产品用户权限管理-RBAC
- IT小天博客APP版本
- 轻松搭建docker应用的mesos集群
- 【C语言】【笔试题】实现函数itoa(int n,char s[]),将整数n这个数字转换为对应的字符串,保存到s中...