mkdirでディレクトリを生成し写真を保存する方法

このQ&Aのポイント
  • phpを使用してディレクトリを生成し、写真ファイルを保存する方法について教えてください。
  • 現在、ディレクトリを生成することはできますが、写真を保存する段階で問題が発生しています。
  • Apacheに書き込み権限を与える設定を行う必要があるのでしょうか?他に方法はありますか?
回答を見る
  • ベストアンサー

mkdirで生成したディレクトリに写真を保存する方法を教えて下さい。

行いたいことは、phpでディレクトリを生成して、その中に写真ファイルを保存したいのですが、おそらくディレクトリの所有者と権限(パーミッション)の問題でうまくいきません。 今試している手順は以下の通りです。 //ディレクトリの生成場所 $uploadDir = "./img/DirA"; //ディレクトリを生成 パーミッションは777にしたい mkdir ($uploadDir,0777); //フォームからアップロードした写真を「DirA」に移動 move_uploaded_file($_FILES['photoA']['tmp_name'],$uploadDir."/photoA.jpg"; 上記で、無事、ディレクトリ「DirA」が生成されるのですが、その後の写真を「DirA」に保存する段階でうまくいきません。 原因について色々調べてみたのですが、生成した「DirA」の所有者が「apache」になっていて、権限が「777」で指定しているにも関わらず、「755」しか与えられないからだと思いました。 おそらく、「DirA」の権限が「777」(書込権限を付与)できれば、問題ないと思うのですが、これは、Apache自体に書込権限がないことが理由なのでしょうか? もし、この件については、何か方法があれば、教えて頂きたいです。 Apacheに書込み権限を与える設定をサーバーに行うことが必要なのでしょうか?それ以外に方法がありますでしょうか? 最終的には、生成されたディレクトリに写真を保存できれば良いのです。 どうぞ、宜しくお願い致します。 環境 Apache 1.3.37 PHP 5.2.5 MySQL 5.1.22-rc

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

おそらくumaskの値の影響だと思います。 PHPマニュアルより引用 ---- モードを八進数で指定したくなることもあるかもしれません。 その場合は先頭にゼロをつける必要があります。 また、モードは、現在設定されている umask の影響も受けます。 umask を変更するには umask() を使用します。 ---- 以上より、mkdirの前にumask(0);と記述してやれば777のパーミッションでディレクトリが作成できるはずです。 もしくは、パーミッションを指定せずにmkdirした後、chmodでパーミッションを変更する方法でも良いと思います。 どちらの方法にするかは以下より判断するのがよいかと思います。 PHPマニュアルより引用 ---- 注意: マルチスレッドな Web サーバでこの関数を使用することは避けてください。 ファイルを生成後、chmod() を使用してファイル権限を 変更するのがより良い方法です。全て同じ umask が使用されるので、 umask() の使用は、スクリプトを同時に実行する場合や Web サーバ自身の予期しない動作を引き起こす原因になる可能性があります。 ----

wdwdwd
質問者

お礼

非常に適切な回答有難うございました。 chmodでパーミッションを変更する方法で、うまくいきました。 しかしながら、その後のmove_uploaded_file関数が、うまく行かず、最終的な目的には至りませんでした。(おそらくセーフモードがオンになっていることが理由のようです。) パーミッションの件については、的確な回答有難うございました。大変参考になりました。

その他の回答 (2)

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.3

ANo.1です。 詳しい補足情報のご提供ありがとうございます。 アップロードエラーは発生していない上、エラーメッセージを見る限り当初からご指摘になっていたようにセーフモードであるために制限を受けているということで間違いなかったわけですね。 私の方がマニュアルに記述されている内容を正しく理解できていなかったようです。大変失礼しました。 php.iniの設定を変更できない環境であるならば、目先を変えてアップロード先のディレクトリを予め用意しておくしかないような気もします(但しそれはなんらかの理由で好ましくないと考えておられるのだとは思いますが)。 結局のところお役に立てず申し訳ありません。

wdwdwd
質問者

お礼

色々ご意見有難うございます。 自分以外の方からも確認して頂けると、とても助かります。 サーバーを移転するものですから、環境が変わり、このような状況にぶつかってしまったわけです。 php.iniの設定を変えられるか、サーバー管理者に確認をとって、だめなら、写真の保存に関する一連の仕様を変更します。 速やかな回答を頂き、有難うございました。 大変ためになりました。

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.2

ANo.1です。 解決に至らなかったということなので、改めてマニュアルに目を通してみたのですが、move_uploaded_file()についてはセーフモードでも制限を受けるものの不可能というわけではないんですよね。その制限もmkdir()、chmod()と差が無いように見えるのでなぜアップロードができないか非常に気になります。 私自身、セーフモードで実行した経験もなく、再現する環境もないのでこれ以上首を突っ込むのもはばかられますが少しだけ確認させてください。 ・どのようなエラーメッセージがでているか ・全くエラーが表示されていない場合はdisplay_errorsやerror_reportingの値はどうなっているか ・アップロードエラーになっていないか($_FILES["photoA"]["error"]の値はどうなっているか) もし既に解決しておられましたら参考までに解決方法をご報告頂けますでしょうか。

wdwdwd
質問者

補足

再度、ご連絡頂き有難うございます。 本来なら私がマニュアルを解釈できれば良いのですが、そこまで至りませんで、申し訳ありません。 さて、エラーメッセージは、以下のように出ています。 Warning: move_uploaded_file() [function.move-uploaded-file]: SAFE MODE Restriction in effect. The script whose uid is 10231 is not allowed to access /virtual/***/public_html/img/DirA owned by uid 1000 in /virtual/***/public_html/reg.php on line 91 $_FILES["photoA"]["error"]の値は、0です。 これは、テンポラリディレクトリへのアップロード成功を意味しますよね。 つまり、DirAの所有者がApacheで、reg.phpの所有者がFTPユーザーなので、move_uploaded_fileが使えませんよ、ということかと考えています。

関連するQ&A

  • php実行権限以外でのディレクトリ(ファイル)作成方法

    webからphpを起動し、ディレクトリを作る場合、 phpが実行された権限ではない権限で作ることはできますか? 所有者がapacheとなるディレクトリを作りたいのです。 試してみたこと。 ・mkdirでディレクトリ作成後、chownで所有者変更が出来ればいいのですが、 root権限で動いているわけではないので無理でした。 ・シェルを作って、シェルの所有者をapacheにしてphpからコマンドラインで シェルを呼び出してみましたが所有者apacheで作られません。

    • ベストアンサー
    • PHP
  • 「mkdir」について

    レンタルサーバでmkdir関数を使ってサーバ上でディレクトリを作成しようとしています。 mkdir("$dir_name",0777); として実行しています。 ディレクトリは作成されるのですが、パーミッションの変更がされず755で作成されてしまいます。 それから大きな問題がもうひとつ。 作成されたディレクトリをffftpで見ると所有者が nobodyとなっており、ディレクトリの削除ができません。(削除できないのが一番の問題ですが後回しにします) パーミッションの変更ができない点や、所有者がnobodyとなるのはサーバの仕様なんでしょうか? これがサーバの仕様ならば、サーバ上でディレクトリを作成しパーミッションを変更するのは不可能となってしまうのでしょうか? ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • mkdirについて

    あるページにおいて、サブミットを押したらディレクトリを作る、というものを作ってみたのですが、ディレクトリが出来ません。。なぜなのでしょうか??? このページのサブミットを押すと、、 <html><body> <FORM ACTION="/cgi-bin/test.pl" METHOD="POST"> <INPUT TYPE="submit" VALUE="Submit"> </FORM> </body></html> ↓ ↓ このCGIでディレクトリを作るようにしたいのですが。。 #!/usr/bin/perl print "Content-type: text/plain", "?n?n"; $mkdir = "/bin/mkdir"; $dir = "/tmp/testdir"; @test = ($mkdir, $dir); system @test; 家のパソコン(MacOSX)で試していますので、サーバ側の問題ではないと思います。mkdirなどのパスも確認したのであっていると思います。分かる方、お願いします。

    • ベストアンサー
    • CGI
  • ローカルホストでディレクトリ作成

    いつもお世話になっております。 現在、自宅でphpを使って開発をしています。 mkdirを使用してディレクトリを作成しようとしてるのですが、 サーバー上ではパーミッションの設定をその他に対して書き込み権限を与えればうまくいくのですが、 ローカルホスト上では「Permission denied 」エラーが出てうまく作成できません。 IIS6.0でどうやってパーミッションを操作するのかが分からず困っています。 どのようにすればローカル環境でディレクトリ作成できるかお教えください。 開発環境は以下の通りです。 言語:php5 WEBサーバ:IIS6.0 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 別ユーザ所有のディレクトリ内にファイル作成できない

    こんばんは。 タイトルのとおりですが、まずPHPでディレクトリを作成し、 その中にindex.htmlを作成しようとしているのですが上手くいきません。 PHPで作成したディレクトリの所有者はapacheになっているためかと思い、 実際にFTPを通して自分で作成したディレクトリの中にindex.htmlを作成したところ上手くいきました。 ディレクトリのパーミッションはいずれもスクリプトにより0777を指定しています。 このように、PHPのみでディレクトリを作成し、その中にファイルを作成する といったことが出来ずにいます。解決策等ございましたらお教えください。 参考までに、ソースを掲載しておきます。 これを設置するディレクトリのパーミッションは0777にしてみましたが、出力は「fopen error」になります。 <?php $path = "./dir/"; if(mkdir($path, 0, true)){ chmod($path, 0777); if($fp = fopen($path."index.html", "w")){ fputs($fp, $put); fclose($fp); print "Created!"; }else{ print "fopen error"; } }else{ print "mkdir error"; } ?>

    • ベストアンサー
    • PHP
  • ディレクトリのパーミッション

    FMVA77C2LG (Win10) ファイル(免許証)をアップロードすると、次のエラーメッセージが出ました。 添付ファイル一時保存用のディレクトリが無いかパーミッションが正しくありません。./tmp/ディレクトリが存在するか、または./tmp/ディレクトリのパーミッションを書き込み可能(777等※サーバによる)にしてください どうしたらいいでしょうか? よろしくお願い致します。 ※OKWAVEより補足:「富士通FMV」についての質問です。

  • 削除出来ないディレクトリが出来ました・・・削除方法を教えてください。

    色々と調べてみたのですが、方法が分からなかったのでこちらで質問をさせてください。 現在CentOS5、apacheで運営をしているのですが、サーバー上にパーミッション700のディレクトリがあるのです。 削除しようと思っても出来ないのですが、パーミッションの変更も中に入ることも出来ません・・・。所有者はapacheになっています。 もちろんrootからの操作です。 このディレクトリを削除する方法はありますでしょうか? 何分サーバー管理自体初心者なものでうまく理解できるか不安なのですが、どなたかご存知の方、また同じようなご経験者の方いらっしゃいましたら、何卒アドバイスのほうよろしくお願いいたします。

  • ディレクトリパーミッションの読込み権限

    一般的なWebサーバーに於いて、ディレクトリに対するパーミッションの表す具体的な意味がよくわかりません。いろいろ調べてはいるのですが、以下のような漠然とした理解に留まっています。 読込: ディレクトリの中身を見る(?) 書込: ディレクトリ内でファイルを作成, 削除 実行: ディレクトリ内のファイルにアクセス 特に判然としないのが、読込みと実行の違いです。 現在、自サイト内の全てのディレクトリのパーミッション値を701、つまり訪問者には実行権限のみを与えるということで統一していますが、今のところ問題は起きていません。 では、読込み権限が必要になるのはどのような場合が考えられるでしょうか。 また、上記の私の理解は合っているでしょうか。間違っていれば訂正、補足をお願い致します。

  • WindowsでPHPのアップロード系処理を扱うときのディレクトリパー

    WindowsでPHPのアップロード系処理を扱うときのディレクトリパーミッションについて。 Windows7+Apache2.2.x+PHP3.1でアップロード処理を行ったときに、php.ini内で設定されているアップロード一時ディレクトリからmove_uploaded_fileでファイルを移動させるときにうまくいきません。$_FILES変数から一時ディレクトリの値をとってくることすらできていないようです。サーバを起動しているマシン内から行うとできます。リモートからのときにできません。 で、探してみたらこの問題で引っかかっている人が結構いたようで、Webサーバのディレクトリと同じパーミッションを与えてやればいいというような記述があったので、アップロード用ディレクトリにApacheのルートディレクトリから属性を継承ささせ、「Everyone」ユーザにフルコントロールを与えてみたのですが改善しませんでした。具体的な手順をご存知の方がおられましたら教えていただけると幸いです。

  • unlinkでどうしてもファイルが削除できない!!

    お世話になります。 いろいろとネットで情報を探しているのですが、どうしても解決しません。 ローカルなapacheのサーバにファイルをアップロードし、指定のファイルを削除するプログラムを作成しています。 プログラムファイルのあるディレクトリの下に"files"というディレクトリがあり、その下に、アップロードした日付でディレクトリ(例:"200511171010")をプログラム側で作成し、その下にファイルをアップロードするものです。 編集するプログラムで、選択したファイルを削除するというものです。 サーバは、Windows2000,MySQL,Apacheです。プログラムはEUCで書かれています。 ・フォルダを作成するプログラム $uniq = $dir_y.$dir_m.$dir_d.$dir_h.$dir_i; $uploaddir = "./files/$uniq/"; //ファイルのアップロード処理 if($_FILES['file1']['name'] != ""){ mkdir("$uploaddir"); $ufile[1] = $_FILES['file1']['name']; $ufile[1] = str_replace("'","’","$ufile[1]"); $uploadfile = $uploaddir.$ufile[1]; move_uploaded_file($_FILES['file1']['tmp_name'],mb_convert_encoding($uploadfile, "SJIS", "EUC-JP")); } ・ファイルを削除する部分 $rslt = unlink("./files/$uniq/$t[$i]"); です。 エラーは、 Warning: unlink(./files/20051115195407/購入書籍.xls) [function.unlink]: No such file or directory in C:\Program Files\Apache Group\Apache2\htdocs\shuchi\edit_ok.php on line 103 です。ファイル自体はあるのですが、削除されていません。 パーミッションとかも、フォルダを作成するときとか、いろいろいじってみたのですが解決しませんでした。 何かわかれば是非、教えてください。すみませんがよろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう