相信每个做web的程序员都曾经被large file 的上传困扰过,这个问题的出现是由于(1)网络带宽不足(或是网络不稳定)如果是在局域网内呢,呵呵^_^,目前大多数用户的带宽还较为有限。(2)HTTP 协议自身的问题,HTTP 全称是超文本传输协议(Hypertext Transfer Protocol),不是为了传输文件设计的。文件传输首选当然是FTP (File Transfer Protocol)。
优酷网大家都很熟悉吧,是做视频点播的网站,很多视频都是网友上传的,视频文件都很大。他们的文件上传使用的flash,特别酷,能够显示文件上传的进度。初见感觉很神奇,一直想自己实现一把,但是始终没有机会。这段时间有机会尝试了。。。
废话不说了,开始正题:
首先要有一个有效的开发工具,“工欲善其事,必先利其器”么,我用的是Adobe 去年刚出的Flash CS3 试用版,界面很炫,支持ActionScript 3。
一 : FLASH UPLOAD:
使用 fileReference 类,此功能是期待已久的。FileReference 类提供了在用户计算机和服务器之间上载和下载文件的方法,在上载期间通过 fileReference.browse() 方法浏览和选择本地文件 ;使用 fileReference.upload ("/upload.php")方法能够将文件发送到服务器上, 然后由upload.php通过$_FILES['Filedata'] 将临时文件转移到发布目录。
此类实现的事件如下:
通过 progress 事件,能够获取文件上传进度,其属性值包括:
具体代码如下:
.FileReference;
varurl:URLRequest=newURLRequest();
url.url="http://172.16.6.245:88/upload.php";
varfileRef:FileReference=newFileReference();
fileRef.addEventListener(Event.SELECT,selectHandler);
fileRef.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
fileRef.addEventListener(ProgressEvent.PROGRESS,progressHandler);
fileRef.addEventListener(PLETE,completeHandler);
fileRef.browse();
functionselectHandler(event:Event):void
{
fileRef=FileReference(event.target);
trace("onSelect:"+fileRef.name);
fileRef.upload(url);
}
functionioErrorHandler(event:IOErrorEvent):void
{
trace("ioErrorHandler:"+event);
}
functionprogressHandler(event:ProgressEvent):void
{
trace("progressHandler:name="+fileRef.name+"bytesLoaded="+event.bytesLoaded+"bytesTotal="+event.bytesTotal);
}
functioncompleteHandler(event:Event):void
{
trace("completeHandler:name="+fileRef.name+"uploadsuccess!!");
}
注意:进度控制等信息我都放到了控制台,我的源程序和UI效果并不是这样的,主要是为了方便网友调试网友可根据自己的需要调整程序。
FLASH 效果图:
(1)初始效果:
(2)选择文件:
(3)开始上传
是不是相当像优酷网的视频上传哈!!
二、服务端脚本(PHP):
服务端文件处理的脚本很简单了,我就不多讲了,下面是我的源代码,安全这方面没做过多控制,大家自己把握哈。
<? php
$upload_dir = " /var/www/html/test/upload " ;
$attachment = $_FILES [ ' Filedata ' ];
$filename = $attachment [ ' name ' ];
$fileext = substr ( strrchr ( $filename , ' . ' ) , 1 );
$path = $upload_dir . " / " . my_rand( 15 ) . " . " . $fileext ;
move_uploaded_file ( $attachment [ ' tmp_name ' ] , $path );
function my_rand( $length ){
$chars = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 " ;
$end = strlen ( $chars ) - 1 ;
for ( $i = 0 ; $i < $length ; $i ++ ){
$hash .= $chars [ mt_rand ( 0 , $end )];
}
return $hash ;
}
?>
三、lighttpd 服务器
众所周知, Lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。其虽没有apache 功能那么强大,其优势在于快速、安全。(国外很出名的视频网站,被google 天价16.5亿收购了)就是在lighttpd 上构建的,还有很多网站的图片服务器也是它。
使用lighttpd 来处理大文件的上传,能够在一定程度上降低apache 服务的负荷,增强其负载能力。
lighttpd 能和PHP 以CGI 或 FASTCGI 两种方式结合:
我采用的是CGI,因为fastcgi 的安装还要重新编译PHP :
(1) fastcgi
$ ./ configure
-- enable - fastcgi
-- enable - discard - path
-- enable - force - cgi - redirect编译之后,使用# php -v
可以看到版本信息中含有 eAccelerator ,这表明PHP安装成功。
(2) cgi
修改 lighttpd.conf配置文件
第一处: cgi.assign = ( ".php" => "/usr/bin/php-cgi")
第二处: server.modules 中的 "mod_cgi" 的行注释删除。
关于 lighttpd 和 php 配置的问题我就不详细叙述了,网上一搜一大把。。。
就此为止了,大家有啥问题,可以邮件给我,我会尽力帮大家解决的。。
邮箱: fhc_9980@
源文件下载地址:
/source/752977