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

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

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

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

Q&A

解決済

2回答

2304閲覧

フォームで送られてきた画像を保存する際、同じ名前だったら上書きをする

ryohasegawa

総合スコア437

PHP

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

0グッド

0クリップ

投稿2017/06/05 14:02

フォームからファイルを送信して、もし既に存在するファイル名だったら上書きをしたいんですが、どうすればいいですか?

php

1$path = sprintf($_SERVER['DOCUMENT_ROOT'] . './users/'.$_POST['keyid'].".png"); 2if (!move_uploaded_file($_FILES['upfile']['tmp_name'], $path)) { 3 throw new RuntimeException('ファイル保存時にエラーが発生しました'); 4} 5chmod($path, 0644);

処理の一部なんですが、if (!move_uploaded_file($_FILES['upfile']['tmp_name'], $path)) {でエラーが出てるみたいです。
でも、ここを存在しない名前だといけるんで、ファイルが合った場合は上書きをしたいんです。どうすればいいですか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/06/05 14:17

同じ画像じゃなくても名前が一緒だったら上書きしちゃうの?
ryohasegawa

2017/06/05 14:46

はい。上書きします。
退会済みユーザー

退会済みユーザー

2017/06/05 15:26

と言うことは、画像ファイルをエクセルで上書きすることもできちゃいますね。
ryohasegawa

2017/06/06 08:50

どういう意味でしょうか?
m.ts10806

2017/06/06 13:24

test.pngという名前の画像がすでにあったとしてエクセルファイルをtest.pngと名前を変更してアップロードされたとしても上書きしていいの?ってことです。名前は画像っぽいけど実態はエクセル(要は画像じゃないってこと)
ryohasegawa

2017/06/06 13:26

なるほど、要するに、ファイルの内容が画像データじゃなかったら、エラーを出して、処理を止める必要があるということですか?
m.ts10806

2017/06/06 13:28

画像を表示したいけど実態は画像じゃないから表示できませんし、幾らでも悪さができますよね。その辺りの概念とかチェックの仕方は別途調べてください。幾らでも出てきます。
ryohasegawa

2017/06/06 13:30

なるほど、ありがとうございます。ちょっとエンドユーザを信用しすぎてました。拡張子だけで判断するのはよくないということですね。
m.ts10806

2017/06/06 13:34

ユーザからの入力は信用しない が基本です。もちろん社内システムのような限定された環境であっても。
ryohasegawa

2017/06/06 13:39

勉強になります。
guest

回答2

0

ベストアンサー

$_SERVER['DOCUMENT_ROOT']は文字の末尾にスラッシュがつかないので

$_SERVER['DOCUMENT_ROOT'] . './users/'

とすると、最後のディレクトリ名のケツに「.」がついて(おそらく)
存在しないディレクトリに書き込もうとしませんか?

またユーザーから送られてきた「$_POST['keyid']」でファイル名を決めると
いうのはセキュリティ的にあまりよろしくないと思います
サーバー上に書き込まれるデータの名称はなるべくサーバー側から与えてやるべきでは?

投稿2017/06/05 14:08

yambejp

総合スコア114883

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

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

ryohasegawa

2017/06/05 14:13

サーバに書き込むファイル名は、サーバから与えた方が良いですね!
guest

0

move_uploaded_file()はもし既にファイルがあれば上書きするはずですので、パーミッションの問題なのかなぁと思います。

php

1 2$path = sprintf($_SERVER['DOCUMENT_ROOT'] . './users/'.$_POST['keyid'].".png"); 3 4//既存ファイルのパーミッションを書き込み可にする 5if(file_exists($path)){ 6chmod($path, 0664); 7} 8 9//それかファイルがあれば削除する。もしかしたらこっちの方が明快? 10/* 11if(file_exists($path)){ 12 unlink($path); 13} 14*/ 15 16if (!move_uploaded_file($_FILES['upfile']['tmp_name'], $path)) { 17 throw new RuntimeException('ファイル保存時にエラーが発生しました'); 18} 19chmod($path, 0644); 20

投稿2017/06/05 14:22

oskbt

総合スコア1895

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

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

ryohasegawa

2017/06/06 08:57

ありがとうございます。 解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問