lighttpd+flash+PHP大文件上传,带上传进度显示

Flash大文件上传
本文介绍了一种使用Flash实现的大文件上传方法,通过FileReference类及其事件监听器,实现了文件选择、上传进度显示等功能,并详细展示了Flash端代码及PHP服务端处理逻辑。

        相信每个做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 ("http://test.test.com/upload.php")方法能够将文件发送到服务器上, 然后由upload.php 通过 $_FILES['Filedata']  将临时文件转移到发布目录。
      此类实现的事件如下:

摘要定义方
Flash Player 获得操作系统焦点并变为活动状态时调度。EventDispatcher
当用户通过文件浏览对话框取消文件上载或下载时调度。FileReference
当下载操作完成或上载操作生成 HTTP 状态代码 200 时调度。FileReference
Flash Player 失去操作系统焦点并变为非活动状态时调度。EventDispatcher
当上载失败并且存在可用来描述失败的 HTTP 状态代码时调度。FileReference
当上载或下载失败时调度。FileReference
当上载或下载操作开始时调度。FileReference
在文件上载或下载操作期间定期调度。FileReference
当对 FileReference.upload() 或 FileReference.download() 方法的调用尝试将文件上载到调用方安全沙箱外部的服务器,或是从调用方安全沙箱外部的服务器上下载文件时进行调度。FileReference
当用户从文件浏览对话框选择要上载或下载的文件时调度。FileReference
成功上载并从服务器接收数据之后调度。FileReference

        通过 progress 事件,能够获取文件上传进度,其属性值包括:

属性
bubblesfalse
bytesLoaded在侦听器处理事件时加载的项数或字节数。
bytesTotal如果加载进程成功,最终将加载的项目或字节总数。
cancelablefalse;没有要取消的默认行为。
currentTarget当前正在使用某个事件侦听器处理 Event 对象的对象。
target报告进度的网络对象。
  具体代码如下:

      
import flash.net.FileReference;


var url:URLRequest = new URLRequest();
url.url = "http://172.16.6.245:88/upload.php";
var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.SELECT, selectHandler);
fileRef.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
fileRef.addEventListener(ProgressEvent.PROGRESS, progressHandler);
fileRef.addEventListener(Event.COMPLETE, completeHandler);
fileRef.browse();

function selectHandler(event:Event):void 
{
    fileRef = FileReference(event.target);
    trace("onSelect: " + fileRef.name);
    fileRef.upload(url);
}

function ioErrorHandler(event:IOErrorEvent):void
{
     trace("ioErrorHandler: " + event);
}

function progressHandler(event:ProgressEvent):void
{
     trace("progressHandler: name=" + fileRef.name + " bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}
function completeHandler(event:Event):void
{
    trace("completeHandler: name="+fileRef.name+" upload success!!");
}


注意:进度控制等信息我都放到了控制台,我的源程序和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 功能那么强大,其优势在于快速、安全。www.youtube.com (国外很出名的视频网站,被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@163.com

 
   源文件下载地址:
   http://download.csdn.net/source/752977
该程序包集成最新的Apache+Nginx+LightTPD+PHP+MySQL+phpMyAdmin+Zend Optimizer+Zend Loader,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该程序绿色小巧简易迷你仅有35M,有专门的控制面板。总之学习PHP只需一个包。   对学习PHP的新手来说,WINDOWS下环境配置是一件很困难的事;对老手来说也是一件烦琐的事。因此无论你是新手还是老手,该程序包都是一个不错的选择。 1、全面适合 Win2000/XP/2003/win7/win8/win2008 操作系统 ,支持Apache、IIS、Nginx和LightTPD。 2、该程序包集成以下软件,括号内为phpstudy下对应的目录。 php 7.0.12 php 5.6.27 php 5.5.38 php 5.4.35 php 5.2.17 Apache 2.4.23 Nginx 1.11.5 MySQL 5.5.53 MySQL-Front 5.3 phpMyAdmin 3.5.8.2 php_opcache xdebug 2.2.5 php_sqlsrv php_pdo_sqlsrv 3、MySQL数据库默认用户名:root,密码root,安装后请重新设置密码。 4、本程序纯绿色,支持22种组合一键切换,支持系统服务和非服务两种启动方式,自由切换。改变安装路径或拷贝到别的电脑上也可正常运行;即便是运行完再更改路径也能运行,真正做到无须配置。重写控制面板更加有效直观地进行控制程序的启停。 5、自带FTP服务器,支持多用户,无需再安装FTP服务器。自带网站挂马监视器,随时记录文件的修改情况,让挂马文件无处可逃。 6、本程序完美支持II7,IIS8和IIS6。应网友的要求制作Nginx版和Lighttpd版。Nginx版为phpfind,Lighttpd版为phpLight。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值