压缩文件夹中的文件并提供存档文件夹的名称

时间:2015-10-30 08:28:38

标签: php ziparchive

我对php非常陌生,我刚刚创建了我的第一个脚本,它工作正常,但是最后一点也没有。 该脚本会压缩包含php的文件夹中的所有文件,并创建可下载的存档。 这是代码

<?php

$zipname =  'test.zip';
$zip = new ZipArchive;
$zip->open('D://mypath//zip//$zipname', ZipArchive::CREATE);
if ($dir_handle = opendir('./')) {
  while (false !== ($entry = readdir($dir_handle))) {
    if ($entry != "." && $entry != ".." && !strstr($entry,'.php') && !strstr($entry,'.zip')) {
      $zip->addFile($entry);
    }
  }
  closedir($dir_handle);
}
else {
  die('file not found');
}

$zip->close();

header('Content-Type: application/zip');
header("Content-Disposition: attachment; filename=$zipname");
header('Content-Length: ' . filesize($zipname));
header("Location: $zipname");

?>

我想要实现的是拥有$ zipname =&#34;文件夹的名称.zip&#34; 所以,如果php在里面&#34; / mypath / blablabla /&#34;我希望我的zip $ zipname是&#34; blablabla.zip&#34;

任何帮助将不胜感激!

编辑: 这是工作代码:

<?php
$zipname = getcwd();
$zipname = substr($zipname,strrpos($zipname,'\\')+1);
$zipname = $zipname.'.zip';
$zip = new ZipArchive;
$zip->open('D:/inetpub/webs/mydomaincom/zip/'.basename($zipname).'', ZipArchive::CREATE);
if ($dir_handle = opendir('./')) {
  while (false !== ($entry = readdir($dir_handle))) {
if ($entry != "." && $entry != ".." && !strstr($entry,'.php')) {
    $zip->addFile($entry);
}
}
closedir($dir_handle);
}
else {
die('file not found');
}

$zip->close();

header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename($zipname).'"');
header('Content-Length: ' . filesize($zipname));
header('Location: /zip/'.$zipname);
?>

2 个答案:

答案 0 :(得分:0)

您可以使用getcwd():

http://php.net/manual/fr/function.getcwd.php

$zipname = getcwd();

它将返回当前文件夹的路径,然后您可以只对表达式的名称进行哈希处理:

// We remove all the uneeded part of the path
$zipname = substr($zipname,strrpos($zipname,'\\')+1);

//Then we add .zip to the result :
$zipname = $zipname.'.zip';

这应该可以解决问题。

如果您还想使用父文件夹的名称:

$zipname = getcwd();

// We remove the uneeded part of the path
$parentFolderPath = substr($zipname, 0,strrpos($zipname,'\\'));
$parentFolder = substr($parentFolderPath, strrpos($parentFolderPath,'\\')+1);

//Keep current folder name
$currentFolder = substr($zipname,strrpos($zipname,'\\')+1);

//Join both
$zipname = $parentFolder.'_'.$currentFolder;

//Then we add .zip to the result :
$zipname = $zipname.'.zip';

答案 1 :(得分:0)

您可以使用header()

,而不是使用readfile()重定向
header('Content-Disposition: attachment; filename="'.basename($zipname).'"');
readfile($zipname);

使用basename()时,只会向用户显示最后一部分,而readfile()则会显示实际文件,无论它在何处。