file_get_contents関数のダウンロード先の書き方 - PHPプロ!Q&A掲示板

4926

  • 0P

file_get_contents関数のダウンロード先の書き方

質問日時 / 2018年2月20日 20:58    回答数 / 7件

Questioner:  wotagiri  このエントリーをはてなブックマークに追加 

jpg,pdf,txt,jpg,pdfなどのファイルをダウンロードしたい。
//*********************************************************
$file="c:\test.jpg";
$url 'http://iki100j.heteml.jp/members/kaigi/files/876a/geo.jpg';
$data = @file_get_contents($url);
file_put_contents($file,$data);
print "<pre>";print_r($http_response_header);print "/pre";
//*********************************************************
と書いて、実行すると
Array
(
    [0] => HTTP/1.1 200 OK
    [1] => Date: Tue, 20 Feb 2018 11:50:27 GMT
    [2] => Server: Apache
    [3] => Last-Modified: Tue, 20 Feb 2018 06:50:41 GMT
    [4] => Accept-Ranges: bytes
    [5] => Content-Length: 139509
    [6] => Vary: Accept-Encoding
    [7] => Connection: close
    [8] => Content-Type: image/jpeg
)
と出力され、正常にダウンロードしたように見えるが、ダウンロードしたファイルがどこにも見つからない。
C:\test.jpg";の記述に問題があるのでしょうか。
パソコン内の全フォルダーに検索をかけても、このファイルが見つからない。
なおサイト内ではすべてutf-8で扱っていますが、docx,xlsxなどは、s-jis、またファイルの属性はとりあえず、「777」にしてあります。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimix>パソコン内の全フォルダーに検索をかけても、このフ
┃┗A01-1wotagiri申し訳ありません、掲示板に不慣れでご回答いただいて
┃ ┗A01-1-1shimix>サーバー内にアップロードしてある会議資料を、同じ
┃  ┗A01-1-1-1wotagirishimiさん 時間がかかりましたが、よくわかりました
┗A02shimixもし他サイトから取得した画像を「ローカルにダウンロ
 ┣A02-1wotagiriご丁寧に有難うございます。 早速やってみます。
 ┗A02-2wotagirishimixさん php初心者のためか、いただいた書式は大

回答一覧

並び替え:

A01 参考になった
answerershimix [2月21日 10:57]

>パソコン内の全フォルダーに検索をかけても、このファイルが見つからない。

PCというのはphpスクリプトにアクセスしたPCではなくphpスクリプトが実行されたPCですよね(ローカルサーバを立てているのかphpをコマンドラインで実行しているのか不明ですが)。


>C:\test.jpg";の記述に問題があるのでしょうか。

$file = "c:\\test.jpg";

もしくは

$file = 'c:\test.jpg';

と書くべきでしょうね。echo $file としてみればわかりますが、二重引用符で括っているのでバックスラッシュはエスケープとして扱われます(\tでタブコードと解釈されている)。おそらくは、$file = 'c:/test.jpg'; でも問題ないと思います。

ただし、phpからCドライブの直下にファイルが書き込めるかどうかは別の話です。アクセス権限的に無理じゃないですかね。

>ファイルの属性はとりあえず、「777」にしてあります。

えっと・・。'c:\test.jpg' ですからWinOSですよね?WinOSでないなら(権限の問題は置いといて)$file = '/test.jpg'; です。

未検証ですが、Cドライブの直下は無理な気がします(他の適当なフォルダの下なら大丈夫かもしれません)。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerwotagiri [2月23日 06:46]

申し訳ありません、掲示板に不慣れでご回答いただいているのに、23日になって気が付きました。

(1)
Shimixさん>>PCというのはphpスクリプトにアクセスしたPCではなくphpスクリプトが実行されたPCですよね(ローカルサーバを立てているのかphpをコマンドラインで実行しているのか不明ですが)。
質問者>>ユーザーAがフォーム内に
<input type=”file” … …>を使って、サーバー内にアップロードしてある会議資料を、同じ会議の出席者(複数)である別のユーザーBに知らせ、ユーザーBのパソコン内にアクセスしようとするものです。
アップルードされたファイルのアクセス属性は、最終的には705と思っていますが、システム側で設定できます。

(2)
質問者追伸>>前回、file_put_contents($file,$data)を実行後、「 HTTP/1.1 200 OK」が出ているのに、パソコン内にファイルが見つからないと書きましたが、これらはいずれもサイト内に作られていたことが判明しました。$fileの記述が不適当だったようです。

その結果、サイト内に
members/kaigi/c: est.jpg
members/kaigi/c:\geo.jpg
HP04 フェイスブック運用方針v1.docx䌭湯牴汯
等、パス名として許されない文字を含むファイルが作られてしまい、通常のFTPはこれらを開くことも、削除することもできなくなり、現在、サーはバーのレンタル先に、削除依頼する羽目になってしまいました。

(3)
shimixさん>>二重引用符で括っているのでバックスラッシュはエスケープとして扱われます
質問者>>不勉強でした。この点に気を付けてもう少しやってみます。

(4)
shimixさん>>えっと・・。'c:\test.jpg' ですからWinOSですよね?WinOSでないなら(権限の問題は置いといて)$file = '/test.jpg'; です。

未検証ですが、Cドライブの直下は無理な気がします(他の適当なフォルダの下なら大丈夫かもしれません)。 

質問者>>一般的にはWindowsOSです。欲を言えば「ダウンロード」と「閲覧」ですが、まずはダウンロードだけに限定です。ダウンロード先は、とりあえず、Windowsシステムに「ダウンロードパス」として設定されているフォルダーに限定したい思っていますが、phpでローカルのパスを指定するのは、無理なのでしょうか。

この意見に回答する

ツリーへ TOPへ

A01-1-1 満足
replyershimix [2月23日 08:39]

>サーバー内にアップロードしてある会議資料を、同じ会議の
>出席者(複数)である別のユーザーBに知らせ、ユーザーBの
>パソコン内にアクセスしようとするものです。

#当然ですが「ユーザBのPC内にアクセス」なんてできません(できたら怖い)。

別の回答でも示したとおり、webサーバから(http経由で)ダウンロードさせようとするファイルに関してサーバ側で指定できるのは「ファイル名」だけです。ディレクトリの指定はできません。
というかダウンロード時に「名前を付けて保存」で別の名前で保存することもできますよね。

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerwotagiri [2月24日 15:09]

shimiさん
時間がかかりましたが、よくわかりました。file_gut_contentsもfile_put_contentsも、あくまでサーバーの見える範囲であり、その中に自分パソコンのパス名を書こうとするのは、避ける(できない?)べきと理解しました。

本件はファイルのダウンロードはやめて、 mb_send_mailにて、メールに添付の形でダウンロードしていただくこととし、基本的な確認を終了できました。

file_put_contentsのダウンロード先について、認識が欠けていて、お騒がせをいたしました。スレッドの当初質問の移動先もサイトの中にちゃんとファイルは移動していました。

この意見に回答する

ツリーへ TOPへ

A02 参考になった
answerershimix [2月21日 11:05]

もし他サイトから取得した画像を「ローカルにダウンロードさせたい」ということであれば、

<?php
$file = 'test.jpg';
$url = 'http://iki100j.heteml.jp/members/kaigi/files/876a/geo.jpg';
if (($data = @file_get_contents($url)) === false) { die('Abort'); }
if (strlen($data) === 0) { die('Abort'); }
foreach ($http_respons_header as $val) {
    if (stripos($val, 'content-type') !== false) { $header = $val; }
}
if (!isset($header)) { die('illegal header'); }
header('Content-Disposition: attachment; filename="' . $file . '"');
header($header);
echo $data;

のようになると思います。指定できるのはファイル名のみ(しかも書き替え可能)です。サーバのphpスクリプトからはローカルのディスクの構成もOSもわかりませんからね。

この意見に回答する

ツリーへ TOPへ

A02-1
replyerwotagiri [2月23日 06:48]

ご丁寧に有難うございます。
早速やってみます。

この意見に回答する

ツリーへ TOPへ

A02-2
replyerwotagiri [2月24日 15:26]

shimixさん
php初心者のためか、いただいた書式は大変勉強になりました。

頂いた書式のうち、foreachが、引数不良でなかなかうまくいかず、断念しました。
phpのバージョン(当方php5.4)が古いためかもしれません。

いずれにしても、本スレッドのfile_get_contactsは諦め、mb_sen_mailで、メール添付することで進めることとし、本スレッドは終了とします。

ご指導ありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)