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);
}
问题算是解决了,不过这方面有时间还应该研究一下。因为这个方法要是可以使用客户端这样分块发送过去的话,那么就是可行的了。
PHP上传大文件 分割文件上传的更多相关文章
- GodSon Easyui 结合Pluplaod插件的文件分割上传
自己整理了一个文件分割上传的实例,提供研究学习使用. 在线查看效果 下载该资源pluplaod文件分割上传Demo.zip 简介: 首先,进入页面会看到下面的效果: 点击一个按钮,出现如图 ...
- split,cdn,shell脚本,tmux,记一次往国外服务器传大文件的经历
需求是这样的:将一个大概680M的Matlab数据文件传到国外某所大学的服务器上,服务器需要连接VPN才能访问,由于数据文件太大,而且如果我直接ssh连过去或者用ftp传输,那么中间很可能中断. ps ...
- Linux大文件分割split和合并cat使用方法
本文主要介绍linux下两个命令:split和cat.其中,相信大家都熟悉cat命令,一般用来查看一个文件的内容,但是它还其它的功能,比如这里要介绍的文件合并功能,它可把多个文件内容合并到一个文件中. ...
- matlab 重命名文件和文件夹
1.查看文件存在 dir() 若存在,返回文件信息 dir(‘test.txt’) %查看当前目录是否存在test.txt文件 dir(‘C:\test.txt’) %查看指定目录是否存在 ...
- android下大文件分割上传
由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. //文件分割上传 ...
- js大文件分割上传
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- PHP + JS 实现大文件分割上传
服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...
- Html5 突破微信限制实现大文件分割上传
先来前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content=&q ...
- formdata方式上传文件,支持大文件分割上传
1.upload.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <h ...
随机推荐
- C#测试web服务是否可用
winform客户端经常需要调用webservice或者WCF进行数据交互,但是远程服务有可能不存在或者服务器不可用,客户端只能通过超时或者捕获到异常感知服务不可用.其实有一个COM借口可用快速的检测 ...
- cocoapods 更新失败 bad response Not Found 404 (http://ruby.taobao.org/specs.4.8.gz)
http://blog.csdn.net/dark_gmn/article/details/49274993 ERROR: Could not find a valid gem 'cocoapods ...
- SQLite存储类(数据类型)
SQLite数据类型更普遍,采用动态类型系统. 说是数据类型,更像是存储类,如:INTEGER存储类就包含多种不同长度的整数数据类型 [INTEGER]带符号的整数类型 [REAL]浮点值,小数类型 ...
- BZOJ 1969 树链剖分+Tarjan缩点
发现自己Tarjan的板子有错误.发现可以用Map直接删去边,Get. 听说std是双连通.LCA.并查集.离线思想.用BIT维护dfs序和并查集维护LCA的动态缩点的好题 #include < ...
- priority_queue 优先队列用法
//采用默认优先关系: //(priority_queue<int>que;) //Queue 0: // 91 83 72 56 47 36 22 14 10 7 3 // //采用结构 ...
- datawindow 创建操作报表。
最近制作做了几个简单的报表,写下主要的代码.以便各位参考. public void FillDW(DataTable dtbResult) { try { DataRow dtFr; ; , j = ...
- Asp.Net异步导入Excel
故事:用户在页面上传一个excel文件,程序把excel里的内容入库. 技术方案:保存文件在服务器,jquey Ajax 异步读取文件中的记录到数据库,在页面实时刷新导入情况 页面前端 <%@ ...
- (实用篇)jQuery二级联动代码
jquery二级联动城市代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...
- R读取数据的错误
使用R读取数据的时候遇到这种错误: invalid multibyte string at '<fd>' 解决方法就是: tbl <- read.delim("dir/fi ...
- pip install 出现报asciii码错误的问题
原因是pip安装python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码. 解决办法是: python目录 Python27\Lib\site-packages 建一个文件sit ...