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

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

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

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

Q&A

2回答

6500閲覧

mkdir():Permission denied in のエラー文が消えない。

sk8976

総合スコア4

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

XAMPP

XAMPP(ザンプ)は、ウェブアプリケーションの実行に必要なフリーソフトウェアをパッケージングしたApacheディストリビューションです。 XAMPPひとつインストールするだけで、Apache、MySQL、PHP、Perlなどのソフトウェアと、 phpMyAdminなどの管理ツール、SQLiteなどのソフトウェアやライブラリモジュールなどを利用することが可能です。

0グッド

0クリップ

投稿2021/02/18 12:21

前提・実現したいこと

PHPの書籍に載っていた内容で、サーバーに画像をアップロードする機能を作成しています。本に記載されているコードを入力しましたが、画像を選択後にmkdir()についてのエラー分が表示されて、画像が表示されませんでした。

発生している問題・エラーメッセージ

Warning: mkdir(): Permission denied in /Applications/XAMPP/xamppfiles/htdocs/php_2/chapter5/upload-output.php on line 5

該当のソースコード

エラーで指定されたソースコード↓

php

1<?php require '../header.php'; ?> 2<?php 3 if(is_uploaded_file($_FILES['file']['tmp_name'])){ 4 if(!file_exists('upload')){ 5 mkdir('upload'); 6 } 7 $file='upload/'.basename($_FILES['file']['name']); 8 if(move_uploaded_file($_FILES['file']['tmp_name'].$file,$file)){ 9 // .$fileを第二引数として指定するとエラーが消えた 10 echo $file, 'のアップロードに成功しました。'; 11 echo '<p><img src="', $file, '"></p>'; 12 }else{ 13 echo 'アップロードに失敗しました。'; 14 } 15 }else{ 16 echo 'ファイルを選択して下さい。'; 17 } 18?> 19<?php require '../footer.php'; ?>

ボタン等のソースコード↓

PHP

1<?php require '../header.php'; ?> 2<p>アップロードするファイルを指定して下さい。<p> 3<form action="upload-output.php" method="post" enctype="multipart/form-data"> 4<!-- ファイルのアップロードは、 enctype="multipart/form-data"を指定する--> 5<p><input type="file" name="file"></p> 6<!-- type="file"を記述するとファイル選択欄が表示される --> 7<p><input type="submit" value="アップロード"></p> 8</form> 9<?php require '../footer.php'; ?>

試したこと

Googleでteratailやqiitaで情報収集した以下のことを試した

・mkdir('upload',0777);と追加したが、エラーは直らなかった。
・mkdir('upload');の次にchmod('upload',0777);を追加したが、エラーは直らなかった

補足情報(FW/ツールのバージョンなど)

PCは、Mac Air bookを使用
XAMPPを使用(7.3.26-1)
Visual Studio Codeを使用

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

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

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

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

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

guest

回答2

0

is_dirも使い、ファイル名でも、フォルダ名でも、存在しないパスであるかどうかを確認してから、フォルダを作成します。

permissionは指定しなくていいです。
基本的に親ディレクトリの権限を受け継いで、問題なく動くのが通常の動作です。
0777は不要です。
もしフォルダができていたら、一度削除してから、スクリプトの動作確認してみてください。

php

1#!/usr/bin/env php 2<?php 3 $upload_folder = './upload'; 4 5 if(!file_exists($upload_folder) && !is_dir($upload_folder)){ 6 mkdir('upload'); 7 } else { 8 echo "file or dir(folder) is exists."; 9 } 10?>

投稿2021/02/18 12:51

phoepsilonix

総合スコア233

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

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

sk8976

2021/04/05 13:09

phoepsilonixさん。ご回答いただき、ありがとうございました。 ご回答いただい内容を実行して見たのですが、エラー文は表示されたままの状態でした。 <?php require '../header.php'; ?> <?php if(is_uploaded_file($_FILES['file']['tmp_name'])){ $upload_folder= './upload'; if(!file_exists('$upload_folder') && !is_dir('$upload_folder')){ mkdir('upload'); }else{ echo "file or dir(folder) is exists."; } $file='upload/'.basename($_FILES['file']['name']); if(move_uploaded_file($_FILES['file']['tmp_name'], $file)){ echo $file, 'のアップロードに成功しました。'; echo '<p><img src="',$file, '"></p>'; }else{ echo 'アップロードに失敗しました。'; } }else{ echo 'ファイルを選択してください。'; } ?> <?php require '../footer.php'; ?>
phoepsilonix

2021/04/05 15:18

所有者と実行権限の問題みたいですね。 ミスリードしていたら、すいません。 確認するとしたら2ポイントあります。 1つ目はphpの実行ユーザー。webサーバーの設定でどのユーザー権限で動作するのか確認できるでしょうか? 2つ目がuploadフォルダを作る親フォルダの権限と所有者の確認です。 phpの実行権限と動作するユーザー名、親フォルダの権限、所有者の組み合わせが適切なら、permission deniedのエラーがなくなると思います。 phpやwebサーバーに、ディレクトリの作成やファイルの作成=アップロード、といった権限を与えることは、設計時点で少し配慮が必要です。 uploadフォルダをすべてのユーザーからアクセス可能にすると、サーバーを共有する他のユーザーからもファイルやフォルダの作成が可能になってしまうので、動作環境によっては、それが問題になる場合もあるかもしれません。スクリプトのミスで既存のファイルの削除も起こりえます。 フォルダをシェルから手動で作成すれば、スクリプト上からディレクトリを作成する必要がなくなります。そのフォルダの中だけをphpから書き込みできるように所有者や実行権限を設定すれば、ファイルのアップロードもそのフォルダ内に可能になり、少しは安全になるかもしれません。 一時的にuploadするパス、永続的に保管するパスの設定などをどこにするか、検討してみてください。 ls -ld ./ ls -l ./ などでフォルダやphpファイルの所有者や許可されている権限も確認してみてください。 フォルダの作成は、phpなどcgi用のユーザー権限で、書き込み、実行の2つの権限が必要になるかと思います。
guest

0

ディレクトリを作ろうとしているディレクトリの権限を変えましょう

投稿2021/02/18 12:42

y_waiwai

総合スコア88042

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

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

sk8976

2021/04/05 13:04

y_waiwaiさん。ご回答いただき、ありがとうございました。 ディレクトリの権限を変更しようと試みたのですが、zshで以下の情報のどこを変更すれば良いのか教えて下さい。 -rw-r--r-- 1 risa staff 15 4 3 20:27 footer.php -rw-r--r-- 1 risa staff 148 4 3 20:26 header.php drwxr-xr-x 8 risa staff 256 4 3 21:39 php
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問