日本PHPユーザ会 掲示板

日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。

日本PHPユーザ会 掲示板 » PHP事はじめ » アンカーリンクでなくPHPを使ってファイルのダウンロードがしっかりできる方法などあるでしょうか?

アンカーリンクでなくPHPを使ってファイルのダウンロードがしっかりできる方法などあるでしょうか?

ページ: 1

投稿者 投稿
会員
登録者: 9 2010
返信数: 17
先日からありがとうございます。

現在、普通のアンカーリンクで重いファイル(約1GB)から軽いファイル(約300KB)まで、
ファイル名をリンク記述してダウンロードできるようにしております。

そんな中で、二つやりたいことがあってそれはPHPでカンタンにできるものでしょうか。
もしそうならぜひやりたいです。


●やりたいこと(1)・・・ダウンロード場所をノロノロ選んでもちゃんとダウンロードさせたい

IE7でも、Firefox3.5.8でもなのですが、ダウンロードリンクをクリックするとWindowsダイヤログボックスで保存場所を聞いてきますが、そのとき、聞いてきたとき最初に表示されているディレクトリに保存するのは問題ないのですが、違うディレクトリに移動して保存しようとすると、IEだと保存したあとに解凍したら中が空のメッセが出て、Firefoxだとダウンロード自体が開始できないメッセが出ます。
ファイルがKBであろうがGBであろうが関係なくです。
これはサーバの品質によるものでしょうか?
もしそうでなく、PHPでうまくやることによってこれを回避できるのならぜひやりたいです。



●やりたいこと(2) ・・・Webから見れない領域にダウンロードファイルを引越ししたい

以下のURLにそれっぽいことが書いてありましたが、ダウンロードを開始させるアンカーリンクなのかフォームボタンなのかわかりませんが、どうやってそこには記述すればよいのかわかりませんでした。

http://shoyu-ramen23.jugem.jp/?mode=comment&act=captcha

------------------------------------------------------------
【抜粋】
PHP WEBからアクセス出来ない場所のファイルをダウンロードさせる
WEBからアクセス出来ない場所のファイルをreadfile関数を使ってダウンロードさせる

<?php
//ダウンロードファイル(WEBからアクセス出来ない場所)
$download_file = '/var/www/souko/mydata.zip';

if (file_exists($download_file)) {
 //ファイル名とファイルサイズを得る
 $filename = basename($download_file);
 $filesize = filesize($download_file);
 //ダウンロード開始
 header('Content-type: application/octet-stream');
 header('Content-disposition: attachment; filename="'.$filename.'"');
 header('Content-Length: '.$filesize);
 //出力バッファをオフ
 ob_end_flush();
 readfile($download_file);
}
?>

Fedora Core 4と同時にインストールしたPHP(php.ini未編集)の環境において、サイズの大きなファイルをダウンロードさせる場合、ob_end_flush()を記述することで可能となった。
------------------------------------------------------------


「$download_file」は「/var/www/souko/mydata.zip'」というひとつのファイルに紐付けされると思うので、「$download_file」をアンカーリンクに記述するのではファイルの数だけ「「$download_file」」のような変数名?をつくっていかなくてはならず、ダウンロードファイルの数はものすごく多いので、あまりに非効率だからそんな方法であるはずがないと思いました。
どのようにすればできるでしょうか?


質問が広いもののような気がするのに加えて、自身がプログラミング全くの初心者なので、あまりに的を得ていない質問かも知れません。そのときはどうかご指摘ください。
このスレッドを削除してもらいますので。

それでは恐れ入りますが宜しくお願いいたします。
会員
登録者: 8 2009
返信数: 103
おはようございます。

> ●やりたいこと(1)・・・ダウンロード場所をノロノロ選んでもちゃんとダウンロードさせたい
こちらはFirefox3.6.9ですが、問題ないです。
phpでどうこうできる問題ではない気がします。



> ●やりたいこと(2) ・・・Webから見れない領域にダウンロードファイルを引越ししたい

> 以下のURLにそれっぽいことが書いてありましたが、ダウンロードを開始させるアンカーリンクなのかフォームボタンなのかわかりませんが、どうやってそこには記述すればよいのかわかりませんでした。
普通にアンカーやフォームボタンでこのphpにアクセスするだけでmydata.zipをダウンロードできます。

> 「$download_file」は「/var/www/souko/mydata.zip」というひとつのファイルに紐付けされると思うので、「$download_file」をアンカーリンクに記述するのではファイルの数だけ「「$download_file」」のような変数名?をつくっていかなくてはならず、ダウンロードファイルの数はものすごく多いので、あまりに非効率だからそんな方法であるはずがないと思いました。
確かにファイルの数だけアンカーリンクが必要になりますね。
phpソースはそのままでhtmlでのリンクのみ増やすサンプルをこのソースを参考に作成してみました。
セキュリティホール込みです。


download.php
<?php
//ダウンロードファイル(WEBからアクセス出来ない場所)
$download_file = '/var/www/souko/' . $_GET['filename'];

if(is_file($download_file)) {
// ファイル名とファイルサイズを得る
$filename = basename($download_file);
$filesize = filesize($download_file);
//ダウンロード開始
header('Content-type: application/octet-stream');
header('Content-disposition: attachment; filename="' . $filename . '"');
header('Content-Length: ' . $filesize);
// 出力バッファをオフ
ob_end_flush();
readfile($download_file);
}
else {
// ファイルが存在しなかった場合の処理
}

?>


download.html
<html>
<head>
<title>download sample</title>
</head>
<body>
<ul>
<li><a href="download.php?filename=mydata.zip">mydata.zip</a></li>
<li><a href="download.php?filename=test.zip">test.zip</a></li>
<li><a href="download.php?filename=example.zip">example.zip</a></li>
<!-- ファイルの数だけリンクを増やす -->
</ul>
</body>
</html>


> どのようにすればできるでしょうか?
phpを使っているのですから自動生成するようにします。
ファイルの一覧を作成しリンクを生成させます。
会員
登録者: 9 2010
返信数: 17
ご連絡遅くなり申し訳ありません。仕事が厳しくて見れてませんでした。
拝読しましたのでちょっとこれで試してみます。
またご報告させていただきます。
会員
登録者: 9 2010
返信数: 17
申し訳ありません、優先業務が差し込みで入ってずっと手がつけられずにおります。申し訳ありません。せっかく回答いただいたのに。
満杯の優先業務が片付き次第、取り組ませていただきます。すみませんホントに

ページ: 1

日本PHPユーザ会 掲示板 » PHP事はじめ » アンカーリンクでなくPHPを使ってファイルのダウンロードがしっかりできる方法などあるでしょうか?

日本PHPユーザ会 掲示板 は UseBB 1 フォーラムソフトウェア を使用しています