zoukankan      html  css  js  c++  java
  • PHP上传大文件 分割文件上传

    PHP上传大文件 分割文件上传

    作者:Eamonn 发布时间:2012-03-24 14:49 访问:523 分类:PHP & Mysql

      最近遇到这么个情况,需要将一些大的文件上传到服务器,我现在拥有的权限是只能在一个网页版的文件管理系统来进行操作,可以解压,可以压缩,当然也可以用它来在线编辑.php文件。

      文件有40M左右,但是服务器的上传文件最大限制是20M。首先想到了使用ini_set函数将upload_max_filesize的值设置大一些,但是有注意到了这个值使用ini_set设置时无效的,所以放弃了该方法。

      echo "Old upload max filesize is ";

      //取得原始值

      print(ini_get("upload_max_filesize"));

      echo "<br>";

      //设置新值

      ini_set("upload_max_filesize","3M");

      echo "New upload max filesize is ";

      //查看当前值

      print(ini_get("upload_max_filesize"));

      echo "<br>";

      echo "Now restore........";

      echo "<br>";

      //恢复原始值

      ini_restore("upload_max_filesize");

      echo "Old upload max filesize is ";

      echo ini_get("upload_max_filesize");

      echo "<br>";

      上面这段PHP代码就能很好的证明一切。

      后来想的是可否使用flash将本地文件先分割为一块一块的,然后再逐块上传到服务器,服务器那边使用php脚本再重新组合该文件。理论上是这样,但是查了相关资料,好像还是不可行的,原因还是因为flash上传文件也是只请求了一次php脚本程序。而且好像flex也是不可以分割文件上传的,这应该是flex设计之初的规则。

      另外,还看到:

      Flash Player 8可以支持100MB以下的大文件上传。目前,已经有许多网站利用Flash Player的这个特性来上传大文件了。例如著名的youtube,Box.net国内的G宝盘等等。在互联网上,很早我就找到了这个不错的开源swf上传组件:SWFUpload,但是由于它不太符合项目需求,并且没有帮助材料,我对它进行了一些修改。

      可这个要求还是需要设置服务器的最大上传大小,我没有此操作权限,所以还是放弃了该方法。时间紧啊,没办法,最后想了一个笨方法,那就是现在本地使用程序吧文件分割一下,小于20M,上传到服务器上之后,再用php重新组合一下。以下附上分割和组合文件的代码。

      /*

       * 分割文件 

       * 默认大小 10M=10485760

       */

      function file_split($file,$block_size=10485760)

      {

       $block_info=array();

       $size=filesize($file);

       $i=0;

       while($size>0){

       $block_info[]=array(

       'size'=>($size>=$block_size?$block_size:$size),

       'file'=>$file.'.'.($i++).'.esplit'

       );

       $size-=$block_size;

       }

      

       $fp   = fopen($file,"rb");

       foreach ($block_info as $bi) {

       $handle = fopen($bi['file'],"wb");

       fwrite($handle,fread($fp,$bi['size']));     

       fclose($handle);

       unset($handle);

       }

       fclose ($fp);

       unset($fp);

      }

      

      /*

       * 合并文件

       * 如果合并后的文件为 CPCUxcp111.flv.0.esplit 

       * 则 file=CPCUxcp111.flv,不包含.x.esplit后缀

       * save_file为另存为的文件名

       */

      function file_combine($file,$save_file=''){

       $filename=basename($file);

       $filepath=dirname($file).'/';

       $block_info=array();

       for($i=0;;$i++){

       if(file_exists($file.'.'.$i.'.esplit') && filesize($file.'.'.$i.'.esplit')>0){

       $block_info[]=$file.'.'.$i.'.esplit';

       }else{

       break;

       }

       }

       if($save_file){

       $fp   = fopen($save_file,"wb");

       }else{

       $fp   = fopen($file,"wb");

       }

       foreach ($block_info as $block_file) {

       $handle = fopen($block_file,"rb");

       fwrite($fp,fread($handle,filesize($block_file)));     

       fclose($handle);

       unset($handle);

       }

       fclose ($fp);

       unset($fp);

      }

      问题算是解决了,不过这方面有时间还应该研究一下。因为这个方法要是可以使用客户端这样分块发送过去的话,那么就是可行的了。

  • 相关阅读:
    WinRAR5.01注册码附注册机
    PS不能存储,因为程序错误
    mysql中 date datetime time timestamp 的区别
    sublime text 3 3126 注册码+中文包
    IIS7.5 用 IIS AppPool应用程序池名 做账号 将各站点权限分开
    linux vi 报错 E37: No write since last change (add ! to override)
    Linux 安装 apache2.4.23
    三级分类及名称及列表
    二级栏目名称及列表
    每隔N行输出不同样式
  • 原文地址:https://www.cnblogs.com/ericyuan/p/2726380.html
Copyright © 2011-2022 走看看