PHPで画像のURLからサーバーにダウンロードする方法と色々なケース

PR

PHPで画像のURLから直接サーバーに画像をダウンロードする方法です。file_get_contents を使って、ネット上にあるURLで指定されたものをダウンロードします、取得したものは file_put_contentsを使ってファイル名をつけて保存します

 

PHPで画像をダウンロードして保存する

単純に画像のURLがあれば、それを元に画像をダウンロードしてサーバーに保存することが出来ます。少しだけ注意点があるので、そのポイントを抑えておけば簡単に利用できます。

 $data = file_get_contents($value);
 file_put_contents('./download/'.$filename,$data);

 

file_get_contents でネット上からファイルをダウンロードしてきます。これは画像に限らず取得することが出来ます、その取得したものを $data に格納しています。

次の行では、ファイルをローカルに保存する作業を行っています、file_put_contents を使うことでファイルに保存することが出来ます、こちらも画像に限らず色々なものを保存出来ます。例えば、テキストファイルを作成して、テキストファイルの中に文字を入れて保存なども出来ます。 ./download/ のとろこで保存するディレクトリを指定しています。ディレクトリが存在しない場合にはエラーが出ます。 $finename のところにはファイル名をつけます、例えば jpgの画像なら gazou.jpg の様に拡張子付きの名前にします、 $data のところでは取ってきた画像データが入っています。

 

注意点は、存在するディレクトリで有ること、ファイル名は重複すると上書きされてしまうということです。

 

 

配列を使って連続的にダウンロードする

ダウンロードしたい画像のURLリストがあれば、それを元に foreache を使って連続的にダウンロードさせることが出来ます。配列は、APIやHTMLから収集したURL、データベースから取り出した値などを入れたりしておきます。

 

配列の例

$img_url = array(
 "url_1",
 "url_2",
 "url_3",
 "url_4",
 "url_5",
 "url_6",
 "url_7",
);

 

 

foreacheで連続的にダウンロード

foreach( $img_url as $value ) {
 
 //画像のURLからファイル名を生成
 $filename = basename($value);
 
 //画像の取得と保存
 $data = file_get_contents($value);
 file_put_contents('./download/'.$filename,$data);
}

foreacheは配列の数だけ繰り返し処理を行います、例の配列なら7つの値があるので7回繰り返します。繰り返す度に画像のファイル名を違ったものにする必要があるので、ダウンロードする画像のURLから basename() を使ってファイル名を取得し、そのままの名前で保存します。

ファイル名が重複してしまう場合には、日付や独自にネーミングルールを導入しなければ同じファイル名のものが上書きされてしまいます。

 

 

ファイル名をユニークにする

date_default_timezone_set( 'Asia/Tokyo' );
foreach( $img_url as $value ) {
 
 //画像のURLからファイル名を生成
 $filename = basename($value);
 
 //ファイル名をユニークにするために、ダウンロード時のタイムスタンプを付ける
 $filename = date('Ymdhis').$filename;
 sleep(1);
 
 //画像の取得と保存
 $data = file_get_contents($value);
 file_put_contents('./download/'.$filename,$data);
}

ファイル名に取得日時の秒数まで、ファイル名の接頭にしています。ファイルの拡張子は basename() で取得したファイル名に含まれているので、拡張子の付け直しをしないように接頭に取得日時をつけてファイル名をユニークにしています。ファイルのダウンロードが早すぎて、1秒以内に複数ダウンロードしてしまうことがあるので sleep() を使って1秒遅延させています。今回の例では、秒までをタイムスタンプとしているので sleepで1秒待たせていますが、ミリ秒まで含めれば sleep() 処理は無くしても大丈夫かと思います

 

 

あとは、重複ダウンロードを避けるために、ダウンロード済み画像リストを保存しておき。そのリストと新たなダウンロード予定のリストを array_diff()array_diff_key() を使って重複を削除してやれば 同じソースからのダウンロードは1度だけに出来ます

PR

COMMENT

コメントを残す

PR

9ineBBの管理人が運営するサイト

WDG WEB DESIGN GALLERY ウェブデザインギャラリー