我的 PHP 生锈了,我希望有人可以帮助我快速编写脚本 - 我真的不知道从哪里开始!
我有一个文件夹,其中包含软件产品各种版本的压缩档案:
- 产品_1.00.zip
- 产品_1.05.zip
- 产品_2.00.zip
等等
现在,在我的网站上,我有一个下载产品的按钮。但是,我希望该按钮始终下载最新版本。
在我看来,一个不错的解决方案是链接到一个 PHP 脚本,该脚本将扫描文件夹中的最新版本并将该文件传递给用户,就像他们将浏览器直接指向该文件一样。
谁能给我一个起点?
我的 PHP 生锈了,我希望有人可以帮助我快速编写脚本 - 我真的不知道从哪里开始!
我有一个文件夹,其中包含软件产品各种版本的压缩档案:
等等
现在,在我的网站上,我有一个下载产品的按钮。但是,我希望该按钮始终下载最新版本。
在我看来,一个不错的解决方案是链接到一个 PHP 脚本,该脚本将扫描文件夹中的最新版本并将该文件传递给用户,就像他们将浏览器直接指向该文件一样。
谁能给我一个起点?
我认为将目录中的文件读入数组是最简单的。然后natsort
数组并弹出最后一个条目。
这是一个例子:
<?php
function getLatestVersion() {
$dir = dir('.');
$files = array();
while (($file = $dir->read()) !== false) {
$files[] = $file;
}
$dir->close();
natsort($files);
return array_pop($files);
}
输出
array(6) {
[0]=>
string(1) "."
[1]=>
string(2) ".."
[2]=>
string(16) "Product_1.00.zip"
[3]=>
string(16) "Product_1.05.zip"
[5]=>
string(16) "Product_2.00.zip"
[4]=>
string(17) "Product_10.00.zip"
}
编辑
就像@j_mcnally 在他下面的评论中指出的那样,让网络服务器处理静态文件的服务更有效。可能的方法是直接链接或使用301
.
但是如果你仍然想让 PHP 完成这项工作。这是一个例子。
从http://perishablepress.com/http-headers-file-downloads获取下面的示例并对其进行了一些修改。
<?php // HTTP Headers for ZIP File Downloads
// http://perishablepress.com/press/2010/11/17/http-headers-file-downloads/
// set example variables
// Only this line is altered
$filename = getLatestVersion();
$filepath = "/var/www/domain/httpdocs/download/path/";
// http headers for zip downloads
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filepath.$filename));
ob_end_flush();
@readfile($filepath.$filename);
?>
这应该有效。当然,可以添加更多检查,具体取决于该文件夹中可以存储的其他内容;如果文件夹包含太多文件等,您也可以更改读取文件夹内容的方式。此代码中的关键字可能strnatcmp()
用于字符串比较。
<?php
$files = scandir('/path/to/files');
$result = array_reduce(
$files,
function($a, $b) {
$tpl = '/^Product_(.+).zip$/';
// return second file name if the first file doesn't follow pattern Product_XXX.zip
if (!preg_match($tpl, $a)) {
return $b;
}
// return first file name if the second file doesn't follow pattern Product_XXX.zip
if (!preg_match($tpl, $b)) {
return $a;
}
return strnatcmp($a, $b) >= 0 ? $a : $b;
},
''
);
下面将在downloads
目录中查找最新文件(通过查看文件的修改时间)并返回最新文件的名称:
$dir = dir("downloads");
$files = array();
while (($file = $dir->read()) !== false) {
$files[filemtime($file)] = $file;
}
$dir->close();
ksort($files);
$fileToDownload = $files[0];
希望这可以帮助!
此代码通过使用文件修改时间来确定给定目录中的最新版本来工作,也许在文件名上使用正则表达式会是更好的方法,但这说明了 PHP 的 DirectoryIterator。
$files = array();
foreach(new DirectoryIterator("productZips/") as $fileInfo) {
if(!$fileInfo->isFile()) continue;
$files[$fileInfo->getMTime()] = $fileInfo->getFilename();
}
ksort($files);
$latestFile = array_pop($files);
你可以在这里阅读更多:http: //php.net/manual/en/class.directoryiterator.php