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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

Q&A

解決済

2回答

5457閲覧

PHPでのファイルアップロード時の処理について

newyee

総合スコア213

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

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

0グッド

0クリップ

投稿2017/08/02 10:26

ファイルアップロード時の処理について調べていたのですが、分からない点があるので教えて欲しいです。
主にファイルの確認と移動についてなのですが、調べていました所、以下のように書かれた内容のサイトをみつけたのですが、理解できない部分があります...

html

1<form action="up.php" method="post" enctype="multipart/form-data"> 2 <input type="file" name="fname"> 3 <input type="submit" value="アップロード"> 4</form>

アップロード処理はphpスクリプトが呼び出された時点で終わっており、既にファイルとしてサーバ上に存在します。そのファイル名が一時ファイル名(tmp_name)です。これは適当な名前が付けられています。本来のファイル名は name キーでわかります。

アップロードされたファイルは一時的な場所にあるファイルなので、これを本来格納したい場所にファイルを移動する処理を行います。

php

1<?php 2$tempfile = $_FILES['fname']['tmp_name']; 3$filename = './' . $_FILES['fname']['name']; 4 5if (is_uploaded_file($tempfile)) { 6 if ( move_uploaded_file($tempfile , $filename )) { 7 echo $filename . "をアップロードしました。"; 8 } else { 9 echo "ファイルをアップロードできません。"; 10 } 11} else { 12 echo "ファイルが選択されていません。"; 13} 14?>

まずアップロードされたファイルが本当にアップロード処理されたかの確認を is_upload_file 関数で行います。これはセキュリティ対策です。

次に move_uploaded_file でファイルを移動します。この例では移動先はこのphpスクリプトと同じディレクトリに本来のファイル名で配置しています。しかし実際にはファイル用のディレクトリを作成して置いた方が良いでしょう。

ーーーーここまでが、そのサイトの内容となります。ーーーー
上記の内容なのですが、move_uploaded_file関数につきましては、第二引数に指定するのは、ファイルの移動先かと思います。
ですが、上記のコードでは、$filename = './' . $_FILES['fname']['name'] としています。
これだと、上記サイトの説明からしましても、ファイルの本来の名前を指定しているだけで、ファイルの移動先とは関係がないように思えます。
説明が大雑把で分かりにくい部分があるかもしれませんが、どなたか教えて下さる方いましたらご教授願えればと思います...

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

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

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

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

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

guest

回答2

0

ベストアンサー

ファイルの本来の名前を指定しているだけで、ファイルの移動先とは関係がないように思えます。

単に「ファイルの移動先」を「ファイルの本来の名前を使ったパス」にしているだけです。

もっとも、この「本来のファイル名」も、あくまでユーザーから送られてきたものですので、不適切な名前である危険性もあります。連番やランダムな値、ファイル内容のハッシュ値など、自前で生成する名前を使うほうが適当だと考えます。

投稿2017/08/02 10:43

maisumakun

総合スコア145183

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

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

newyee

2017/08/02 10:53

ご回答ありがとうございます。 「ファイルの本来の名前を使ったパス」とのことなんですが、ここでいう「パス」とは具体的にどの場所を指しているのでしょうか?
maisumakun

2017/08/02 11:03

「'./' . $_FILES['fname']['name']」なので、「カレントディレクトリ(特に変更していなければスクリプトと同じディレクトリ)の、『本来のファイル名』」というパスです。
newyee

2017/08/02 11:39

返信ありがとうございます。 勉強不足で申し訳ないです。 現在cloud9でphpを作成しているのですが、僕が理解している部分を整理させて頂ければと思います。 仮にcloud9のlesson21というフォルダのtool.phpというファイルで質問させ頂いたフォームを作成したとします。too.phpのフォームから送信(POST)があった場合、まず$_FILES['fname']['tmp_name']に一時的に保存されると思います。これを本来格納したい場所にファイルを移動する処理が必要かと思います。 ここでなのですが、本来格納したい場所とは、例えば、cloud9の中に送られてきたファイル用のフォルダを作成しそのフォルダをmove_uploaded_file関数の第2引数で指定するということではないのでしょうか?
maisumakun

2017/08/02 11:52

元のコードの作者は「本来置きたい場所=カレントディレクトリ」と考えたわけなので、別な場所に置きたいなら相応のコードを書く必要があります。
newyee

2017/08/02 12:18

僕の中の認識としましては、フォルダの中にファイルを格納するものだと思っていたのですが、 $_FILES['fname']['name']の中にもファイルを格納することは可能ということなのでしょうか?
maisumakun

2017/08/02 12:33

move_uploaded_fileで指定するのは「置き先のフルパス」、つまり「ディレクトリ名+ファイル名」です。
newyee

2017/08/02 23:46

置き先フルパスということなんですが、move_uploaded_file関数を使用するための目的としましては、一時的なテンポラリーファイルに格納したものを然るべき場所に移動させるためのものではないのでしょうか? $_FILES['fname']['name']は変数であってファイル名ではないので格納するのは難しいように思えます。。。
maisumakun

2017/08/03 01:22

「変数」に直接ファイルを入れるわけではもちろんないです。「変数から生成した文字列」の場所にファイルを置く、というだけです。
newyee

2017/08/03 01:55

「文字列」ということなのですが、$_FILES['fname']['name']に格納できるということは、仮に$array['file']['name']という配列があったとした場合、「'./' . $array['file']['name']」とすることでこの配列に格納することは可能、ということでしょうか?
maisumakun

2017/08/03 02:05 編集

何度も説明していますが、「$_FILES['fname']['name']に格納でき」るわけではありません。あくまでこれはファイルを置く場所を指定するだけのものです。
newyee

2017/08/03 02:24

なるほど.... 勉強不足故に理解ができず申し訳ないです... 「置く」ということがいまいちピンとこないのですが、例えばどこかのフォルダにファイルを格納したりすることとは、違うのでしょうか?
maisumakun

2017/08/03 02:31

いえ、そのとおりです>ファイルを置く
newyee

2017/08/03 02:40

としますと、move_uploaded_file関数の第2引数には、前述しました「'./' . $array['file']['name']」を指定することも可能ということでしょうか? $_FILES['fname']の中の['name']としなくても良いのでしょうか?
maisumakun

2017/08/03 02:46

そうですね、勝手な変数でもなんでも構いません。
newyee

2017/08/03 03:10

なるほど。そうだったんですね。としますと、仮に40mbのファイルがアップロードされた場合、$_FILES['fname']['name']には40mbのファイルがコピーされて格納される訳ではなく、 $_FILES['fname']['tmp_name']に一時的にファイルの情報が「置かれ」然るべき場所に、move_uploaded_file関数で移動させるという意味でよろしいのでしょうか?
newyee

2017/08/03 03:12

すみません。2行目は間違えです。 飛ばしていただけたらと思います。 なるほど。そうだったんですね。としますと、仮に40mbのファイルがアップロードされた場合、 $_FILES['fname']['tmp_name']に一時的にファイルの情報が「置かれ」然るべき場所に、move_uploaded_file関数で移動させるという意味でよろしいのでしょうか?
guest

0

見当違いだったらすみません。。
まずパスとファイル名を別にして記述するとイメージしやすいのかと思います。

<?php $tempfile = $_FILES['fname']['tmp_name']; $path = './'; // 保存先のパス $filename = $path.$_FILES['fname']['name']; // アップロードされたファイル名 if (is_uploaded_file($tempfile)) { if ( move_uploaded_file($tempfile , $filename )) { echo $filename . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?>

アップロードされたファイル名がtest.jpgだとすると$filenameには【./test.jpg】となるので、
maisumakunさんがおっっしゃる通り「ディレクトリ名+ファイル名」という形になります。

パス → ./
ファイル名 → test.jpg

投稿2017/08/03 01:21

mayoi_maimai

総合スコア1583

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

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

newyee

2017/08/03 03:31

ご回答ありがとうございます。 いえいえ、分かりやすく書いて下さりありがとうございます。 アップロードに関しましては、なかなか理解することができず四苦八苦しています... 回答下さった内容に関しまして、他の方のご回答のおかげもありまして少しずつ理解できている状況です。。。
mayoi_maimai

2017/08/03 03:49

アップロードするとファイルの情報が$_FILES内に二次元配列で入ります。 $_FILES['fname']['name'] ファイルの名前。 $_FILES['fname']['type'] ファイルのMIME型。 $_FILES['fname']['size'] ファイルのサイズ(バイト単位)。 $_FILES['fname']['tmp_name'] テンポラリファイル名。 $_FILES['fname']['error'] ファイルアップロードに関するエラーコード。 仮にファイル名「test.jpg」40mbのファイルがアップロードされた場合、$_FILES['fname']['name']に「test.jpg」が入り、$_FILES['fname']['tmp_name']に一時保存されます。 それをmove_uploaded_file関数で移動させるという流れになるので、以下のような感じでもokなはずです。 【元の記述】 if ( move_uploaded_file($tempfile , $filename )) { ↓ 【変更後】 if ( move_uploaded_file($_FILES['fname']['tmp_name'] , $filename )) {
newyee

2017/08/03 05:09

ご丁寧にありがとうございます。 回答下さったことを参考にさせて頂きながら、自分なりにもすすめて、調べていきたい思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問