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

  }

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

PHP上传大文件 分割文件上传的更多相关文章

  1. GodSon Easyui 结合Pluplaod插件的文件分割上传

    自己整理了一个文件分割上传的实例,提供研究学习使用. 在线查看效果       下载该资源pluplaod文件分割上传Demo.zip 简介: 首先,进入页面会看到下面的效果: 点击一个按钮,出现如图 ...

  2. split,cdn,shell脚本,tmux,记一次往国外服务器传大文件的经历

    需求是这样的:将一个大概680M的Matlab数据文件传到国外某所大学的服务器上,服务器需要连接VPN才能访问,由于数据文件太大,而且如果我直接ssh连过去或者用ftp传输,那么中间很可能中断. ps ...

  3. Linux大文件分割split和合并cat使用方法

    本文主要介绍linux下两个命令:split和cat.其中,相信大家都熟悉cat命令,一般用来查看一个文件的内容,但是它还其它的功能,比如这里要介绍的文件合并功能,它可把多个文件内容合并到一个文件中. ...

  4. matlab 重命名文件和文件夹

    1.查看文件存在  dir() 若存在,返回文件信息      dir(‘test.txt’) %查看当前目录是否存在test.txt文件 dir(‘C:\test.txt’) %查看指定目录是否存在 ...

  5. android下大文件分割上传

    由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. //文件分割上传 ...

  6. js大文件分割上传

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  7. PHP + JS 实现大文件分割上传

    服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...

  8. Html5 突破微信限制实现大文件分割上传

    先来前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content=&q ...

  9. formdata方式上传文件,支持大文件分割上传

    1.upload.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <h ...

随机推荐

  1. CSS 高级技巧汇总

    在我们平时写代码的时候没有没有掌握一些CSS技巧呢? 今天给大家分享一个<CSS 高级技巧汇总让你的代码简洁高效>.大家务必掌握这些小技巧,会让你非常高效率的写出网页的. ◆使用 :not ...

  2. asp.net还原备份数据库(C#)

    因为做项目的时候用到对数据库的还原和备份,第一次接触,所以上网查了关于这方面的资料,网络果然是个好东西,该有的都有了,这里我就把原文中的代码直接粘贴过来了. using System; using S ...

  3. cocos2d-x 中的坐标系

    cocos2d-x 中的坐标系是笛卡尔坐标系,向右为 x 轴正方向,向上为 y 轴正方向,以像素为单位 原点在屏幕左下角的坐标系叫世界坐标系,是整个游戏中的根基,直接添加到场景中的节点,设置的位置都是 ...

  4. ubuntu科学计算包blas和lapack的安装

    该包是高性能的线性代数计算库,两个包一般是相互依赖,因此选择同时介绍其安装: 官方发布如今是lacpack-3.5.0.tgz,获取方法是网址.但打不开,ubuntu一般用 wget http://w ...

  5. 2、Linux系统root用户忘记密码的重置方式

    .界面按空格暂停,按E .找到UTF-,在后面空格后输入init=/bin/sh 然后CHRL+X启动 .进入到这个界面,输入mount -o remount,rw / .输入passwd..然后输入 ...

  6. JavaScript基础--DOM对象(十三):(windows对象:history\location\navigator\screen\event)

    DOM编程1.为什么要学习DOM(1) 通过dom编程,我们可以写出各种网页游戏(2)dom编程也是ajax的重要基础2.DOM编程介绍DOM = Document Object Model(文档对象 ...

  7. 北大poj-1088

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 88484   Accepted: 33177 Description ...

  8. Lua协程

    协作例程 1.同一时刻仅一个例程在运行 2.执行权让渡和恢复[栈]

  9. php建立MySQL数据表

    <?php $connect = mysql_connect("127.0.0.1","root",""); mysql_select ...

  10. MetaPhlAn 2:宏基因组进化分析

    描述 MetaPhlAn是分析从物种水平分辨率宏基因组鸟枪法测序数据的微生物群落(细菌,古细菌,真核细胞和病毒)的组成的计算工具.从版本2.0,MetaPhlAn还能够确定具体的菌株(在将样品含有先前 ...