リンクファイルをブラウ内蔵ダウンローダーでダウンロードさせる平成30年 2月 10日 作成

0097

概略

テキストファイル(.txt)や画像ファイル(.jpg)を「aタグ」リンクを作成するとブラウザ上でファイルの読み込みが開始され、場合によっては不便さを感じる事がある。

リンクを右クリックして表示されるメニューから「名前を付けてリンク先を保存」を選択すれば各ファイルのダウンロードは可能ではあるが、この様な事がわからない人の為にも強制的にファイル自体をダウンロードさせる仕組みを構築する。

手段

ブラウザにダウンロードファイルを知らせるためのヘッダとファイル名を送る。

readfile関数にてファイルを読み込みダウンロードさせる。

実装方法

受け取ったファイル・ファイルパスを利用し、ヘッダー出力。

<?php
	// エラーを表示させない(存在しないファイルをダウンロードした時等の為)
	ini_set('display_errors', 0);
	
	// ダウンロード時のファイル破損防止
	mb_http_output("pass");
	
	// GETにて受け取ったファイル名を変数へ 使用するファイル名が文字列だと想定し(string)
	$file_name = (string)filter_input(INPUT_GET, 'file_name', FILTER_SANITIZE_SPECIAL_CHARS);
	
	$fpath = $_SERVER['DOCUMENT_ROOT']."/フォルダ名/".$file_name;
	もしくは
	$fpath = __DIR__."/フォルダ名/".$file_name;
	
	header('Content-Type: application/octet-stream');
	header('Content-Length: '.filesize($fpath));
	header('Content-Disposition: attachment; filename="'.$file_name.'"');
	header('Content-Transfer-Encoding: binary');
	
	//IEと他のブラウザで処理を分ける
	if(strstr($_SERVER["HTTP_USER_AGENT"], MSIE)){
		header('Cache-control:must-revalidate, post-check=0, pre-check=0');
		header('Pragma: public');
	}
	else{
		header('pragma: no-cache');
	}
	
	// バッファクリア
	ob_end_clean();
	
	// ファイルを読み込んで標準出力に書き出す
	readfile($fpath);
?>

場合によってはチェック項目を追加。

	/* ファイルの存在確認 */
	if(!file_exists($fpath)){
		die("ファイルがありません");
	}
	
	/* オープンできるか確認 */
	if(!($fp = fopen($fpath, "r"))){
		die("ファイルが開けません");
	}
	fclose($fp);
	
	/* ファイルサイズの確認 */
	if(($content_length = filesize($fpath)) == 0){
		die("ファイルが異常です");
	}

考察

いろいろと試行錯誤し上記ソースコードに落ち着いた。

最後までお読み下さり ありがとうございました。記事はここ迄です。

尚、本記事は作成から「5年以上」経過しています。

記事作成当時と現在の状況等により内容が適切でない場合があります。また、リンク切れが生じている場合もあります事を予めご了承下さい。

お気に入りに登録しますとお気に入り記事を一元管理でき、再度閲覧したい場合等 容易に記事を探し出す事ができますのでご活用下さい。

下段にはコメントを掲載しております。

広告バナー

コメント

頂いたコメントを下記に掲載しております。更に下部にはコメント投稿フォームを設けております。

注意事項を確認・了承した上、コメント投稿お願いいたします。

注意事項に該当するコメントにつきましては、事前告知なしに投稿したコメントの削除を行う場合があります。

予めご了承下さい。

  • 記事内容と無関係なコメント
  • 公序良俗に反するコメント
  • 個人情報や法令違反を含むコメント
  • その他、管理者が不適切と判断したコメント

現在 頂いているコメントはありません

返信先(コメント管理番号)コメントに対し返信する場合のみ
お名前・ハンドルネーム2~32文字内で入力下さい
メールアドレス公開される事はありません
電話番号半角数字+ハイフンで入力下さい
コメント全角500文字内で入力下さい