🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

2回答

11910閲覧

php move_uploaded_fileエラーとなる(failed to open stream-Unable to move-Operation not permitted)

Ms.yy

総合スコア83

PHP

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

0グッド

0クリップ

投稿2019/11/01 12:16

編集2019/11/07 21:19

前提・実現したいこと

 画像アップロードシステムを組み込みたい

###問題点
教本やwebサイトの手順通りform画面と受け取る画面を作ったがエラーとなり画像をアップロードすることができない。

よろしくお願いします。

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

Warning: move_uploaded_file(http://localhost/calendar_php/folio/imageout.php/calendar_php/folio/image20191101210345スクリーンショット 2019-10-31 21.21.13.png): failed to open stream: HTTP wrapper does not support writeable connections in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 54 Warning: move_uploaded_file(): Unable to move '/Applications/XAMPP/xamppfiles/temp/php4B2fBp' to 'http://localhost/calendar_php/folio/imageout.php/calendar_php/folio/image20191101210345スクリーンショット 2019-10-31 21.21.13.png' in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 54 Warning: chmod(): Operation not permitted in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 56

imageout.php

<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="image" > <input type="submit" value="確認" > </form> <?php $image=date('YmdHis').$_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], 'http://localhost/calendar_php/folio/imageout.php/calendar_php/folio/image' .$image); chmod("image",0666); ?>

試したこと

相対パスも設定してみましたが、同じくエラーとなりました。

<?php $image=date('YmdHis').$_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'],'image'//相対パス(imageフォルダ) .$image); chmod("image",0666); ?>

###相対パスのエラー

Warning: move_uploaded_file(image20191101232932スクリーンショット 2019-10-31 21.46.25.png): failed to open stream: Permission denied in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 66 Warning: move_uploaded_file(): Unable to move '/Applications/XAMPP/xamppfiles/temp/phpl1b1sO' to 'image20191101232932スクリーンショット 2019-10-31 21.46.25.png' in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 66 Warning: chmod(): Operation not permitted in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 68

###chmod()→move_uploaded_file()でのエラー

Warning: chmod(): Operation not permitted in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 51 Warning: move_uploaded_file(image/20191102122837スクリーンショット 2019-11-01 21.14.10.png): failed to open stream: Permission denied in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 55 Warning: move_uploaded_file(): Unable to move '/Applications/XAMPP/xamppfiles/temp/phpBecTWu' to 'image/20191102122837スクリーンショット 2019-11-01 21.14.10.png' in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 55

###ディレクトリ

/Applications/XAMPP/htdocs/calendar_php/folio/image

イメージ説明

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

###追記(画像表示可)
session_startを追記したら無事に表示されるようになりました。

<?php session_start(); chmod("image/",0666); $image=date('YmdHis').$_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], 'image/'.$image); $_SESSION['join']=$_POST; $_SESSION['join']['image']=$image; <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="image" > <input type="submit" value="確認" > </form> <?php if($_SESSION['join']['image'] !==''):?> <img src="image/<?php print($_SESSION['join']['image'])?>"> <?php endif;?> ?>

imageフォルダアクセス権
自分:読み/書き
admin:読み出しのみ
everyone:読み出しのみ

OS:mac

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

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

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

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

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

m.ts10806

2019/11/01 12:25 編集

「同じくエラー」であって「同じエラー」ではないですよね。 別パターンを試してエラーとなったのならそれはそれでエラー文をコピペして提示願います。 あと、提示の画像では階層がわかりづらいです。 MACは詳しくないですが、pwdコマンドか何かを利用してimageout.phpのディレクトリパスを提示されたほうが良いのではと。 (まあhttp://~だとNGなこととか、明らかにパスの指定の仕方が違うことはひと目でわかるのですが)
Ms.yy

2019/11/01 23:49

すみません、昨日回答が送れていませんでした。 ディレクトリと相対パスのエラー追記させて頂きました。
guest

回答2

0

ベストアンサー

move_uploaded_file関数の第2引数は、URLではなくファイル名を指定する必要があります。なので、元々のスクリプトは動きません。相対パス版の方は動く可能性があると思いますが、パス名の指定方法が間違っています。

move_uploaded_file($_FILES['image']['tmp_name'],'image'//相対パス(imageフォルダ) .$image);

imageフォルダに保存するには、image/ とする必要があります。

move_uploaded_file($_FILES['image']['tmp_name'],'image/'//相対パス(imageフォルダ) .$image);

その上で、以下のディレクトリに、Apacheから書き込み権限があることを確認してください。

/Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/image/

投稿2019/11/01 13:33

ockeghem

総合スコア11705

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

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

Ms.yy

2019/11/01 14:37 編集

Apacheから書き込み権限調べてさせて頂きます!
Ms.yy

2019/11/01 14:40

相対パスの場合 第二引数は'image'ではなく’image/’でしたか^^; 'image'だけで何か違和感あったのでありがとうございます
m.ts10806

2019/11/02 01:35 編集

Ms.yyさん 「相対パスの場合」というと違う気します。 あくまで質問者さんのコードは「実行しているphpと同じディレクトリにimage{YmdHis}{ファイル名}というファイル名で保存する」という指示であり「imageディレクトリに{YmdHis}{ファイル名}というファイル名で保存する」にはなっていないだけの話です。(エラーメッセージに出てる通り) パスの冒頭が / となってないので、もともと相対パスですよ。 ただ、$_FILESのnameをそのまま使うのは悪手なので(セキュリティ上) 別途付与したほうが良いかと。
ockeghem

2019/11/02 00:40

「相対パス」という言葉を使ったのは、質問中の「相対パスも設定してみましたが」を指し示し、そちらのコードについては、という意味であり、相対パスだから良いとか悪いということは言っておりません。
m.ts10806

2019/11/02 01:37

ockeghemさん 宛先抜けてしまってたのでもしかしたら誤解させてしまったかもしれません。(編集追加しました) 私のコメントは質問者さんに向けてのものでした。
Ms.yy

2019/11/02 02:25

「Apacheから書き込み権限」はimageout.php内にchmod("image/",0666); と記載してありますが、ターミナルからの設定をしないとだめなのでしょうか ?
m.ts10806

2019/11/02 02:57

Ms.yyさん ついでにコメントしてしまいますが、処理順を見てください。 鍵つきの部屋に施錠したままものを置こうとしています。 解錠してからものを置きましょう。
Ms.yy

2019/11/02 03:19

解錠ですか^^; つまりターミナルからするってことですかね^^;
m.ts10806

2019/11/02 03:24 編集

Ms.yyさん 「処理順を見てください」と申しました。ご自身のコードの処理順です。 move_uploaded_file() ↓ chmod() の順番では対象のディレクトリに権限設定する(解錠)前にファイルを移動(ものを置く)しよくとしています。 権限設定(解錠)が先です。 PHPマニュアルとエラー読んでください。move_uploaded_file()が何をする機能なのか。chmod()がなにをする機能なのか。 エラーはなんと書いてあるのか。
Ms.yy

2019/11/02 03:34

そういうことでしたか! 理解できました。
Ms.yy

2019/11/02 03:37

順後逆にしてみましたが、やはりエラーでした。
Ms.yy

2019/11/02 04:20

imageフォルダアクセス権 自分:読み/書き admin:読み/書き everyone:読み/書きにしたらエラーが変わりました。 Warning: chmod(): Operation not permitted in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 51 Warning: chmod(): Operation not permitted in /Applications/XAMPP/xamppfiles/ht
m.ts10806

2019/11/02 04:27

(あまり人の回答にぶら下がり続けるのも難なのでこの辺りで引きます。) 質問のコードがそのままなので、なんとも言えません。こちらの想定通りなのかどうか判断ができないわけですね。 エラーを読んでください。問題が起きているのは質問者さんの環境ですし、状況から一般的なヒントしか出せないわけです。もし何かしら外れていること(特殊な設定をしているなど)があれば通じないわけですし、ヒントをもとに自分でやる訳しかないのです。 エラーは何が悪いとかできてないとか原因を教えてくれるものです。質問者さんがどこまで理解できているかにもよりますが、私としてはいま出ているヒントで十分解決可能と考えています。
ockeghem

2019/11/02 04:47

chmod() するには、そのディレクトリのオーナーである必要があります。XAMPPの場合は知らないのですが、通常はApacheの実行ユーザーとドキュメントルートのオーナーは別のユーザーです。 それと、そもそもchmodは一回だけすればよいものなので、ウェブアプリケーションから実行するのではなく、設定の際に実施するべきものです。
Ms.yy

2019/11/02 06:16

難しいですね。。。(^^;)
Ms.yy

2019/11/07 21:17

session_start();を設定したら画像が表示されるようになりました! ありがとうございます
guest

0

以下のようにするとどうですか?
$_SERVER['DOCUMENT_ROOT']/ を追加)

PHP

1move_uploaded_file($_FILES['image']['tmp_name'],$_SERVER['DOCUMENT_ROOT'].'/image/' 2.$image);

投稿2019/11/01 13:34

mksk

総合スコア247

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

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

Ms.yy

2019/11/01 14:36

実行行ってみましたが、今回の質問にエラー行が増えてしまいました。 Warning: move_uploaded_file(/Applications/XAMPP/xamppfiles/htdocs/image/20191101233421スクリーンショット 2019-10-31 21.21.13.png): failed to open stream: No such file or directory in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 68 Warning: move_uploaded_file(): Unable to move '/Applications/XAMPP/xamppfiles/temp/phpUuo6cG' to '/Applications/XAMPP/xamppfiles/htdocs/image/20191101233421スクリーンショット 2019-10-31 21.21.13.png' in /Applications/XAMPP/xamppfiles/htdocs/calendar_php/folio/imageout.php on line 68 Warning: chmod(): Operation not permitted in /Applications/XAMPP/xa
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問