2010年12月30日木曜日

[php]ファイルをテンポラリなパスでダウンロードさせる

publicでない場所に置いてあるファイルを、ランダムなパスで一時的にダウンロードできるようにする。

というのを作りました。

ちょうど今zencartをいじっていて、ダウンロード販売機能のソースコードを参考にさせて(というかほぼそのまま使わせて)もらいました。
該当のソースコードは以下のパスにあります。
includes/modules/pages/download/header_php.php

プログラムの流れは

1.ユーザーがphpにアクセス
2.ランダムで一時ディレクトリを作成
3.作成した一時ディレクトリの中にオリジナルファイルへのシンボリックリンクを作成。
4.ユーザーをシンボリックリンクへ303リダイレクト
5.ユーザーが目的のファイルを閲覧する

となります。

それと、作成したディレクトリを定期的に削除することで、ファイルが一般に公開されてしまうことを防ぎます。

zencartではphpにアクセスがあるたびに過去に作成した一時ディレクトリを削除していますが、必要ならばcronで定期的に削除するなどの処理を組み込んでもいいと思います。

ソースはこんな感じになります。


//古いシンボリックリンクを削除
zen_unlink_temp_dir(DIR_FS_DOWNLOAD_PUBLIC);

//ディレクトリ作成
$tempdir = zen_random_name();
umask(0000);
mkdir(DIR_FS_DOWNLOAD_PUBLIC . $tempdir, 0777);

$symlink_file = DIR_FS_DOWNLOAD_PUBLIC . $tempdir . '/' . $file_name;
$redirect_link = "/pub/" . $tempdir . '/' . $file_name;

//シンボリックリンク作成
$link_create_status = @symlink($org_file, $symlink_file);

//リダイレクト
if ($link_create_status==true) {
header("HTTP/1.1 303 See Other");
header("Location: ".$redirect_link);
}

0 件のコメント:

コメントを投稿