1

Webルートディレクトリの外にあるファイルをダウンロードしてリストするスクリプトを作成しようとしています...ディレクトリのファイルをリストしていますが、クリックするとダウンロードできません。 website.com/clickedlink.jpgに移動しますが、希望の場所に移動するには、それをどのように変更する必要があります...

これは少し奇妙に説明していると思いますので、説明が必要な場合は教えてください。

/ home / files / I / needからファイルをダウンロードする必要がありますが、Webサイトは/ var /website/に保存されています

誰かが助けてくれたら100%感謝します!

<html><head><title>Root page</title></head><body>


<? 
// open this directory 
$myDirectory = opendir("/home/files/I/need");

// get each entry
while($entryName = readdir($myDirectory)) {
    $dirArray[] = $entryName;
}

// close directory
closedir($myDirectory);

//  count elements in array
$indexCount = count($dirArray);
Print ("$indexCount files<br>\n");

// sort 'em
sort($dirArray);

// print 'em
print("<TABLE border=1 cellpadding=5 cellspacing=0 class=whitelinks>\n");
print("<TR><TH>Filename</TH><th>Filetype</th><th>Filesize</th></TR>\n");
// loop through the array of files and print them all
for($index=0; $index < $indexCount; $index++) {
        if (substr("$dirArray[$index]", 0, 1) != "."){ // don't list hidden files
        print("<TR><TD><a href=\"$dirArray[$index]\">$dirArray[$index]</a></td>");
        print("<td>");
        print(filetype($dirArray[$index]));
        print("</td>");
        print("<td>");
        print(filesize($dirArray[$index]));
        print("</td>");
        print("</TR>\n");
    }
}
print("</TABLE>\n");
?>
</body></html>


</body></html>
4

1 に答える 1

1

最善の解決策は、ロケーション エイリアスを作成して、Web サーバーにこれを処理させることです。Web サーバーにダウンロードを実行させることは、PHP でこれを行うよりもはるかにスケーラブルです。

ただし、PHP ソリューションを要求したため、これをスクリプトの先頭に追加します。

$basePath = "/home/files/I/need";
if (isset($_SERVER['PATH_INFO']) && $file = basename($_SERVER['PATH_INFO'])) {
    if (file_exists("$basePath/$file")) {
        // add file size
        header('Content-Length: ' . filesize("$basePath/$file"));
        // write file to output
        readfile("$basePath/$file");
        return;
    }
}

ダウンロードを行うための URL を作成するには:

/path/to/your/script.php/clickedlink.jpg

これ/path/to/your/script.phpは、ページを生成する URL と同じです。意図したファイル名とともにスラッシュを追加します。

basename()人々がアクセスできないようにするために使用し../../../etc/passwdていますが、それはサブフォルダーを使用できないことも意味します。サブフォルダーをサポートする必要がある場合はPATH_INFO、別の方法でサニタイズする必要があります。

于 2012-06-09T07:50:17.297 に答える