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

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

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

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

Q&A

解決済

2回答

2379閲覧

phpによるファイルをアップロードはできるがダウンロードがうまくいかない。

kondokaisya

総合スコア25

PHP

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

0グッド

0クリップ

投稿2018/06/29 01:06

前提・実現したいこと

PHPでアップロードしたファイルを、ダウンロードしたいが、ダウンロードした際ファイルの内容が全然違っているので
ちゃんとしたファイルを受け取りたい。

該当のソースコード

php

1<?php 2//ダウンロードをしたいファイル名のパス 3$file_name = 'test.txt'; 4//$file_path = '/var/www/html/UploaderServer/upload/'.$file_name; 5$file_path = dirname(__FILE__).'/upload/'.$file_name; 6print $file_path; 7 8//ダウンロード時のファイル名 9$download_file_name = 'test.txt'; 10 11//タイプをダウンロードと指定 12header('Content-Type: application/force-download;'); 13 14//ファイルのサイズを取得してダウンロード時間を表示する 15header('Content-Length: '.filesize($file_path)); 16 17//ダウンロードの指示・ダウンロード時のファイル名を指定 18header('Content-Disposition: attachment; filename="'.$file_name.'"'); 19 20//ファイルを読み込んでダウンロード 21//readfile($download_file_name); 22file_get_contents($download_file_name); 23?>

試したこと

readfile();の代わりにfile_get_contents();を使ってみたが
中身は変わらない。

補足情報(FW/ツールのバージョンなど)

test.txtには[これはテストです。]という内容を打っているのに、
アップロード、ダウンロード後の内容が「/var/www/html/UploaderServer/upload/test.txt」に
なっていました。

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

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

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

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

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

yoorwm

2018/06/29 01:09

file_get_contentsだけだと出力しないと思いますが、出力はどの部分で行われていますか?
guest

回答2

0

ベストアンサー

まずは下記のようにprintしている箇所をコメントアウトしてください。

php

1$file_path = dirname(__FILE__).'/upload/'.$file_name; 2//print $file_path;

理由:
Content-Type: application/force-download;
により、同実行中の出力全てを$download_file_nameの名前でダウンロードします(テキストファイルなのでテキストとして)
ダウンロードに含めない情報は何であっても画面出力のprint,echoなど書いてはいけません。
※エラーが出力された際もダウンロードファイル内に書き込まれますのでご注意を

あとはreadfile()でも何でもいいので、ファイルの内容を取得して、print,echoなどで出力をするだけです。

投稿2018/06/29 01:14

m.ts10806

総合スコア80765

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

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

kondokaisya

2018/06/29 01:24

返信ありがとうございます。ダウンロード内容の/var/www/html/UploaderServer/upload/test.txtはなくなったのですが、今度は中身の内容がないのですが、どうすればいいでしょうか?
m.ts10806

2018/06/29 01:27

回答に書いてます。 > あとはreadfile()でも何でもいいので、ファイルの内容を取得して、print,echoなどで出力をするだけです。 パス出力のprint部分をコメントアウトしただけだと「ファイルの内容を取得」しかしていません。
kondokaisya

2018/06/29 01:38

ごめんなさい、どのあたりにprint又はechoをつければいいのかよくわからなかったので、例で出していただけると助かります。
m.ts10806

2018/06/29 01:44 編集

回答読んで意味を理解してください。 > Content-Type: application/force-download; により、同実行中の出力全てを$download_file_nameの名前でダウンロードします(テキストファイルなのでテキストとして) 実行中プログラム内なら基本的にどこで書いても同じです。 基本的なところですが、まず、やってみませんか?やってみて想定通りいかないときに質問してください。 PCが破壊されるようなプログラムではありません。 あと元々のコードは何か参考にしたのでしょうか? 調べれば結構幾らでも出てきそうなものなので、コメントする時間で調べて実行した方が早いです。 質問者さんが今のコメントを打って、 私が見て、 私が何かしらコードを例示して 質問者さんがそのコメントとコードを見て 自身の環境にで再現確認をする その間にできあがるものと思っていただいて差し支えありません。
m.ts10806

2018/06/29 01:49

コメントを一部訂正します。 > パス出力のprint部分をコメントアウトしただけだと「ファイルの内容を取得」しかしていません。 今現在のコードだと「取得処理」は投げているだけで結果を受け取っていないので「内容を取得」してませんね。
m.ts10806

2018/06/29 01:49

まあ、あとはファイルの文字コードの問題とかで文字化けにもなりそうですが、そこは結構出尽くしているやり方なので調べてみてください。
kondokaisya

2018/06/29 01:53

できました!お手数かけてすみません。もう少し読み解くことを頑張ってみます。わかりやすく説明していただきありがとうございました!
m.ts10806

2018/06/29 01:55

最終的にどうなったかも書いてください。「できました」だけではどう解決したのか分からないのでお手数ですがよろしくお願いします。 https://teratail.com/help/question-tips#questionTips4-2 > あなたがどのアドバイスを元に、どのように解決できたのかをお礼とともに伝えましょう。
kondokaisya

2018/06/29 08:20

<?php $tname = $_POST['tname']; //ダウンロードをしたいファイル名のパス $file_name = $tname; //$file_path = '/var/www/html/UploaderServer/upload/'.$file_name; $file_path = dirname(__FILE__).'/upload/'.$file_name; //print $file_path; //ダウンロード時のファイル名 $download_file_name = $file_path; //タイプをダウンロードと指定 header('Content-Type: application/force-download;'); //ファイルのサイズを取得してダウンロード時間を表示する header('Content-Length: '.filesize($file_path)); //ダウンロードの指示・ダウンロード時のファイル名を指定 header('Content-Disposition: attachment; filename="'.$file_name.'"'); //ファイルを読み込んでダウンロード readfile($download_file_name); ?>
m.ts10806

2018/06/29 08:21

解決できたようで何よりです。 おそらくデバッグのために出力されたものとは思いますが、 それが悪さをすることも多々ありますので、気を付けてくださいね。
kondokaisya

2018/06/29 08:21

ダウンロード時のファイル名の場所にふぁいるのディレクトリがあるパスを入れたらできました。
guest

0

<?php $tname = $_POST['tname']; //ダウンロードをしたいファイル名のパス $file_name = $tname; //$file_path = '/var/www/html/UploaderServer/upload/'.$file_name; $file_path = dirname(__FILE__).'/upload/'.$file_name; //print $file_path; //ダウンロード時のファイル名 $download_file_name = $file_path; //タイプをダウンロードと指定 header('Content-Type: application/force-download;'); //ファイルのサイズを取得してダウンロード時間を表示する header('Content-Length: '.filesize($file_path)); //ダウンロードの指示・ダウンロード時のファイル名を指定 header('Content-Disposition: attachment; filename="'.$file_name.'"'); //ファイルを読み込んでダウンロード readfile($download_file_name); ?>

投稿2018/06/29 08:18

kondokaisya

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問