Flash向服务器发送数据失败的原因

---摘自《搜狐》

问题:

当Flash电影在浏览器中通过使用"Load Variables"(加载变量)或"Get URL"(获取链接)这项指令来向服务器发送数据信息时总发生错误,服务器端应用程序始终无法正确记录变量信息,这种现象只发生在Flash Player 4.0r20 (Macintosh)和4.0r25 (Windows)这两个版本中。

原因:

这个版本的Flash播放器在从Flash电影中传送变量时会插入一个额外的"&"符号,这就是导致采用ASP或CGI的服务器无法正确接受数据的原因。

此版本会在传送的变量数据头部插入该"&"符号,从而影响到使用"get"(获取)或"post"(发布)方式生成的电影。由于这个额外符号的存在,它将导致目标文件接收数据信息时如果未发现额外的符号即拒绝接收数据。

此问题在4.0r20和r25版本的Flash播放器中存在,但已经在4.0r26以及后续的升级版本中与以修正,您可以从Flash播放器下载中心下载最新版本的软件。

范例:

下面是一个普通的URL链接,紧跟一个查询字串:http://www.domain.com/page.asp?name=john

而下面这个URL链接不但跟有查询字串,还添加了一个"&"符号:http://www.domain.com/page.asp?&name=john

解决方案:

针对此问题我们可以提供若干种脚本编辑方法来解决。

下面提供的解决方案将不受你所安装的Flash 4播放器版本的影响。

编写新的接收脚本,让其在接收信息时将额外的字符做为所接收变量的内容的一个部分。这样Flash电影中将创建一个“虚拟”的变量,而当进行传输时该变量的名称前将被前置一个"&"符号。当Flash将数据从电影中传送至服务器时,它会把名称/数值这一对信息按创建的顺序同时传送出去。理论上讲,这应该指的是Flash电影中在第一帧图像内的第一个变量。这种方法之所以能够成功是因为这个变量与整段电影或某个片段没有任何关系,而修改的全部内容又仅局限于这个变量,其它的变量和数值都仍可正常地被服务器端系统进行处理,从而解决了上述问题。

应该说这是解决上述问题的最简单的方法,因为它只对电影做非常微小的修改。但实际操作中,由于某些Flash放映器和服务器端脚本的复杂性,在修改过程中可能还并非如想象中那样简单。

采取使用"Get URL"(获取链接)中"Send Using GET"(使用GET进行发送)这个指令来进行修改的优点在于当前时间线上所有变量信息均可自动被收集起来以便向查询字串进行输出。然而,如果仅有一部分数值被传送出去,而作者知道传输了哪些变量,就可以非常简单地使用一个表达式来将它们传送到链接的尾部。

1:添加"Get URL"(获取链接)指令,将URL区域设置为"Expression"(表达式)。
2:在上引号后添加URL的名称,并紧跟一个"?"符号以及第一个需传输的变量的名称,在最后添加一个"="等号标志。
3:标出一个下引号,跟着一个"&"符号。添加一个变量名称。
4:继续添加更多的变量,再加一个"&"符号,加一个上引号,跟着再加一个"&"符号,加下一个变量的名称,跟一个"="符号,加一个下引号,然后是另一个"&"符号,以及下一个变量的名称。重复上述步骤直至所有数值全部传输完毕。
5:在需要的情况下更改"Window:"设置,但请将"Variables:"的设置保持为"Don't Send"(不发送)状态。这一点非常重要,因为在上面的表达式中变量已经被发送出去了。最后点击"OK"结束全部操作。



这样额外的符号只是在你从主时间线上执行"Load Variables"(加载变量)或"Get URL"(获取链接)的指令来发送数据时才会从Flash电影中被发送出来。将带有上述指令的所有变量或"submit"(发送)按钮放置在电影片断中就可以按正常方式传送数据,而不包括额外的符号。Flash只是等变量位于时间线上时才会考虑变量的存在。而一个电影片断,在本便中被用于变量的“容器”,并不会被这个特殊问题所影响。

如果某个作者希望想检查用户安装的是哪个版本的Flash播放器,这可以通过使用Flash脚本编辑来实现。

Flash播放器会将一个隐藏的数值插入到Flash电影的主时间线上,这个称为"$version"的数值包含有一个字串,显示用户使用的播放器的版本号。为了获取这个数值,就需要使用"eval"函数。反馈结果字串将包含三个字母,显示出用户执行的平台,而另外一串数字则显示播放器的具体版本号。

例:

MAC 4,0,20,
0WIN 4,0,25,0

使用上面所讲的这个函数,就可以对获取到的信息进行分析,并产生一个符合逻辑的表达式,以便根据相应的情况决定具体的做法。

范例:

Set Variable: "player" = Eval("$version")
If (substring (player,9,2) eq "20" or substring (player,9,2) eq "25")
Set Variable: "user" = "They have the r20 or r25 player."
Else
Set Variable: "user" = "They do not have this player."
End If


注:"$version"变量是在第一版Flash 4播放器发布之后才在后续更新版本中添加的一个变量,因此如果用户使用的是老版本播放器,而没有包含这个变量,那么这个字串就会是空的。