我有一个php
脚本,将图像的zip文件上传到文件夹。该脚本递归地只查找zip文件中的文件,并将所有文件放在服务器上的单个目录中。
问题是某些文件被重复上传。这不是脚本的错,而是由于苹果电脑的荒谬和低劣,当mac创建一个图像压缩文件时,它会创建一个图像文件夹,然后创建另一个文件夹,其中只有它放置的完全相同的图像。在文件名前加上_"。因此,考虑到苹果电脑很快就会消失,我试着在我的php
脚本中包含一个简单的函数来搜索这些低劣的苹果电脑,并从目录中删除它们。但是,当我使用"ftp_nlist"
时,php
甚至不拉这些文件。
所以我的问题是:我如何让php
拉这些愚蠢的东西,这样我就可以删除它们?
$contents = ftp_nlist($conn_id, '.');
foreach($contents as $key => $value){
echo $key." => ".$value."<BR>";
if(substr($value, 1, 1) == ".") {
if(ftp_delete($conn_id, $value)) {
echo "Deleting $value<BR>";
}
}
echo "<BR>";
}
exit();
编辑:多亏了Stephane的建议我才想出了这个方法
if($zip->open($_FILES['theFile']['tmp_name']) === TRUE){
for($i = 0; $i < $zip->numFiles; $i++) {
$filename = $zip->getNameIndex($i);
$fileinfo = pathinfo($filename);
copy("zip://".$_FILES['theFile']['tmp_name']."#".$filename, $ezPresenter['currentFolder'].'/'.$fileinfo['basename']);
}
$zip->close();
}else{
exit("Could not upload/extract file");
}
$contents = ftp_rawlist($conn_id, '-a');
foreach($contents as $key => $value){
$value = explode(" ", $value);
$value = $value[count($value)-1];
echo $key." => ".$value."<BR>";
if(strpos($value, ".") === false) {
if(ftp_delete($conn_id, $value)) {
echo "Deleting $value<BR>";
}
}
if(substr($value, 0, 2) == "._") {
if(ftp_delete($conn_id, $value)) {
echo "Deleting $value<BR>";
}
}elseif(substr($value, 0, 1) == "." && $value != "." && $value != "..") {
if(ftp_delete($conn_id, $value)) {
echo "Deleting $value<BR>";
}
}
}
用ftp_rawlist
代替。
ftp_rawlist—返回给定目录
中文件的详细列表
ftp_rawlist($connid, "-a");
参数-a
表示unix命令行上的all
: ls -a
。
我以前遇到过这个问题,但我没有使用ftp_nlist
。我最后做的是使用PHP的ZipArchive打开zip文件并查找(并排除)__MACOSX
目录。我也忽略了里面只有一个目录的zip文件(这样你就不会解压缩文件,然后有两个目录来获取数据——这总是让我恼火)。
我的解决方案可能不是最适合你的,因为它需要一些额外的处理,但它适用于我:)
总之,话不多说…这是我正在使用的代码。希望对你有帮助://
// unzip the file
$zip = new ZipArchive;
if ($zip->open($fname) === TRUE) {
//extract zip
$zip->extractTo($dir);
$zip->close();
//detect single dir
$basedir = function($x) use (&$basedir) {
$files = glob($x.'*', GLOB_MARK);
//ignore stupid mac directory
$k = array_search($x.'__MACOSX/',$files);
if($k!==FALSE) {
unset($files[$k]);
$files = array_values($files);
}
if(sizeof($files)==1 && is_dir($files[0]))
return $basedir($files[0]);
return $x;
};
//get root directory that has files in it
$dir = substr($basedir($dir.'/'),0,-1);
//
// here I re-zipped the data from the base directory
// and uploaded this file
//
} else {
//delete the file
unlink($fname);
//
// some other error handling
//
return;
}