2

我的 PHP 生锈了,我希望有人可以帮助我快速编写脚本 - 我真的不知道从哪里开始!

我有一个文件夹,其中包含软件产品各种版本的压缩档案:

  • 产品_1.00.zip
  • 产品_1.05.zip
  • 产品_2.00.zip

等等

现在,在我的网站上,我有一个下载产品的按钮。但是,我希望该按钮始终下载最新版本。

在我看来,一个不错的解决方案是链接到一个 PHP 脚本,该脚本将扫描文件夹中的最新版本并将该文件传递给用户,就像他们将浏览器直接指向该文件一样。

谁能给我一个起点?

4

4 回答 4

2

我认为将目录中的文件读入数组是最简单的。然后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"
}

如何下载最新版本的 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);
?>
于 2013-03-14T13:17:33.043 回答
1

这应该有效。当然,可以添加更多检查,具体取决于该文件夹中可以存储的其他内容;如果文件夹包含太多文件等,您也可以更改读取文件夹内容的方式。此代码中的关键字可能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;
    },
    ''
);
于 2013-03-14T13:36:19.737 回答
0

下面将在downloads目录中查找最新文件(通过查看文件的修改时间)并返回最新文件的名称:

$dir = dir("downloads");
$files = array();
while (($file = $dir->read()) !== false) {
    $files[filemtime($file)] = $file;
}
$dir->close();

ksort($files);
$fileToDownload = $files[0];

希望这可以帮助!

于 2013-03-14T13:16:56.887 回答
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

于 2013-03-14T13:50:55.530 回答