唉,第一次写文章,真是很紧张,这是前几天在网上查资料和自己研究的结果,希望能对一些朋友有用。水平所限,肯定有错漏之处,烦劳高手指正,不胜感激!
下面就书归正传:
Flash 以Javascript 为中介和 ASP/PHP 交互
我们班有同学录,人气比较旺。前一段时间管理员托我写一个基于 HTML 的播放器放在班级留言上面,要求很简单,就是实现循环播放。于是就写了一个,比较容易,无非就是 Javascript 的操作和 ActiveX 控件的交互,查了查 MSDN 决定用 WMP 的 ActiveX 插件。写完后,播放效果总是不尽如人意,不知是我写的 Javascript 有问题还是 WMP 的 Javascript 接口有问题,在播放的时候有时不能循环。后来突然想到了 Flash 7.0 也是可以播放 mp3 的,于是开始了设计(没学过系统工程所以不标准,但愿不会贻笑大方):
目标:
1. 播放mp3,基本播放控制功能(暂停,继续,索引,音量控制等);
2. 当前曲目循环、列表曲目循环
实现:
1. 音乐列表从数据库中动态检索
2. 提供添加音乐 URL 的界面
这里,我的思路是:用户访问 ASP(PHP) 页面 => ASP(PHP) 请求数据库 => 返回数据集 => ASP(PHP) 将数据集写为 Javascript 变量 => Javascritp 通过 Flash 的接口函数写到 Flash 中的 DynamicText 变量中 => Flash 将列表显示
这样就出现了一个问题,文件列表的数量是不定的,怎么在 Flash 中处理,设置几个变量呢?我的解决办法是(也许不是很好的办法,但是却很简单,如果高手有更好的方法,请不吝赐教,谢谢了):在 Flash 中设置两个变量,一个是保存文件名 varSongname 另一个是保存 URL varUrl。在 Server 端就生成形如(本文中的英文引号被自动替换成了中文引号,请注意):
var strSongname = “Songname1,Songname2,Songname3“;
的客户端 Javascript 的变量定义/赋值语句,然后再使用 SetVariable() 语句将此变量传入 Flash 中,Flash 就将字符串 split() 成数组,然后,不用我教了吧?各就各位的显示出来吧
在这样的思路指导下,诞生了3个文件(sFMP的意思是simple Flash MP3 Player) 1 ) sFMP.swf - Flash 文件作为用户界面;2 ) sFMP.asp (.php) - 请求数据库将文件列表作为 Javascript 的变量写入返回的 HTML 文件;3 ) add.asp (.php) 添加 URL 的页面。下面就具体讲解每个文件的程序逻辑,和工作步骤:
sFMP.swf 的制作
由于用的是 Flash MX 2004 Professional 所以直接就借用了里面许多组件。(不过要慎重,因为一旦加入 ActionScript 2.0 和组件的支持,文件就会增肥,一般会变大60多KB,视使用组件多少而定。具体原因可能是要包含许多组建库的缘故吧?)下面是里面使用到的组件:
MediaPlayback 组件:
可以直接播放 MP3 很方便。其包括很多属性和方法、事件。Macromedia 里面有比较详细的说明。
InstanceName: _player
Action:
on (load) { // 可以插入一些播放器初始化代码
}
on (complete) { // 这个事件当一首音乐播放完毕时产生
// switching process
if (_root._cbLoopCur.selected == true) {
// 当选择了循环播放当前曲目
_root._player.play();
} else {
if (_root._cbLoopAll.selected == true) {
// 选择了循环播放全部列表曲目
var iIndexRead:Number = _root.SongsList.selectedIndex;
// 将列表中的选择高亮条下移一个
// 如果已经到末尾则重置
iIndexRead++;
if (iIndexRead > _root.SongsList.length - 1) {
// set current song index = 0
iIndexRead = 0;
}
// 更新 List 显示
_root.SongsList.selectedIndex = iIndexRead;
// 这里调用一个函数用来取得播放列表当前选择的 URL
// 并用setMedia()和play()方法使播放器播放曲目
// 由于比较简单所以略掉了
}
}
}
on (change) { // 正在播放音乐时候
}
on (progress) { // 正在下载音乐文件的时候
}
List 组件:
用来显示从数据库中检索的文件列表。
InstanceName: SongsList
Action:
on (change) {
// player control
// get list item data
var str:String = this.getItemAt(this.selectedIndex).data;
if (str.length>0 && str != undefined) {
// open the URL
_root._player.setMedia(str, "MP3");
if (_root._player.contentPath.length>0) {
_root._player.play();
}
}
}
/*
从列表中读出当前选择的文件,取得其的 data (假设已经从数据库中读出所需资料,label 显示文件名
data 则储存的是文件的 URL)
由于将 MediaPlayback 组件设为 Autostart = false 所以需要运行 play() 方法使其开始播放
如果 Autostart = true 则一旦设置了 contentPath 属性,就立即载入并播放
*/
Checkbox 组件:
有两个,分别用来选择是单曲循环还是列表循环。
InstanceName: _cbLoopCur 、_cbLoopAll
Action:
两者是互斥关系,选择一个就取消另一个,两个都不选就是播放选择曲目一遍,代码简单,略。
Dynamic Text 框:
有两个,虽然不是组件,但却是和 Javascript 等实现交互的关键。
Variable: varSongname 、varUrl
两个变量分别是保存外界传入的文件名和 URL 。
Tips:
在 Javascript 中,Flash 专门提供了很多接口函数,这里用到的就是设置 Flash 中变量的 SetVariable(variable_name,value) 函数;Flash 中,也提供了一个和 Javascript 交互的 ActionScript 函数 fscommand() 。
sFMP.asp(php) 文件程序逻辑:
这个的程序很简单,我就不废话,直接贴代码了,如果有不懂的,可以问我,电子邮件联络。
<%
' 这是 sFMP.asp 的部分源代码,经过了一些修改,可能会包含一些错误,因为没有经过测试
' 有一些环境可能和你机器上面不同,请相应修改。
' 修改前的完整源代码是经过 Windows98 + PWS + Access 环境的测试的
' 所以使用之前请仔细检查有无拼写或其他明显错误,谢谢!
Option Explicit
Dim rsFiles, cnn, strSql, strCnn
' 使用 ADO 链接数据库,取得数据集,常规做法没什么好讲的
strCnn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("songs.mdb")
Set cnn=Server.CreateObject("ADODB.Connection")
cnn.Open strCnn
strSql="SELECT * FROM songsInfo WHERE type='mp3' ORDER BY id DESC"
Set rsFiles=Server.CreateObject("ADODB.RecordSet")
rsFiles.CursorLocation=3
rsFiles.Open strSql,cnn,2,3
' 如果取得数据集失败则停止执行,输出错误
If TypeName(rsFiles)="Nothing" Then
Response.Write("open RecordSet error<br>")
Response.End()
End If
%>
<!-- 略去 HTML 代码,大家可以自己加上 -->
<script language="javascript">
<%
Dim strName, strUrl
' 遍历数据集,准备输出字符串
If rsFiles.RecordCount > 0 Then
' 要将字符串准备成 var url = "url1,url2,url3"; 这样的形式
strName = rsFiles.Fields("name") ' 这是取得文件名
strUrl = rsFiles.Fields("url") ' 这是取得其URL
rsFiles.MoveNext
Do While NOT rsFiles.EOF
strName = strName & "," & rsFiles.Fields("name")
strUrl = strUrl & "," & Replace(rsFiles.Fields("url")
rsFiles.MoveNext
Loop
End If
' 输出
Response.Write("var url = "& Chr(34) & strUrl & Chr(34) & ";" & vbCrlf & "var songName = "& Chr(34) & strName& Chr(34) & ";" & vbCrlf)
' 关闭数据集,释放资源
Set rsFiles = Nothing
cnn.Close()
Set cnn = Nothing
%>
myFlashObj.SetVariable("varUrl", sound[iIndexRead]);
myFlashObj.SetVariable("varSongName", songName[iIndexRead]);
</script>
<!-- 略去 HTML 代码,大家可以自己加上 -->
以上的 ASP 的代码,其实 sFMP.php 也很简单,链接数据库换成 mysql_connect / mysql_db_query / mysql_fetch_object 相应函数 Response.Write()换成echo 就可以了。由于我的 php 页面不是使用的 Javascript 和 Flash 交互的方式(而是下面将要讲的 Flash 和 ASP(PHP) 直接交互的方式),所以没有这方面的代码,不好意思了。
add.asp(php) 的程序逻辑:
这个就更简单了,需要一个表和一段ASP(PHP)代码就搞定了:
这是 HTML 表单,包含在add.asp(php)文件中,其 action 就是指向自己
<!-- php 文件中 action=add.php -->
<form action="add.asp" method="post">
名字:<input name="name" type="text" >
链接地址:<input name="url" type="text" ></td>
<input type="submit" name="Submit" value="提交"><input name="Reset" type="reset" value="重置">
</form>
<%
' 这是 add.asp 的部分源代码,经过了一些修改,可能会包含一些错误,因为没有经过测试
' 有一些环境可能和你机器上面不同,请相应修改。
' 修改前的完整源代码是经过 Windows98 + PWS + Access 环境的测试的
' 所以使用之前请仔细检查有无拼写或其他明显错误,谢谢!
Dim strOutput
Dim strNameOfSong:strNameOfSong = Trim(Request.Form("name"))
Dim strUrl:strUrl = Trim(Request.Form("url"))'Server.URLEncode()
If Len(strUrl) > 0 Then
' 其中可以添加对 URL 的合法性检查,这里略去
strCnn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("songs.mdb")
Set cnn=Server.CreateObject("ADODB.Connection")
cnn.Open strCnn
strSql="INSERT INTO songsInfo (url, name) VALUES ('"&strUrl&"','"&strNameOfSong&"')"
If IsEmpty(cnn.Execute(strSql)) Then
strOutput = "添加数据失败,可能数据库出了点问题,请联系管理员,谢谢使用!"
Else
strOutput = "添加数据成功,您可以继续添加,谢谢使用!"
End If
End If
%>
<%
Option Explicit
' 这是 add.asp 的部分源代码,经过了一些修改,可能会包含一些错误,因为没有经过测试
' 有一些环境可能和你机器上面不同,请相应修改。
' 修改前的完整源代码是经过 Windows98 + PWS + Access 环境的测试的
' 所以使用之前请仔细检查有无拼写或其他明显错误,谢谢!
Dim rsFiles, strDisp,cnn, strSql, strCnn
' create and open a connection object
strCnn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("songs.mdb")
Set cnn=Server.CreateObject("ADODB.Connection")
cnn.Open strCnn
' execute a SQL to create a RecordSet object
strSql="SELECT * FROM songsInfo WHERE type='"&strAsk&"' ORDER BY id DESC"
Set rsFiles=Server.CreateObject("ADODB.RecordSet")
rsFiles.CursorLocation=3
rsFiles.Open strSql,cnn,2,3
' if fails the result will be a Nothing object
If TypeName(rsFiles)="Nothing" Then
Response.Write("open RecordSet error<br>")
Response.End()
End If
' walkthrough the recordset and
' prepare URL/POST variables strings
Dim strName, strUrl
If rsFiles.RecordCount > 0 Then
strName = rsFiles.Fields("name")
strUrl = rsFiles.Fields("url")
rsFiles.MoveNext
Do While NOT rsFiles.EOF
strName = strName & "," &rsFiles.Fields("name")
strUrl = strUrl & "," & rsFiles.Fields("url")
rsFiles.MoveNext
Loop
End If
'response to client
Response.Write("SongName=" & Server.URLEncode(strName) & "&URL=" & strUrl)
' close the connection
' release resource
Set rsFiles = Nothing
cnn.Close()
Set cnn = Nothing
%>
<?php
$result = executeSql("SELECT * FROM songsInfo WHERE type='$strWhere' ORDER BY id DESC");
if (!$result) {
HandleErrors(__FILE__.':Open database error.<br>');
}else{
// walkthrough the recordset and
// prepare URL/POST variables strings
$oRows=@mysql_fetch_object($result);
$strName = $oRows->name;
$strUrl = $oRows->url;
// response to client
while ($oRows=@mysql_fetch_object($result)){
$strName .= ",".$oRows->name;
$strUrl .= ",".$oRows->url;
}
echo "SongName=".$strName ."&URL=".$strUrl
mysql_free_result($result);
}
// close the connection
// release resource
mysql_close($id_link);
?>
本文地址:http://com.8s8s.com/it/it8136.htm