php上传大文件实例代码_php分割文件上传

发布时间:2019-12-24编辑:脚本学堂
有关php上传大文件的方法,将文件进行分割实现大文件上传的实例代码,需要的朋友参考下。

php如何实现大文件上传

文件有40M左右,服务器上传文件最大限制是20M。php大文件上传设置方法
首先,想到使用ini_set函数将upload_max_filesize的值设置大一些,不过这个值使用ini_set设置时无效的,放弃了该方法。php上传大文件问题解析 

例子:
 

复制代码 代码示例:

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