日本PHPユーザ会 掲示板

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

日本PHPユーザ会 掲示板 » PHP 5 » 任意のファイルをダウロードするスクリプト

任意のファイルをダウロードするスクリプト

ページ: 1

投稿者 投稿
会員
登録者: 10 2009
返信数: 3
phpで任意のファイルをダウンロードさせる

HTML側
<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<a href="download/down.php?mode=moon.wav">moon.wav</a>
</body>
</html>



down.php側
<?php
$path_file = $_GET["mode"];
function download_file($path_file)
{

/* ダウンロード用のHTTPヘッダ送信 */
header("Content-Disposition: inline; filename=\"".basename($path_file)."\"");
header("Content-Length: ".$content_length);
header("Content-Type: application/octet-stream");

/* ファイルを読んで出力 */
if (!readfile($path_file)) {
die("Cannot read the file(".$path_file.")");
}
}
?>

ダウンロードダイアログも現れない。
プログレスバーも表示なし。
ダウンロードダイアログを開いてくれません。

ここでハマッテいます。
何方か、ご指導お願いします。
会員
登録者: 8 2009
返信数: 5
yoshiyanさん、
最もシンプルな、html、php、指定ファイルが、全て、同一階層におかれた例です。
HTML側:download.html

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>指定ファイルをダウンロード</title>
</head>
<body>
ファイル名を指定ください
<form method="POST" action="download.php">
<input type="text" name="name" size="15"/><br/>
<input type="submit" value="DownLoad"/>
</form>
</body>
</html>

PHP側:download.php

<?php
$fileName=$_POST['name'];
if(file_exists($fileName)){//指定ファイルが存在するかどうかをチェックし、trueなら、以下を処理するが、
$fileSize = filesize($fileName);
$mime = 'application/octet-stream'; // MIMEタイプが何にでも対応できるよう
header('Content-Type: "' . $mime . '"');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
if(strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE')) {//ブラウザーが、MSIEならば、
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');//キャッシュ化無効
header('Pragma: public');
} else {//その他のブラザーなら、
header('Pragma: no-cache');
}
header('Content-Length: ' . $fileSize);
readfile($fileName);
}else{//falseなら、メッセージを表示
print ('指定ファイルは、存在しません。');
}

でどうでしょうか?
« 最終編集者 joy 日時 2009 年 10 月 24 日(土) 23:58. »
会員
登録者: 10 2009
返信数: 3
駄目ででした。
Warning: Cannot modify header information - headers already sent by (output started at G:\home\homedoc\htdocs\down\down.php:2) in G:\home\homedoc\htdocs\down\down.php on line 10

Warning: Cannot modify header information - headers already sent by (output started at G:\home\homedoc\htdocs\down\down.php:2) in G:\home\homedoc\htdocs\down\down.php on line 11

Warning: Cannot modify header information - headers already sent by (output started at G:\home\homedoc\htdocs\down\down.php:2) in G:\home\homedoc\htdocs\down\down.php on line 12

Warning: Cannot modify header information - headers already sent by (output started at G:\home\homedoc\htdocs\down\down.php:2) in G:\home\homedoc\htdocs\down\down.php on line 13

Warning: Cannot modify header information - headers already sent by (output started at G:\home\homedoc\htdocs\down\down.php:2) in G:\home\homedoc\htdocs\down\down.php on line 15

Warning: Cannot modify header information - headers already sent by (output started at G:\home\homedoc\htdocs\down\down.php:2) in G:\home\homedoc\htdocs\down\down.php on line 16

Warning: Cannot modify header information - headers already sent by (output started at G:\home\homedoc\htdocs\down\down.php:2) in G:\home\homedoc\htdocs\down\down.php on line 20
RIFF?XWAVEfmt

エラー番号からするとheaderのエラーのようです。


1ウンロードダイアログも現れません。
2.プログレスバーが動きません。
3.ブラウザがダウンロードダイアログを開いてくれません。
4.ファイルも落とせないです。

ターゲットブラウザは、IE8です。

<a href="download.php?mode=moon.wav">moon.csvをダウンロードする</a>

//sample.php
<?php
$file = S_GET["mode"];
$file_length = filesize($file);
header("Content-Disposition: attachment; filename=$file");
header("Content-Length:$file_length");
header("Content-Type: application/octet-stream");
readfile ($file);
?>

こなのを考えてみました。
駄目ででした。
エラーは、出ないもののheaderが動作しません。
1ウンロードダイアログも現れません。
2.プログレスバーが動きます。
3.ブラウザがダウンロードダイアログを開いてくれません。
おまけに、ファイルの中身を表示してします・・・・????

まったく進展なしです。
« 最終編集者 ELF 日時 2009 年 10 月 26 日(月) 10:35. »
会員
登録者: 8 2009
返信数: 5
yoshiyanさん、
そうですか?
以下、@pagesのサーバーにアップしましたが、downloadできますが・・・
ダウンロードのhtmlページです

まずは、ご自分の手を加える前に、私のscript(上のように、一応、動いているので)そのもので、試してみて、それから、ご自分のおやりになりたいように、されたらいかがでしょうか?
会員
登録者: 10 2009
返信数: 3
今、HPの方を拝見しました。
ちゃんと、動作しています。
確認、しました。

このHPっていつ迄公開していますか??
可能ならば、暫く公開していて欲しいのですが、可能でしょうか。??

質問なんですが、この公開されているSeverは、何でしょうか。??
私の環境は、Vine Linux Sever5.0を使用しています。
Unicodeの違いは、関係ないでしょうか。
私の方は、Unicode UTF-8 改行コードがLFです。
コードがUNIXです。

もしかしてUnicode UTF-8N 改行コードがCRLFで動作しているのでは、ないでしょうか??
若しくは、Unicode UTF-8N 改行コードCRだと思うのですが・・・・
違ってたらごめんなさいです。

改行コードの違いかも、Unicode UTF-8N 改行コードがCRLF
なら私の書いた最初のProgramでも動作します。
Unicode UTF-8 改行コードがLF
最初に書き込みすべき事でした。
これが、原因でハマっています。
« 最終編集者 yoshiyan 日時 2009 年 10 月 25 日(日) 20:24. »
会員
登録者: 8 2009
返信数: 5
yoshiyanさん、

引用
このHPっていつ迄公開していますか??

→answers/に入れてますので、削除予定は、ありません。
引用
この公開されているSeverは、何でしょうか。??

→このサーバーは、どなたでも、登録すれば、すぐに、使えるようになる無償サーバーです。
(フリーメールアドでも、OKです)サーバーの中身については、@pagesの管理者へ、問い合わせてください。 ;)
会員
登録者: 1 2010
返信数: 7
down.php側の末尾に
download_file($path_file);
を入れてはどうでしょうか。
これではただ関数を定義しているだけのようですが。

> /* ファイルを読んで出力 */
> if (!readfile($path_file)) {
> die("Cannot read the file(".$path_file.")");
> }
> }
download_file($path_file);// ←この行を追加
> ?>

ページ: 1

日本PHPユーザ会 掲示板 » PHP 5 » 任意のファイルをダウロードするスクリプト

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