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

    一般表单文本框提示信息:placeholder=" ",默认颜色是灰色的,输入文本信息也是默认为黑色的,如图所示: 修改placeholder提示内容的颜色关键代码及实现: 实现输 ...

  2. 设计模式六大原则(5)—迪米特法则

    定义: 一个对象应该对其它的对象保持最少的了解.迪米特法则又称为最少知识法则,英文全称为Least Knowledge Principle ,简称为LKP. 个人理解: 迪米特法则主要目的是类间解耦, ...

  3. Rhel6-cacti+nagios+ganglia(nginx)配置文档

    (lnmp平台) 系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.185 server85.example.com 1 ...

  4. jsoup 简介

    Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从HTML中攫取你所需的信 ...

  5. 快消零售行业怎么用K2做开关店管理?

    提起迪卡侬,想到的便是它汇聚所有运动于同一个屋檐下的盛况.从来没有一家体育用品零售店可以像迪卡侬一样,涵盖几乎所有级别的运动产品.从入门级到最专业的运动产品,应有尽有,不仅产品质量有保证,价格也平易近 ...

  6. iOS打开百度地图、高德地图导航

    1.判断手机里是否已经安装了百度地图或者高德地图: BOOL hasBaiduMap = NO; BOOL hasGaodeMap = NO; if ([[UIApplication sharedAp ...

  7. [转]Android,Yocto,Meego构建系统的区别

    http://m.blog.csdn.net/blog/sonach_tjsd/6647829

  8. hdu 2059

    ps:终于解决了....卡了我好久.最后用了DP.然后还有记忆化搜索优化了一下.终于AC了 思路:要计算dp[n](就是到第n个站的最短时间,也就是最优方案),必须知道dp[0]到dp[n-1] 设j ...

  9. hadoop map-red的执行过程

    hadoop的 map-red就是一个并行计算平台,我们在使用这个平台的时候,要做的事情就是提交自己定制的任务(job,主要定制map类,reduce类,combine类等类),然后设置job的各种参 ...

  10. innerHTML,innerText,outHTML,outText区别

    <p><div id="div" style="background-color:#ff9966;border:1px #ff0000 dashed;& ...