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

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

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

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

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

Q&A

解決済

2回答

1746閲覧

php move_uploaded_fileのエラー

wqq

総合スコア8

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

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

0グッド

0クリップ

投稿2020/10/10 09:44

編集2020/10/14 00:46

実現したいこと

画像のアップロード処理をphpで行いたい。

###ソースコード

<?php try{ if(is_uploaded_file($_FILES['upfile']['tmp_name'])){ move_uploaded_file($_FILES['upfile']['tmp_name'], '/usr/share/nginx/html/imgtest/'.$_FILES['upfile']['name']); } }catch(Exception $e) { echo 'エラー:', $e->getMessage().PHP_EOL; } ?> <!DOCTYPE html> <html> <head> <title>画像アップロード</title> </head> <body> <form enctype="multipart/form-data" method="post" action="up.php"> <input type="file" name="upfile" /><br /> <input type="submit" value="送信" /> </form> </body> </html>

エラーメッセージ

[error] : FastCGI sent in stderr: "PHP message: PHP Warning: move_uploaded_file(./imgtest/image.png): failed to open stream: Permission denied in /usr/share/nginx/html/up.php on line 4 PHP message: PHP Warning: move_uploaded_file(): Unable to move '/tmp/phpl9WJuU' to './imgtest/image.png' in /usr/share/nginx/html/up.php on line 4"

###開発環境

CentOS : 8.2.2004
nginx : 1.14.1
PHP : 7.4.11 (cli) ( NTS )
PHP-FPM : 7.4.11 (fpm-fcgi)

試したこと

フォルダの権限の変更(/usr/share/nginx/html/imgtest)
*chmod 777 imgtest

過去に投稿されていた記事などを見返して色々やってみましたが、どうも解決できません。
ご教授いただけると幸いです。

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

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

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

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

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

m.ts10806

2020/10/13 22:18

ひとまず、OSとPHPのバージョン等 環境情報をご提示ください。
m.ts10806

2020/10/13 22:25

あと、$msg はどこで定義されますか?
wqq

2020/10/14 00:47

環境情報を追記しました。 $msgに関しては今回の問題には関係が無かったので、該当部分を削除いたしました。 ご指摘ありがとうございます。
m.ts10806

2020/10/14 01:17

念のため、$_FILES['upfile']['tmp_name']と'/usr/share/nginx/html/imgtest/'をfile_existsでチェックしてみてください。 そのうえで、アップロード先を変えてみるとどうなりますか?
wqq

2020/10/14 02:17

対応ありがとうございます。 file_existsでチェックした後に保存先ディレクトリ の指定方法を変えてみたところ、無事アップロードされました。ありがとうございました!
m.ts10806

2020/10/14 02:22

解決ということでしょうかね。おそらく権限かなというところですが、ひとまず、具体的にどのように解決したかを自身で回答として投稿し、自己解決としてください。
guest

回答2

0

自己解決

該当のPHPファイルを以下のように変更しました。

php

1<?php 2 $upDir = '/usr/share/nginx/html/uploaded-img_'; 3 if (isset($_FILES['upfile']['error'])) { 4 try { 5 $filePath = $upDir . $_FILES["upfile"]["name"]; 6 7 if(move_uploaded_file($_FILES["upfile"]["tmp_name"], $filePath)) { 8 echo 'ファイルは正常にアップロードされました'; 9 } else { 10 throw new RuntimeException('ファイル保存時にエラーが発生しました'); 11 } 12 } catch (RuntimeException $e) { 13 echo $e->getMessage(); 14 } 15 } 16 ?> 17

原因はmove_uploaded_fileに渡す引数の形式?かと思います。
ただ、エラーがPermission deniedなので何故この変更で解消されたのかは分かりません。
引き続き調べてみるとともに、今回の問題は解決したということにします。

回答を下さった皆様、ありがとうございました。

投稿2020/10/14 03:30

wqq

総合スコア8

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

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

0

セーフモードの可能性があるので、
phpにディレクトリを作らせてやる方法があるそうですね。
if(!file_exists($tmpdir)){
mkdir($tmpdir, 0777);
}

投稿2020/10/10 10:12

firegrape

総合スコア902

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

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

wqq

2020/10/10 10:40

回答ありがとうございます。 確認してみたところ、PHPはCGIモードで動いているとのことで、セーフモードである可能性は無さそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問