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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

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

Q&A

解決済

5回答

3264閲覧

パーミッション、パスは問題ないのにmove_uploaded_fileが動かない。

alberorana

総合スコア52

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

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

0グッド

2クリップ

投稿2017/06/28 07:55

編集2017/06/28 08:21

みなさまお世話になっております。
###前提・実現したいこと
JPG、pdfなどのファイルをmove_uploaded_fileでアップロードするプログラムを作っているのですが、本番環境でのみ動きません。

最終的には/var/tmpディレクトリから/home/user/tmpに移動したい。
###発生している問題・エラーメッセージ

[Wed Jun 28 16:37:27 2017] [error] [client ***.***.***.***] PHP Warning: move_uploaded_file(): Unable to move '/var/tmp/phpBI6233' to '/home/tmp/kaeru/frog-32568_1280.png' in /var/www/html/drop_zone_upload.php on line 23, referer: http://***.***.***.***/ddupload.php

###該当のソースコード

<?php if (!empty($_FILES)) {//アップロードファイルがある時の処理 $tempFile = $_FILES['file']['tmp_name']; if(!file_exists($uploaddir)){//アップロードディレクトリの存在確認 mkdir($uploaddir, 0700); } $tmpdir = '/home/tmp/' . $udata['uid']; $_SESSION['tempdir'] = $tmpdir; $targetFile = $tmpdir . '/' . $_FILES['file']['name']; $_SESSION['targetfile'] = $targetFile; //ここでエラーになる move_uploaded_file($tempFile,$targetFile); } ?>

###試したこと
・ディレクトリのパーミッションを0777にする
・ACLにapacheを追加する

###補足情報(言語/FW/ツール等のバージョンなど)
・php 7.0.19
・CentOS6.8
ローカル開発環境、本番環境ともに同じバージョンです。
ローカル開発環境はVMに構築しています。

なぜ本番環境でのみエラーが発生するかわからず、困っているのでよろしくお願いいたします。

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

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

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

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

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

m.ts10806

2017/06/28 08:05 編集

is_uploaded_file()を実行した場合にtrueが返っていますか?
m.ts10806

2017/06/28 08:10 編集

エラーメッセージが途中のところを提示されているようですが、全文提示は可能ですか?※サーバIPなどがある場合は***などマスクかけてもらって構いません。
m.ts10806

2017/06/28 08:14

何度も確認すみません。$uploaddirの存在確認&mkdir()しているにも関わらず使っていないのはなぜでしょう?/home/user/tmpにアップしたいとのことですが、$tmpdirでは'/home/tmp/'としているところが気になります。
alberorana

2017/06/28 08:24

さっそくのご回答ありがとうございます。$uploaddirは修正前のコードが残ってしまっていました。そのため、この質問では関係がないので大丈夫です。一時ディレクトリにつきましてはドラッグアンドドロップアップロードのライブラリを使っているため、一度私が定義した一時ディレクトリにアップロードするようにしています。(一時ディレクトリでウイルス検査するため)
alberorana

2017/06/28 08:32

is_uploaded_file()はfalseが返ってきました。
kunai

2017/06/28 08:49

修正前のコードが残ったのではなく、実際に今動かしているソースコードを提示いただけませんか?
alberorana

2017/06/28 08:50

書き方が悪く申し訳ございません。残ったという意味は変数とmkdirのコードが残っただけですので、質問に記載したコードで動いております。よろしくお願いします。
guest

回答5

0

こんな感じにしておけば、何が起こっているかわかりやすいかもしれません。
ファイル名はsha1とか年月日時分秒で変えています。
パーミッションは./imgが707で一応動いています。

php

1 2if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) { 3 4 try { 5 6 switch ($_FILES['upfile']['error']) { 7 case UPLOAD_ERR_OK: 8 break; 9 case UPLOAD_ERR_NO_FILE: 10 throw new RuntimeException('ファイルが選択されていません'); 11 case UPLOAD_ERR_INI_SIZE: 12 case UPLOAD_ERR_FORM_SIZE: 13 throw new RuntimeException('ファイルサイズが大きすぎます'); 14 default: 15 throw new RuntimeException('その他のエラーが発生しました'); 16 } 17 18 $type = @exif_imagetype($_FILES['upfile']['tmp_name']); 19 if (!in_array($type, [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG], true)) { 20 throw new RuntimeException('画像形式が未対応です'); 21 } 22 23 $path = sprintf('./img/%s%s%s', sha1_file($_FILES['upfile']['tmp_name']), date("Ymd-His"), image_type_to_extension($type)); 24 if (!move_uploaded_file($_FILES['upfile']['tmp_name'], $path)) { 25 throw new RuntimeException('ファイル保存時にエラーが発生しました'); 26 } 27 chmod($path, 0644); 28 29 $msg = ['green', 'ファイルは正常にアップロードされました']; 30 31 } catch (RuntimeException $e) { 32 33 $msg = ['red', $e->getMessage()]; 34 35 } 36 37} 38

投稿2017/06/28 08:21

s.t.

総合スコア2021

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

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

0

原因は/home/tmpのパーミッションが0700(root所有)だったためでした。
そのため、コマンドからACL設定でapacheに権限を持たせて解決しました。

投稿2017/06/28 09:21

alberorana

総合スコア52

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

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

0

ベストアンサー

セーフモードがONだったりするのではないでしょうか。
http://php.net/manual/ja/function.move-uploaded-file.php#refsect1-function.move-uploaded-file-notes
で、さらにファイルを移動しようとしている先のディレクトリの作成者がPHP実行ユーザーではないとか。
回避するためには、既存のディレクトリを一旦削除し、PHPにて

PHP

1if(!file_exists($tmpdir)){ 2 mkdir($tmpdir, 0777); 3}

とかして、PHPにディレクトリを作らせてみてください。

投稿2017/06/28 09:06

kunai

総合スコア5405

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

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

0

もしかしたらこうでは?

PHP

1$tmpdir = '/home/tmp/' . $udata['uid']; 2 34 5$tmpdir = '/home/' . $udata['uid'].'/tmp';

またはこう

PHP

1 2$targetFile = $tmpdir . '/' . $_FILES['file']['name']; 3 45 6$targetFile = $uploaddir . '/' . $_FILES['file']['name'];

投稿2017/06/28 08:17

m.ts10806

総合スコア80765

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

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

alberorana

2017/06/28 08:49

ご回答ありがとうございます。ややこしいディレクトリ構造にしてしまいましたが、パスは問題ありませんでした。 ローカル開発環境で動いている事を考えるとサーバー側の設定ではないかと考えております。
guest

0

エラーメッセージの

/var/tmp/phpBI6233

$tmpdir = '/home/tmp/' . $udata['uid'];

を比べると、なんとなく /var/tmp/hogehoge/phpBI6233 が
正しいパスなんじゃないかなあ、という気がします。
--- 追記 ---
失礼。的外れな回答でした。

で、気になるのは $uploaddir は使ってませんが
なんなんでしょうね?

投稿2017/06/28 08:16

編集2017/06/28 08:24
takasima20

総合スコア7458

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

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

alberorana

2017/06/28 08:48

ご回答ありがとうございます。もう一度確認してみましたが、パスは正解でした。 ローカル開発環境で動いている事を考えるとサーバー側の設定ではないかと考えております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問