lighttpd+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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
交叉编译 lighttpdphp_fpm 需要进行以下步骤: 1. 安装交叉编译工具链:根据目标平台选择合适的交叉编译工具链,例如 arm-linux-gnueabi-gcc 或者 aarch64-linux-gnu-gcc 等,并将其添加到 PATH 环境变量中。 2. 下载 lighttpdphp 源码:从官网下载 lighttpdphp 的源码包,例如 lighttpd-1.4.54.tar.gz 和 php-7.4.16.tar.gz。 3. 解压源码包:使用 tar 命令解压源码包,例如: ``` tar zxvf lighttpd-1.4.54.tar.gz tar zxvf php-7.4.16.tar.gz ``` 4. 进入 lighttpd 源码目录:进入解压后的 lighttpd 源码目录,例如: ``` cd lighttpd-1.4.54 ``` 5. 配置编译选项:使用交叉编译工具链配置编译选项,例如: ``` ./configure --host=arm-linux-gnueabi ``` 6. 编译 lighttpd:使用 make 命令编译 lighttpd,例如: ``` make ``` 7. 进入 php 源码目录:返回上级目录,进入解压后的 php 源码目录,例如: ``` cd ../php-7.4.16 ``` 8. 配置编译选项:使用交叉编译工具链配置编译选项,例如: ``` ./configure --host=arm-linux-gnueabi --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --disable-short-tags --disable-phpdbg ``` 其中,--with-pdo-mysql 和 --with-mysqli 用于支持 MySQL 数据库,--with-openssl 用于支持 SSL/TLS 加密,--enable-fpm 和 --with-fpm-user、--with-fpm-group 用于编译 php_fpm。 9. 编译 php_fpm:使用 make 命令编译 php_fpm,例如: ``` make ``` 10. 将编译完成的 lighttpdphp_fpm 拷贝到目标平台上。 以上就是交叉编译 lighttpdphp_fpm 的步骤,需要注意的是,编译选项需要根据实际情况进行调整,例如根据目标平台选择合适的交叉编译工具链、选择需要支持的模块等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值