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

我们先来看下面这个截图:
flashupload01.gif
这是一个Flash界面,可以“实现文件上传”,并进行相应提示(成功/失败),下面我们就来制作这样的程序。

二、准备工作。
本文的目的就是教大家制作这样功能的Flash程序,在进行之前,我们需要一些技术上的准备,我们需要知道:
·Flash如何调用Html页面中的JavaScript?
·JavaScript如何发送数据给Flash?

1. Flash如何调用Html页面中的JavaScript?(Flash->Javascript)
下面介绍两种方法:
A.在Flash中使用getURL 函数:
ContractedBlock.gif ExpandedBlockStart.gif
getURL(url:String, [window:String, [method:String]]) : Void

将来自特定 URL 的文档加载到窗口中,或将变量传递到位于所定义的 URL 的另一个应用程序。若要测试此函数,请确保要加载的文件位于指定的位置。若要使用绝对 URL(例如,http://www.myserver.com),则需要网络连接。

可用性:Flash Player 
4;ActionScript 1.0

参数
url:String - 可从该处获取文档的 URL。

window:String 
[可选] - 指定应将文档加载到其中的窗口或 HTML 帧。您可输入特定窗口的名称,或从下面的保留目标名称中选择: 

_self 指定当前窗口中的当前帧。 
_blank 指定一个新窗口。 
_parent 指定当前帧的父级。 
_top 指定当前窗口中的顶级帧。 
method:String 
[可选] - 用于发送变量的 GET 或 POST 方法。如果没有变量,则省略此参数。GET 方法将变量附加到 URL 的末尾,它用于发送少量的变量。POST 方法在单独的 HTTP 标头中发送变量,它用于发送长字符串的变量。

getURL 函数的原义是,在指定的Html页面框架(frame)中,打开指定的网页。
这里,我们把url网址写成一段Javascript脚本即可在页面中执行,如:
getURL("Javascript:alert('OK')");
这句的执行效果相当于在Html中的:

None.gif < script >
None.gifalert(
" OK " );
None.gif
</ script >

在Flash中使用getURL函数,可以调用当前Html页面中的任何Javascript脚本。

B.在Flash中使用fscommand函数:
fscommand(command:String, parameters:String) : Void

在Web浏览器中,fscommand()执行后将调用JavaScript函数moviename_DoFScommand,该函数位于包含 SWF文件的Web页中。moviename为用于EMBED标签的NAME属性或OBJECT标签的ID属性。
如:我们对SWF文件指定OBJECT标签的ID=myMovie,则调用JavaScript函数myMovie_DoFScommand
在这种用法下,commandparameters参数可以是任意的字符串或表达式。

如Flash中执行:

None.gif fscommand( " upload " "" );

则web页中的:

function  FlashUpload_DoFScommand(command, args) {
}

函数将被执行,两个函数的参数依次相对应,即会有command="upload",args="";

另外,在web页中使用fscommand时,还应该指定一个参数swLiveConnect=true,如:

ContractedBlock.gif ExpandedBlockStart.gif
<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":

var  flash  =  document.getElementById( " FlashObjectId " );
 flash.SetVariable("txtbox", "1234");

更多关于Flash和Javascript通信的内容,可以看这里:
JavaScript 和 Flash 的通信
FLASH与JAVASCRIPT的通信

三、制作Flash。
启动Flash,新建一个空白文档,命名为:FlashUpload.fla;

flashupload03.gif

如上图所示,场景背景色设为绿色,然后放置两个“动态文本”框:
上边带框线的文本框变量设置为:file,制作一个“浏览”按钮与其组合后来模仿web页中的文件域;
下边的文本框变量设置为:msg,用来显示提示信息;
最后还有一个“上传”按钮。

“浏览”按钮上添加如图代码:
flashupload04.gif

“上传”按钮上添加如图代码:
flashupload05.gif

这里的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文件内容如下:

ContractedBlock.gif ExpandedBlockStart.gif
<head>
<title>FlashUploadDemo</title>
<script language="javascript">
<!--
//flash->javascript
function FlashUpload_DoFScommand(command, args) {
    
var file = window.uploadFrame.document.getElementById("File1");
    
var form1 = window.uploadFrame.document.getElementById("form1");
    
if (command == "browser")
    {
        file.click();        
    }
    
if (command == "upload"&&file.value != "")
    {
        window.uploadFrame.setFlash(
"msg","正在上传文件,请稍候dot.gif");
        form1.submit();    
    }
else if (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>
  
<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>
  
<BR>
  
<iframe frameborder="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:文件保存页面。

None.gif <% @ Page Language = " C# "   %>
None.gif
< script runat = " server " >
ExpandedBlockStart.gifContractedBlock.gif
protected   override   void   OnLoad(EventArgs e) dot.gif {
InBlock.gif    
if (IsPostBack)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
string msg = string.Empty;
InBlock.gif        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (File1.PostedFile.ContentLength > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
//在此进行文件合法性判断,然后进行保存.
InBlock.gif                
//dot.gif
InBlock.gif                
//File1.PostedFile.SaveAs(@"C:\abc.ext");
InBlock.gif
                
InBlock.gif                msg 
= "文件" + File1.PostedFile.FileName.Replace(@"\"@"\\"+ "(" + File1.PostedFile.ContentLength.ToString() + "字节)上传成功.";
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                msg 
= ("请选择一个有效的文件.");
ExpandedSubBlockEnd.gif            }
  
ExpandedSubBlockEnd.gif        }

InBlock.gif        
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            msg 
= "上传文件失败.";
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
this.RegisterClientScriptBlock("setFlash""<script>setFlash('msg','" + msg + "');<" + "/script>");
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
</ script >
None.gif
None.gif
< html >
None.gif
< head >
None.gif    
< title > SaveFile </ title >     
None.gif    
< script language = javascript >
None.gif    
// javascript->flash
None.gif
    var flash  =  parent.document.getElementById( " FlashUpload " );
None.gif    function setFlash(obj,value)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        flash.SetVariable(obj, value);
ExpandedBlockEnd.gif    }

None.gif    
</ script >
None.gif
</ head >
None.gif
< body bgcolor = " #99ff33 " >
None.gif    
< form id = " form1 "  runat = " server " >
None.gif    
< div >
None.gif        
< input id = " File1 "  runat = " server "  type = " file "  onChange = " setFlash('file',this.value); " /></ div >
None.gif    
</ form >
None.gif
</ body >
None.gif
</ html >
None.gif

这个页的内容比较简单,目的是用来接收数据并保存,单独运行效果如下:
flashupload02.gif
因为这个页面中表单的提交是通过Flash调用Javascript脚本来进行的,所以这个页面中没有提交按钮,假如有提交按钮,这个页本身应该可以进行文件上传。最后这个页是被放置在一个隐藏的IFrame框架中的,用户并不可见。

需要注意是就是这个页中使用 SetVariable向Flash发送数据(回馈信息)。

完成后的整体运行效果,就是本文开头的那张图片。

本文示例在Flash8+.Net1.1下制作并在IE下测试通过。
 
本文完整的源代码下载(122K)>>


(由于文件上传的特殊性,Flash上传文件必须这么“麻烦”的调用Javascript 和隐藏的表单来完成。除此之外,Flash是支持直接Post数据到一个aspx页面的,如使用 sendAndLoad方法。另外有国外闪客写了一个yamzbrowser的Flash插件,能够使用Flash实现文件上传功能,但原理也基于此。)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本实例采用的是Uploadify上传插件,.NET程序,源程序是从网上找的,但是有Bug,已经修改好,并标有部分注释。绝对好用,支持单文件、多文件上传,支持大文件上传,已经过多方面测试,保证好用。 以下附上Uploadify部分常用的参数介绍,要看全部的就去看其API文件了,一般在下载的包里都有。  uploader : uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击后弹出打开文件对话框,默认值:uploadify.swf。   script : 后台处理程序的相对路径 。默认值:uploadify.php   checkScript :用来判断上传选择的文件在服务器是否存在的后台处理程序的相对路径   fileDataName :设置一个名字,在服务器处理程序中根据该名字来取上传文件的数据。默认为Filedata   method : 提交方式Post 或Get 默认为Post   scriptAccess :flash脚本文件的访问模式,如果在本地测试设置为always,默认值:sameDomain   folder : 上传文件存放的目录 。   queueID : 文件队列的ID,该ID与存放文件队列的div的ID一致。   queueSizeLimit : 当允许多文件生成时,设置选择文件的个数,默认值:999 。   multi : 设置为true时可以上传多个文件。   auto : 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 。   fileDesc : 这个属性值必须设置fileExt属性后才有效,用来设置选择文件对话框中的提示文本,如设置fileDesc为“请选择rar doc pdf文件”,打开文件选择框效果如下图:   fileExt : 设置可以选择的文件的类型,格式如:'*.doc;*.pdf;*.rar' 。   sizeLimit : 上传文件的大小限制 。   simUploadLimit : 允许同时上传的个数 默认值:1 。   buttonText : 浏览按钮的文本,默认值:BROWSE 。   buttonImg : 浏览按钮的图片的路径 。   hideButton : 设置为true则隐藏浏览按钮的图片 。   rollover : 值为true和false,设置为true时当鼠标移到浏览按钮上时有反转效果。   width : 设置浏览按钮的宽度 ,默认值:110。   height : 设置浏览按钮的高度 ,默认值:30。   wmode : 设置该项为transparent 可以使浏览按钮的flash背景文件透明,并且flash文件会被置为页面的最高层。 默认值:opaque 。   cancelImg :选择文件到文件队列中后的每一个文件上的关闭按钮图标 Uploadify还自带了很多参数及有用的方法和回调函数,都在API里,虽然是全英文的,但很容易看懂,这里就不说了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值