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

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

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

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

Q&A

解決済

1回答

2729閲覧

XAMPP環境 PHPのファイルアップロードのやり方について

oek

総合スコア8

PHP

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

0グッド

0クリップ

投稿2018/02/16 01:38

前提・実現したいこと

xampp環境でphpを学習しています。
ファイル(png)をサーバーにアップロードしたいのですが、うまくいかず原因もつかめず困っています。
分かるかたいらっしゃいましたらお教えください…。

考えられる原因と対策

1.コードのタイプミス
自分で書いたコードを一度消して、ウェブからコードをコピペしてきましたがうまくいきませんでした。

2.フォルダのアクセス拒否?(パーミッションの設定)
ファイルをアップロードしたいフォルダを右クリック>プロパティ>セキュリティタブの編集>全ユーザーの「フルコントロール」にチェックを入れましたがうまくいきませんでした。
ディレクトリ構成は以下のようになっています。

イメージ説明

ソースコード

kanri_index_imgtest.php(kanriフォルダ内)

php

1<!doctype html> 2<html lang="ja"> 3<head> 4<meta charset="utf-8"> 5<title>アップロード</title> 6</head> 7 8<body> 9 10<!--formのenctypeに"multipart/form-data"を設定する--> 11<form action="sent_imgtest.php" method="post" enctype="multipart/form-data"> 12 13<!--input typeは"file"を設定する--> 14<input type="file" name="upload"> 15 16<input type="submit" value="アップロード"> 17</form> 18 19</body> 20</html>

sent_imgtest.php(kanriフォルダ内)

php

1<?php 2 3// ファイルの保存先 4$uploadfile = '../img/'; 5 6// アップロードされたファイルに、パスとファイル名を設定して保存 7move_uploaded_file($_FILES['upload']['tmp_name'], $uploadfile); 8 9// 完了メッセージを表示 10echo 'アップロード完了!';

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

◆サーバー情報
試しにアップロード先のパスを
$uploadfile = './img/';
としたところ、kanriフォルダ内にimgという拡張子のない謎のファイルがアップロードされ、
混乱しています…。

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

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

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

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

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

guest

回答1

0

ベストアンサー

惜しいところまでいってますね。
ひとまず、move_uploaded_file()の第2引数はファイル名も含める必要がありますので、
任意の名前をつけると良いです。

例:

php

1// ファイルの保存先 2$uploadfile = '../img/hogehoge.png'; 3 4// アップロードされたファイルに、パスとファイル名を設定して保存 5move_uploaded_file($_FILES['upload']['tmp_name'], $uploadfile);

ただkanri/sent_imgtest.php となっているのであれば変な感じはしますね・・・。

例えば、階層を明確に参照できるようにするため、下記のようにしてはどうでしょうか?

php

1// ファイルの保存先 2$uploadfile = __DIR__.'/../img/hogehoge.png';

DIRは記述のあるファイルの存在するディレクトリとなります。
これで確実に、kanri/フォルダからの相対パスで指定ができるはず。

※hogehoge.png部分は自身でつけてあげてださい。

試しにアップロード先のパスを

$uploadfile = './img/';
としたところ、kanriフォルダ内にimgという拡張子のない謎のファイルがアップロードされ、

"./" だと「自身と同じ階層から」という指定になるので当該の現象になったわけですね。
第2引数にファイル名が含まれていないのでフォルダのようなファイルが出来上がったわけです。
(ただしtmpファイルから作ってるので中身自体は指定した画像のはず)

投稿2018/02/16 01:45

編集2018/02/16 02:27
m.ts10806

総合スコア80850

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

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

oek

2018/02/16 02:13

お早いご回答ありがとうございます! ご提示いただいたコード $uploadfile = __DIR__.'/../img/hogehoge.png'; を参考に記述しなおしたところ、無事に画像のアップロードが出来ました…! また、詳細な解説もいただきありがとうございます。 パスに拡張子も含めなければいけないこと、知りませんでした…。 $uploadfile = './img/'; で拡張子のないファイルがアップロードされたのも納得です。 __DIR__について、初めてみるものだったので調べてきました。 マジカル定数というもので、ファイルの存在する場所をフルパスで返してくれるんですね、すごく便利! しかし、 「ただkanri/sent_imgtest.php となっているのであれば変な感じはしますね・・・。」 と言われる意味がよくわかっておりません…; 不安定な記述の仕方ということでしょうか? また、 $uploadfile = __DIR__.'/../img/hogehoge.png'; にて、'フルパス'と'省略したパス'を結合しておられるかと思いますが、 このように複数の表現でパスを指定するのは、プログラミングでは当たり前なのでしょうか…?
m.ts10806

2018/02/16 02:43 編集

すみません。 >「ただkanri/sent_imgtest.php となっているのであれば変な感じはしますね・・・。」 この部分、回答の後半によって意味がなくなってました。 謎のファイルができたことについて頭がいってしまっていたので・・・ちょっと取り消し線入れておきますね。 >このように複数の表現でパスを指定するのは、プログラミングでは当たり前なのでしょうか…? 「記述があるファイルからの相対パス」を指定したい際にはおおよそ出てくる表現ではないかと思います。 例えば、フレームワークのようにWebから参照できない領域にPHPファイルを配置して読み込んだりクラスを利用したりする場合には、 参照したファイルからまた別のファイルを参照して・・・のような形となり、inculdeしようとしたときにうまく参照されないことがあるので、自身のフォルダを指定できる__DIR__などは重宝されるものだと思います。
oek

2018/02/16 09:38

追記のご返答ありがとうございます! 取り消し線の追加もありがとうございます。 なるほど、webから参照できない領域…WordPressのようなCMSを利用している場合などをイメージしました。 実務に関わりそうなところまで解説してくださりありがとうございます。 とても助かりました! 今度は、アップロードした画像のファイル名を乱数に変換し、データベースに格納することにチャレンジしてみます! ありがとうございました。
m.ts10806

2018/02/17 07:08

>webから参照できない領域…WordPressのようなCMSを利用している場合などをイメージしました。 そうですね。PHPのコアとなる処理の部分は外部から参照できてはいけない部分です。コードが実行されるわけではないですが、直接開かれてはマズいケースも色々とあります(作りによるのでここでは省きます) プログラム側でファイル名を決定する場合も工夫が必要なので色々と苦労するところもあるかと思いますが、頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問