1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > PHP上传大文件 分割文件上传

PHP上传大文件 分割文件上传

时间:2023-07-04 13:07:36

相关推荐

PHP上传大文件 分割文件上传

PHP上传大文件 分割文件上传

PHP上传大文件 分割文件上传

作者:Eamonn 发布时间:-03-24 14:49 访问:523 分类:PHP & Mysql

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

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

echo"Olduploadmaxfilesizeis";

//取得原始值

print(ini_get("upload_max_filesize"));

echo"<br>";

//设置新值

ini_set("upload_max_filesize","3M");

echo"Newuploadmaxfilesizeis";

//查看当前值

print(ini_get("upload_max_filesize"));

echo"<br>";

echo"Nowrestore........";

echo"<br>";

//恢复原始值

ini_restore("upload_max_filesize");

echo"Olduploadmaxfilesizeis";

echoini_get("upload_max_filesize");

echo"<br>";

上面这段PHP代码就能很好的证明一切。

后来想的是可否使用flash将本地文件先分割为一块一块的,然后再逐块上传到服务器,服务器那边使用php脚本再重新组合该文件。理论上是这样,但是查了相关资料,好像还是不可行的,原因还是因为flash上传文件也是只请求了一次php脚本程序。而且好像flex也是不可以分割文件上传的,这应该是flex设计之初的规则。

另外,还看到:

FlashPlayer8可以支持100MB以下的大文件上传。目前,已经有许多网站利用FlashPlayer的这个特性来上传大文件了。例如著名的youtube,国内的G宝盘等等。在互联网上,很早我就找到了这个不错的开源swf上传组件:SWFUpload,但是由于它不太符合项目需求,并且没有帮助材料,我对它进行了一些修改。

可这个要求还是需要设置服务器的最大上传大小,我没有此操作权限,所以还是放弃了该方法。时间紧啊,没办法,最后想了一个笨方法,那就是现在本地使用程序吧文件分割一下,小于20M,上传到服务器上之后,再用php重新组合一下。以下附上分割和组合文件的代码。

/*

*分割文件

*默认大小10M=10485760

*/

functionfile_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_infoas$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为另存为的文件名

*/

functionfile_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_infoas$block_file){

$handle=fopen($block_file,"rb");

fwrite($fp,fread($handle,filesize($block_file)));

fclose($handle);

unset($handle);

}

fclose($fp);

unset($fp);

}

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。