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

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

      }

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

  • 相关阅读:
    姐姐的vue(1)
    LeetCode 64. Minimum Path Sum 20170515
    LeetCode 56. 56. Merge Intervals 20170508
    LeetCode 26. Remove Duplicates from Sorted Array
    LeetCode 24. Swap Nodes in Pairs 20170424
    LeetCode 19. Remove Nth Node From End of List 20170417
    LeetCode No.9 Palindrome Number 20170410
    LeetCode No.8. String to Integer (atoi) 2017/4/10(补上一周)
    LeetCode No.7 Reverse Integer 2017/3/27
    LeetCode No.4 Median of Two Sorted Arrays 20170319
  • 原文地址:https://www.cnblogs.com/bluealine/p/5728972.html
Copyright © 2011-2022 走看看