使用php脚本将大zip文件拆分为小块

使用php脚本将大zip文件拆分为小块,php,file,split,Php,File,Split,我正在使用下面的脚本将一个大的zip文件拆分成小文件 $filename = "pro.zip"; $targetfolder = '/tmp'; // File size in Mb per piece/split. // For a 200Mb file if piecesize=10 it will create twenty 10Mb files $piecesize = 10; // splitted file size in MB $buffer = 1024; $piec

我正在使用下面的脚本将一个大的zip文件拆分成小文件

$filename = "pro.zip"; 
$targetfolder = '/tmp';

// File size in Mb per piece/split. 
// For a 200Mb file if piecesize=10 it will create twenty 10Mb files
$piecesize = 10; // splitted file size in MB


$buffer = 1024;
$piece = 1048576*$piecesize;
$current = 0;
$splitnum = 1;

if(!file_exists($targetfolder)) {
    if(mkdir($targetfolder)) {
        echo "Created target folder $targetfolder".br();
    }
}

if(!$handle = fopen($filename, "rb")) {
    die("Unable to open $filename for read! Make sure you edited filesplit.php correctly!".br());
}

$base_filename = basename($filename);

$piece_name = $targetfolder.'/'.$base_filename.'.'.str_pad($splitnum, 3, "0", STR_PAD_LEFT);
if(!$fw = fopen($piece_name,"w")) {
    die("Unable to open $piece_name for write. Make sure target folder is writeable.".br());
}
echo "Splitting $base_filename into $piecesize Mb files ".br()."(last piece may be smaller in size)".br();
echo "Writing $piece_name...".br();
while (!feof($handle) and $splitnum < 999) {
    if($current < $piece) {
        if($content = fread($handle, $buffer)) {
            if(fwrite($fw, $content)) {
                $current += $buffer;
            } else {
                die("filesplit.php is unable to write to target folder");
            }
        }
    } else {
        fclose($fw);
        $current = 0;
        $splitnum++;
        $piece_name = $targetfolder.'/'.$base_filename.'.'.str_pad($splitnum, 3, "0", STR_PAD_LEFT);
        echo "Writing $piece_name...".br();
        $fw = fopen($piece_name,"w");
    }
}
fclose($fw);
fclose($handle);
echo "Done! ".br();
exit;

function br() {
    return (!empty($_SERVER['SERVER_SOFTWARE']))?'<br>':"\n";
}
?> 
$filename=“pro.zip”;
$targetfolder='/tmp';
//文件大小(单位:Mb/件/份)。
//对于200Mb文件,如果piecesize=10,它将创建二十个10Mb文件
$piecesize=10;//拆分的文件大小(MB)
$buffer=1024;
$piece=1048576*$piecesize;
$current=0;
$splitnum=1;
如果(!file_存在($targetfolder)){
if(mkdir($targetfolder)){
echo“已创建目标文件夹$targetfolder”.br();
}
}
如果(!$handle=fopen($filename,“rb”)){
die(“无法打开$filename进行读取!请确保已正确编辑filesplit.php!”.br();
}
$base_filename=basename($filename);
$piece_name=$targetfolder.'/'.$base_filename.'..'.str_pad($splitnum,3,“0”,str_pad_LEFT);
如果(!$fw=fopen($工件名称,“w”)){
die(“无法打开$piece_name进行写入。请确保目标文件夹可写入。”.br());
}
echo“将$base_文件名拆分为$piecesize Mb文件”。br()。“(最后一个文件可能更小)。.br();
回显“正在写入$piece_name…”。br();
而(!feof($handle)和$splitnum<999){
如果($当前<$件){
如果($content=fread($handle,$buffer)){
if(写入($fw,$content)){
$current+=$buffer;
}否则{
die(“filesplit.php无法写入目标文件夹”);
}
}
}否则{
fclose($fw);
$current=0;
$splitnum++;
$piece_name=$targetfolder.'/'.$base_filename.'..'.str_pad($splitnum,3,“0”,str_pad_LEFT);
回显“正在写入$piece_name…”。br();
$fw=fopen($piece_name,“w”);
}
}
fclose($fw);
fclose($handle);
回显“完成!”.br();
出口
函数br(){
返回(!empty($\u SERVER['SERVER\u SOFTWARE'])?“
”:“\n”; } ?>
但此脚本在目标临时文件夹中拆分后不会创建小文件。脚本成功运行,没有任何错误


请帮我找出这里的问题是什么?或者,如果您有任何其他类似功能的工作脚本,请提供给我

如上面的注释所示,您可以使用
split
将文件拆分为较小的部分,然后使用
cat
将它们重新连接在一起

split -b50m filename x
然后把它们放回去

 cat xaa xab xac > filename
如果您希望将zipfile拆分为一个跨类型归档,这样就不需要将它们重新连接在一起,请查看
Zipplit

 zipslit -n (size) filename  

因此,您可以从exec脚本调用zipsplit,然后大多数标准解压utils应该能够将其重新组合起来
manzipslit
有关更多选项,包括设置输出路径等。

如上面的注释所示,您可以使用
split
将文件拆分为较小的部分,然后可以使用
cat
将它们重新连接在一起

split -b50m filename x
然后把它们放回去

 cat xaa xab xac > filename
如果您希望将zipfile拆分为一个跨类型归档,这样就不需要将它们重新连接在一起,请查看
Zipplit

 zipslit -n (size) filename  

因此,您可以从exec脚本调用zipsplit,然后大多数标准解压utils应该能够将其重新组合起来
manzipslit
更多选项,包括设置输出路径等。

为什么不调用
exec('split')
?不知道,请在这里或在回答中解释。既然您提到了tmp dir和/filesep,我们可以假设是*nix操作系统,并且您的代码不需要可移植吗?如果是这样,那么正如@WebnetMobile.com所说,从命令提示符/shell/terminal查看split
man split
。它将获取一个文件并为您将其拆分为多个较小的文件。您需要将所有文件合并回1以解压缩它,您可以使用
cat
来执行此操作。cat file1 file2 file3 file4 file5>file.zip。或者你想把一个大的zip文件分解成一个扩展的zip文件(在那里它会要求你下一个文件,等等。)@Doon你能告诉我为什么不打电话给
exec('split')
?不知道,请在这里或在回答中解释一下,因为你提到了tmp目录和/filesep,我们可以假设一个*nix操作系统,而您的代码不需要是可移植的吗?如果是这样,那么正如@WebnetMobile.com所说,从命令提示符/shell/terminal查看split
man split
。它将获取一个文件并为您将其拆分为多个较小的文件。您需要将所有文件合并回1以解压缩它,您可以使用
cat
来执行此操作。cat file1 file2 file3 file4 file5>file.zip。或者你想把一个大的zip文件分解成一个扩展的zip文件(在那里它会要求你下一个文件,等等。)@Doon你能不能请elborate到meShall我这样使用它
exec(split-b50m filename x)
在php脚本中?
exec('/path/to/split-b50m filename part')
可以工作部件是它生成的部件的名称,但我认为您可能需要
exec('zipsplit-n50m-b/tmp pro.zip
)`尝试
exec('zipsplit-n50m-b/tmp-pro.zip')但这并没有起到任何作用。我在xampp(windows操作系统)上运行代码。请看我的原始评论,它基于*nix操作系统(假设基于/tmp和文件sep。请看一下zip工具的windows/DOS版本。我应该像php脚本中的
exec(split-b50m filename x)
那样使用它吗?
exec('/path/to/split-b50m filename part'))
可以工作部件是它生成的部件的名称,但我认为您可能需要
exec('zipsplit-n50m-b/tmp-pro.zip
);`try
exec('zipsplit-n50m-b/tmp-pro.zip');
但是这没有起到任何作用。我在xampp(windows OS)上运行代码。错误请看我最初的评论,它是基于*nix OS的(假设基于/tmp和文件sep。请查看zip工具的Windows/DOS版本。