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

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

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

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

Q&A

2回答

776閲覧

PHPでの画像ダウンロード方法

web_start

総合スコア19

PHP

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

0グッド

0クリップ

投稿2019/07/10 07:49

PHPを使って、画像を取得して特定のディレクトリに新しいファイル名で保存したいのですが、画像ファイルは作成されるのに中身が0kbの空のjpgファイルが作成されます。
下記の通りのコードで処理していますが、この場合だと上手くバイナリデータを取得できていないということでしょうか?

PHP

1 2//ダウンロード後のファイル名 3$save_file='./download/new.jpg'; 4 5//元の画像 6$url = 'http://任意のドメイン/img/old.jpg'; 7 8//file_get_contentsで取得 9$data = file_get_contents($url); 10 11//特定のディレクトリーにファイルを保存する 12file_put_contents($save_file,$data);

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

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

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

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

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

tetsunosuke

2019/07/10 07:54

おそらく、E_WARNING レベルのエラー が発生していると思いますので、 下記のようにレポーティングレベルを変えたり、警告の出力をオンにしてみてください。 error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 'On'); もしくはログファイルに何か出ているかもしれないので、そちらを参照してみてください。 原因はいくつか考えられますが、まずはエラーかどうかを調べられる状態にしてみてください。
m.ts10806

2019/07/10 07:56

file_get_contentsの結果の$dataをvar_dump()してみてください。
web_start

2019/07/10 08:13 編集

教えて頂いた方法で実行してみると Warning: file_put_contents(./download/new.jpg): failed to open stream: No such file or directory in... と表示されていてエラーが出ていました。
m.ts10806

2019/07/10 08:20

そのphpファイルと同じ階層にdownloadフォルダはあるのでしょうか。
web_start

2019/07/10 08:24

同じ階層にフォルダはあります。パーミッションかなと思い777に設定して試しましたが変わらずでした。 それとこのサーバ自体にベーシック認証をかけているのですが、その認証にひっかかるなどありますでしょうか。
m.ts10806

2019/07/10 08:26

おそらく別問題かなと(試したわけではないですが) ひとまず下記の結果も教えてください。正しく取得できていないとputもできないと思うので。 var_dump($data);
web_start

2019/07/10 08:28

教えて頂いたコードを入れてみました。 bool(false)
m.ts10806

2019/07/10 08:34

画像がそもそも取れてませんね。 指定したURLは直に実行して画像が表示されるものですか?
web_start

2019/07/10 08:36

直に実行したところ画像は正しく表示されるのですが、なぜ取得できないのかが
web_start

2019/07/10 08:56

再度、var_dump($data);すると文字列が表示されました。
guest

回答2

0

試しにローカル環境で同一サーバー内に置いたjpgファイルで試してみたところ正常に別名保存されました。
私が個人で借りているサーバーに置いた画像URLを指定したところ正常に取ってこれました。

考えられる原因は何個かあります。

  • 画像URLが間違っている
  • 取得しようとしている先が外部からのプログラムによるアクセスを制限している
  • 実行しているPHPがローカル環境ならドメイン不明の環境からのアクセスを制限とか

その他(ちょっとすぐ思いつきませんでした)

投稿2019/07/10 08:40

m.ts10806

総合スコア80854

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

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

0

$data = file_get_contents($url);
のあとに

PHP

1print mb_strlen($data);

で正しいサイズのデータが取得できていますか?

追記

getできないことを想定するなら分岐しておいたほうがよいかもしれません

PHP

1if(($data = file_get_contents($url))!==false){ 2 file_put_contents($save_file,$data); 3}; 4

なおfile_get_contentsが失敗するというのはサーバーから当該サイトへの
経路が確保されていない可能性があります。
たとえばproxy経由でならアクセスできるかもしれないので
サーバーの設定を確認してください。
ネットワークのオプションがある場合cURL利用するほうがよい

投稿2019/07/10 07:56

編集2019/07/10 08:37
yambejp

総合スコア114919

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

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

web_start

2019/07/10 08:11

教えて頂いた方法で確認すると、0 と表示されていてデータ自体取れていませんでした。
yambejp

2019/07/10 08:37

とりあえずエラーの想定については追記しときました
web_start

2019/07/10 09:04

再度、print mb_strlen($data);を実行すると 4660 と表示されたので、取得はできるようになったと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問