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);

  }

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

posted on 2012-10-16 17:15 ericyuan 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/ericyuan/archive/2012/10/16/2726380.html

PHP上传大文件 分割文件上传相关推荐

  1. html限制视频上传大小,微信公众号怎么上传大视频?可以上传多大的视频?

    原标题:微信公众号怎么上传大视频?可以上传多大的视频? 想在公众号文章中插入视频,但不知道公众号可以传多大的视频,这篇文章会给你答案,继续看下去吧~ 微信公众号视频大小限制多少 当写公众号文章时,我们 ...

  2. linux 读取zip文件内容,如何从linux服务器上的大(30Gb)zip文件中提取文件

    1)从大型zip文件中提取 我想从linux服务器上的大型zip文件(30Gb)中提取文件.有足够的可用磁盘空间. 我试过jar xf dataset.zip.但是,按钮已满,出现错误,无法提取所有文 ...

  3. php上传文件到七牛云,如何使用php上传大文件到七牛云储?

    按照官方文档写的简易上传, 上传大一点的文件或是中文名文件就会失败,如何解决? index.php index.php enctype="multipart/form-data"& ...

  4. php 直接上传到七牛云,七牛云存储-如何使用php上传大文件到七牛云储?

    按照官方文档写的简易上传, 上传大一点的文件或是中文名文件就会失败,如何解决? index.php index.php upload.php upload.php Token(null); $putE ...

  5. 华为服务器上传文件,云服务器上传文件方式

    云服务器上传文件方式 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装数据传 ...

  6. ftp服务器只能上传文件,ftp服务器上传文件不行

    ftp服务器上传文件不行 内容精选 换一换 本文介绍如何在 Linux 系统的本地机器上使用 FTP 服务,将文件从本地上传到云服务器中.已在待上传文件的云服务器中搭建 FTP 服务.如果您的云服务器 ...

  7. ftp服务器批量上传文件,bat批量上传ftp文件到服务器

    bat批量上传ftp文件到服务器 内容精选 换一换 CDM支持周期性自动将新增文件上传到OBS,不需要写代码,也不需要用户频繁手动上传即可使用OBS的海量存储能力进行文件备份.这里以CDM周期性备份F ...

  8. csplit 分割文件

    csplit 按行分割,split 按大小分割. csplit命令是split的一个变体,split只能够根据文件大小或行数来分割,但csplit能够根据文件本身特点来分割文件. csplit命令用于 ...

  9. python 做个创越火线挂_一日一技:用Python做个能挂墙上的大钟表

    今天给大家分享 1 个非常实用的 python 技能--用 Python 做个能挂墙上的大钟表,先上成果视频: 本项目用到的库主要有 pygame . math . datetime 等,另外还用到一 ...

最新文章

  1. Docker 入门系列(2)- Docker 镜像, 免 sudo 使用 docker 命令、获取查看、修改镜像标签、查找删除创建镜像、导入导出镜像
  2. Android实例开发中如何创建第一个项目(android studio)
  3. python postmessage_解惑:Postmessage函数模拟鼠标单击指定坐标
  4. 第八篇、盒子模型和距中的设置方法
  5. xaml修改后台代码的值_Django定制后台和修改模型
  6. 苹果7plus元件分布图_苹果iphone7 plus手机拆解全过程评测 iphone7 plus拆机图解教程...
  7. day22 模块-collections,time,random,pickle,shelve等
  8. Docker完全自学手册
  9. php blog to explore
  10. Android深度探索(卷1)HAL与驱动开发 心得体会 第十章 嵌入式Linux的调用技术
  11. 舍选法抽样matlab,舍选抽样法.PPT
  12. Application_Start 不执行
  13. 机器学习—XGBoost实战与调参
  14. 游戏思考04补充:网络游戏同步算法的理解(参考网易雷火jerish的文章,未完待续7/23,参考文献附尾,物理同步已更新完)
  15. dsp2812 c语言数据类型长度,DSP2812代码长度超出RAM容量,有谁遇到过吗?
  16. android speex 音频采样率,speex进行音频去噪
  17. 关于信号发生器的功能和参数介绍(一)
  18. Java:javax.mail通过163服务器发送邮件
  19. java espresso车架,只爱钢架公路:Casati Espresso
  20. 若依前后端分离框架——初始化参数功能源码学习

热门文章

  1. 7位格雷码计算风向_七哥特刊|从二轮秀到队内得分王 格雷厄姆会新的蜂王吗?...
  2. python二级证书考试时间表_2019上半年计算机二级考试时间:3月30日至4月1日
  3. html根据菜单角色配置菜单代码,CSS设置列表样式和创建导航菜单实现代码
  4. 英文c语言笔试题,关于C语言模拟笔试题
  5. 如果一栋楼起火谁赔偿_太原一辆快递车起火!赶紧看看有你的包裹没?
  6. android弹窗设计,想印:UI设计中弹窗设计的五条基本原则
  7. 第一个JavaWeb项目——教室预约系统
  8. Hadoop系列之Aggregate用法
  9. 转:全卷积网络(FCN)与图像分割
  10. DCMTK DCMSCU例子