質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

5005閲覧

PHPを使ってダウンロードさせたい

mymemine

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/05/07 16:05

編集2017/05/07 20:40

現在、PHPを利用してファイルをダウンロードさせたいと考えています。

PHP

1<?php 2 if (isset($_GET[‘file’])) 3 { 4$file = $_GET[‘file’]; 5print("$file<br>\n"); 6 } 7header('Content-Type: application/force-download'); 8header('Content-Length: '.filesize($file)); 9header('Content-Disposition: attachment; filename="'.$file.'"'); 10readfile($file); 11?>

上記の記述で、

URL

1http://~~/download.php?file=audio/sample.mp3

と入力した時にaudio/内のsample.mp3がうまくダウンロードできません。

*以下のデータが記述されたファイルがダウンロードされます。
<br />
<b>Warning</b>: readfile(): Filename cannot be empty in <b>/home/~~/public_html/download.php</b> on line <b>11</b><br />

ファイルの読み込みが出来ていないようです。

どの部分を修正すれば、うまくダウンロードできるようになりますでしょうか?
勉強中の初心者で申し訳ありませんが、
ご教授のほどよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s8_chu

2017/05/07 16:16

うまくダウンロードできない、とはどのようにうまくいかないのか追記していただけませんか?
kei344

2017/05/07 17:26

質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
guest

回答2

0

ベストアンサー

ポイントがいくつかあります。

phpの関数は当然document_rootより下のものや、画像以外も読むことができます。
つまりご提示のUIですと、サーバーの全てのファイルを任意にダウンロードされてしまうということです。

  • document_rootより前に遡れないようにする
  • 拡張子など利用してダウンロードできるファイルを絞る
  • file_existsで存在を確認する
  • readfileを使わずfopenfreadfcloseで対応する
  • filenameにパスが含まれないようにbasenameを使う
  • filter_inputを活用する

$file = filter_input(INPUT_GET,'file');

など工夫してください

投稿2017/05/08 02:35

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mymemine

2017/05/08 22:12

fopen~fread~fcloseを使用した所、うまく読み込みができました! 本当にありがとうございます!
guest

0

Warningを見たところ$_GET['file']が取得できていないようですね。

まずgetのパラメータにurlを構成する文字列等が入る場合はurlエンコードしたものを書く必要があります。
http://~~/download.php?file=audio%2fsample%2emp3

あとテストコードと思われますが、header出力前のprintは実際のダウンロード時は消しましょう。print("$file<br>\n");

PHP: header - Manual

header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。

これは別件ですがgetで渡された値をノーチェックでreadfileに渡すのはかなり恐ろしいことなので
外部に公開するようなページの場合は参照してはいけないファイルではないかのチェックは行ったほうがよいでしょう。

複雑なサイトでなければ配列を利用した簡易チェックが楽でしょうか。
アクセスするURL http://~~/download.php?file=sample1

php

1<?php 2 if ( empty( $_GET['file'] ) { 3 echo 'ファイル名が取得できませんでした'; 4 exit; 5 } 6 7 // この配列に含まれないものはダウンロードできないようにする 8 $CONTENTS_LIST = [ 9 // キー名にgetで渡す値、要素にファイルパス 10 'sample1' => 'audio/sample.mp3', 11 'sample2' => 'audio/sample2.mp3', 12 'sample3' => 'audio/sample3.mp3', 13 'sample4' => 'audio/sample4.mp3', 14 ]; 15 16 // $CONTENTS_LISTに含まれないファイルを弾く 17 if ( !in_array( $_GET['file'], array_keys($CONTENTS_LIST) ) ) { 18 echo 'ファイル名が異常です'; 19 exit; 20 } 21 22 $file = $CONTENTS_LIST[ $_GET['file'] ]; 23 if ( !file_exists( $file ) ) { 24 echo '存在しないファイルです'; 25 exit; 26 } 27 // ファイルを出力 28 header('Content-Type: application/force-download'); 29 header('Content-Length: '.filesize($file)); 30 header('Content-Disposition: attachment; filename="'.$file.'"'); 31 readfile($file);

投稿2017/05/07 16:14

編集2017/05/07 17:48
shiroyuki

総合スコア169

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問