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 函数: ![]() getURL(url:String, [window:String, [method:String]]) : Void 将来自特定 URL 的文档加载到窗口中,或将变量传递到位于所定义的 URL 的另一个应用程序。若要测试此函数,请确保要加载的文件位于指定的位置。若要使用绝对 URL(例如,http://www.),则需要网络连接。 可用性: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)中,打开指定的网页。 ![]() ![]() ![]() 在Flash中使用getURL函数,可以调用当前Html页面中的任何Javascript脚本。 ![]() 则web页中的: function FlashUpload_DoFScommand(command, args) { } 函数将被执行,两个函数的参数依次相对应,即会有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可以起作用。 var flash = document.getElementById("FlashObjectId"); flash.SetVariable("txtbox", "1234"); 更多关于Flash和Javascript通信的内容,可以看这里: ![]() <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","正在上传文件,请稍候 ![]() 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调用Javascript脚本来进行的,所以这个页面中没有提交按钮,假如有提交按钮,这个页本身应该可以进行文件上传。最后这个页是被放置在一个隐藏的IFrame框架中的,用户并不可见。 需要注意是就是这个页中使用SetVariable向Flash发送数据(回馈信息)。 完成后的整体运行效果,就是本文开头的那张图片。 本文示例在Flash8+.Net1.1下制作并在IE下测试通过。 |
|