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

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

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

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

Q&A

解決済

3回答

5532閲覧

PHPで、アップロードしたファイルをダウンロードする方法

P0Po

総合スコア12

PHP

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

0グッド

0クリップ

投稿2016/11/30 08:04

ファイルをアップロードして、それを一覧表示してファイルを選択するとダウンロードするという処理を書きたくて、いろいろネットで調べて書きました。
一覧表示までは出来たのですが、どうもその先のダウンロードが出来ません。
以下は、一覧表示してダウンロードをするコードです。

PHP

1<?php 2 3function download_file($path_file) 4{ 5 /* ファイルの存在確認 */ 6 if (!file_exists($path_file)) { 7 die("Error: File(".$path_file.") does not exist"); 8 } 9 10 /* オープンできるか確認 */ 11 if (!($fp = fopen($path_file, "r"))) { 12 die("Error: Cannot open the file(".$path_file.")"); 13 } 14 fclose($fp); 15 16 /* ファイルサイズの確認 */ 17 if (($content_length = filesize($path_file)) == 0) { 18 die("Error: File size is 0.(".$path_file.")"); 19 } 20 21 /* ダウンロード用のHTTPヘッダ送信 */ 22 header("Content-Disposition: inline; filename=\"".basename($path_file)."\""); 23 header("Content-Length: ".$content_length); 24 header("Content-Type: application/octet-stream"); 25 26 /* ファイルを読んで出力 */ 27 if (!readfile($path_file)) { 28 die("Cannot read the file(".$path_file.")"); 29 } 30} 31 32$filepath = "C:/upload/failename.txt"; 33 34$fp = fopen($filepath, "r"); 35 36$array = file($filepath); 37foreach ($array as $line) { 38 list($title, $file) = explode("\t", trim($line)); 39 $file = 'C:/upload/' . $file; 40 if (file_exists($file)) { 41 print '<a href="'.$file.'" onClick="download_file($file)">' . $title . '</a><br />'; 42 var_dump($file).PHP_EOL; 43 } 44} 45fclose($fp); 46?> 47

僕の考えでは、onClickでファイルパス$fileを引数として関数download_fileに渡しているのですが、これでは出来ないのでしょうか?

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

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

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

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

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

zico_teratail

2016/11/30 08:09

「ダウンロードが出来ません」では回答しようがありません。具体的に何をどうやったらどうダメだったのか、どういうエラー文が表示されたのかなどを書いてください。
P0Po

2016/11/30 08:12

一覧をクリックしても何も起こらないのです。特にエラーが出るわけでもありません。
guest

回答3

0

ベストアンサー

僕の考えでは、onClickでファイルパス$fileを引数として関数download_fileに渡しているのですが、これでは出来ないのでしょうか?

onclick というのは JavaScript ですよね。外部からファイル名を指定して、PHPに処理を渡すのはセキュリティ的にご法度です。そんな実装をしたら、任意のファイルを抜き出すことができてしまいます。

#サンプル

php

1<!DOCTYPE HTML> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <a href="download.php?id=1">ダウンロード</a> 9 </body> 10</html>

php

1<?php 2 3/** 4 * download.php 5 */ 6 7/** 8 * ファイルのパスを取得する 9 * @param type $id 10 * @return string 11 */ 12function getFilePath($id) 13{ 14 // あらかじめファイルは作成しておく 15 $arr = array( 16 1 => 'data/list.txt' 17 , 2 => 'data/data.txt' 18 ); 19 20 return $arr[$id]; 21} 22 23if (NULL == filter_input(INPUT_GET, 'id')) { 24 echo 'パラメータが不正です。'; 25 exit(); 26} 27 28$id = filter_input(INPUT_GET, 'id'); 29 30$path = getFilePath($id); 31 32$filename = basename($path); 33header('Content-Type: application/octet-stream'); 34header(sprintf('Content-Disposition: attachment;filename="%s"', $filename)); 35readfile($path); 36exit;

投稿2016/11/30 08:12

編集2016/11/30 09:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

P0Po

2016/12/01 05:17

回答ありがとうございます。 なるほど、idを引数として渡して配列からデータのパスを持ってくるんですね。 この方法で出来ました。 ありがとうございました。
guest

0

download_fileという関数をどこで使ってるんだ・・・と思ったら、
print '<a href="'.$file.'" onClick="download_file($file)">' . $title . '</a><br />';
↑これか!

なんでJSのonClick部分にPHPの関数を埋め込んで動くと考えたの・・・???
どうやら「サーバーサイド」と「クライアントサイド」という概念が分かっていないようなので、この二つの単語をググってまずは勉強してください。

投稿2016/11/30 08:58

zico_teratail

総合スコア907

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

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

P0Po

2016/12/01 05:13

すみませんうっかりしてました。 PHPの関数がJSで動くわけ無いです。 勉強不足でした。 もっと精進します。
guest

0

できません。
javascript と PHPがごっちゃになっています。

■1 クライアント側(HTML&JS)
print '<a href="'.$file.'" onClick="download_file($file)">' . $title . '</a><br />';

onclickの中身はJSで新しく関数を作って、PHPのdownload_fileが呼び出されるページを読み込むようにしてください。

■2 サーバーサイド側 ダウンロード(PHP)
ファイルの中身を出力する部分が欠けているようです。

投稿2016/11/30 08:15

koutan1976

総合スコア142

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

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

koutan1976

2016/11/30 08:25

訂正します。 ファイルの中身を出力する部分が欠けているようです。 ↓ ありましたので■2は間違いです。 また、お勉強のためやっているように感じたので記載しませんでしたが Shibuyaさんがおっしゃっているように基本的にセキュリティの問題があるつくりになっています。
P0Po

2016/12/01 05:16

回答ありがとうございます。 最近PHPの勉強を始めたのですが、PHP開発をするにあたってセキュリティ面での配慮も必要になってきますよね。 今回はShibuyaさんの方法をとってやりたいことは出来ましたが、 もっとセキュリティに関しても勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問