2

私のPHPはさびで、誰かが簡単なスクリプトで私を助けてくれることを望んでいます-どこから始めればいいのか本当にわかりません!

ソフトウェア製品のさまざまなバージョンのzip形式のアーカイブを含むフォルダーがあります。

  • Product_1.00.zip
  • Product_1.05.zip
  • Product_2.00.zip

今、私のWebサイトには、製品をダウンロードするためのボタンがあります。ただし、そのボタンには常に最新バージョンをダウンロードしてほしい。

良い解決策は、最新バージョンのフォルダーをスキャンして、ブラウザーがファイルを直接指しているかのようにそのファイルをユーザーに配信する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が指摘しているように、静的ファイルの提供をWebサーバーに処理させる方が効率的です。考えられる方法は、直接リンクするか、を使用してPHPファイルから適切な場所にリクエストをリダイレクトすること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 に答える