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

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

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

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

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

Q&A

解決済

1回答

2669閲覧

フォルダ内の画像をダウンロードできるようにしたい

ionsite55

総合スコア8

PHP

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

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

0グッド

0クリップ

投稿2020/06/03 05:07

フォルダ内の画像をダウンロードしたいです。
下記ようなフォルダ構成になっており、datas配下には「20200603」のような日付のフォルダが沢山あり、その中のimagesフォルダの中に画像が複数入っています。

├ datas/
│ └ 20200603/
│ └ images/ 
│        ├ image01.png
└ dl.php/    └ image02.png

発生している問題

実行すると画像がダウンロードされるのですが、画像を開くと「このファイルはサポートされていない形式のようです」と表示され、ファイルを上手く指定できていないようです。

ソースコード

$idで日付のフォルダ(上記だと「20200603」のフォルダです)を指定して、画像を取り出したいです

php

1$id = '20200603'; 2//ディレクトリ内のファイル一覧を取得 3$result = glob("./datas/{$id}/images/*"); 4 5foreach ($result as $fpath) { 6 7 //トリムして画像のファイル名を取得 8 $file = str_replace("./datas/{$id}/images/", '', $fpath); 9 10 //画像のダウンロード 11 header('Content-Type: application/octet-stream'); 12 header('Content-Length: '.filesize($fpath)); 13 header('Content-disposition: attachment; filename="'.$file.'"'); 14 readfile($fpath); 15}

試したこと

・パスやファイル名が合っているかvar_dump($result)、var_dump($fpath)、echo $fileなどと表示させながら進めてみました。ファイル名などは指定出来ているように思います。

・下記ソースで実行したところ指定した画像がダウンロードでき、画像も表示されました。

php

1$id = '20200603'; 2 3//画像のパスとファイル名 4$fpath = "./datas/{$id}/images/image01.png"; 5$fname = 'image01.png'; 6 7//画像のダウンロード 8header('Content-Type: application/octet-stream'); 9header('Content-Length: '.filesize($fpath)); 10header('Content-disposition: attachment; filename="'.$fname.'"'); 11readfile($fpath);

どちらのソースコードでダウンロードされた画像も同じファイル名なのですが、1つ目のソースコードではどこに原因があるのでしょうか?
ご教授の程よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

どちらのソースコードでダウンロードされた画像も同じファイル名なのですが、1つ目のソースコードではどこに原因があるのでしょうか?

一つ目のソースコードでは複数のファイルを一度にダウンロードさせているように見えます。
流れとしては

  1. haeder()でHTTPヘッダを出力
  2. readfile()でファイル本体を出力
  3. 1からディレクトリに存在するファイル数の数だけ繰り返す

ですが、1-2の流れを一回のリクエスト中で繰り返すことはHTTP通信では許されていないので、最初のファイル以降の出力が全てデータ本体として1つのファイルとして扱われている状態です。

例えば二つ目のコードで

PHP

1 2$id = '20200603'; 3 4//画像のパスとファイル名 5$fpath = "./datas/{$id}/images/image01.png"; 6$fname = 'image01.png'; 7 8//画像のダウンロード 9header('Content-Type: application/octet-stream'); 10header('Content-Length: '.filesize($fpath)); 11header('Content-disposition: attachment; filename="'.$fname.'"'); 12readfile($fpath); 13 14//画像のダウンロード2回目 15header('Content-Type: application/octet-stream'); 16header('Content-Length: '.filesize($fpath)); 17header('Content-disposition: attachment; filename="'.$fname.'"'); 18readfile($fpath); 19

としてみると問題が再現できますので試してみてください。
(試していませんが、おそらくダウンロードされるファイルのサイズが約2倍になっているはずです)

よくある解決方法としては、ディレクトリをzipなどで一つのファイルに固めてから、1回でダウンロードさせることです。

投稿2020/06/03 05:18

編集2020/06/03 05:26
tanat

総合スコア18713

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

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

ionsite55

2020/06/03 05:43

ありがとうございます。 ご指摘の通り、画像を1枚だけ指定ししてのダウンロードは実行できました。 zipにして処理しようと思います。
tanat

2020/06/03 05:54

疑問が解決して良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問