PHPでファイルをアップロードするときに完全なFilepathを取得する方法は?
質問
PHPにファイルをアップロードするときに、どのようにして完全なFilepathを入手するのかを本当に知りたいですか?
これが私の問題です...
PHPでCSVファイルをインポートしています。ファイルのアップロードは問題ではありませんが、FGETCSV()であるCSVファイルをインポートするために使用される機能には、FOPENが必要です。 Fopenは、Filepathが必要であるため、頭痛を与えるものです。ユーザーが別のディレクトリからファイルを取得した場合はどうなりますか。
これが私のコードです:
index.php
:
<form action="csv_to_database.php" method="POST" enctype="multipart/form-data">
<input type="file" name="csv_file" />
<input type="submit" name="upload" value="Upload" />
</form>
csv_import.php
:
<?php
if ($_FILES['csv_file']['error'] > 0) {
echo "Error: " . $_FILES['csv_file']['error'] . "<br />";
}else{
if (($handle = fopen($_FILES['csv_file']['name'], "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
for ($c=0; $c < count($data) ; $c++) {
echo $data[$c] . " ";
}
echo "<br />";
}
fclose($handle);
}
}
?>
ここでフォーペンは、変数によって渡されるファイル名のみを取得できます $_FILES['csv_file']['name']
. 。インターネットで$ _filesの完全なFilepathを取得するための機能を取得しようとしていましたが、見つけることができません。
私はWeb開発に非常に新しいので、plsは忍耐強くなります。 plsはできるだけ単純に答えます... plsは助けます...
解決
['name']
ユーザーコンピューターの元のファイル名を指します。それはあなたには役に立たない、特にそれは空かもしれないからです。 (または、偽の値を含めることができ、ディレクトリトラバーサルエクスプロイトを引き起こす可能性があります。したがって、それを避けてください。)
使用する必要があります ['tmp_name']
これは、サーバーと吸収のようなパスです /tmp/upload85728
それはに使用できます fopen()
また move_uploaded_file()
.
他のヒント
CSVファイルを正常にインポートし、MySQLデータベースに保存することができました。
コードは次のとおりです(実際、私の質問とほぼ同じで、いくつかのわずかな変更があり、大きな効果があります):
index.php
:
<form action="csv_import.php" method="POST" enctype="multipart/form-data" >
<input type="file" name="csv_file" />
<input type="submit" name="upload" value="Upload" />
</form>
csv_import.php
:
<?php
if ($_FILES['csv_file']['error'] > 0) {
echo "Error: " . $_FILES['csv_file']['error'] . "<br />";
}else{
if (($handle = fopen($_FILES['csv_file']['tmp_name'], "r")) !== FALSE) {
$dbconn = mysql_connect("localhost", "root", "") or die("Couldn't connect to server!");
mysql_select_db("csv_test") or die("Couldn't find database!");
$ctr = 1; // used to exclude the CSV header
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if ($ctr > 1) mysql_query("INSERT INTO ninja_exer (name, village, country) VALUES ('$data[1]', '$data[2]', '$data[3]')");
else $ctr++;
}
fclose($handle);
}
}
?>
構成ファイルへのパスを定義する必要があります。どこでも使用する場合は、その変数を定義するものを定義する必要があります。プロジェクトで使用できます。
i.e: define('FILE_UPLOADED_PATH','folder1/folder2/so on');
したがって、このコードを入れた後、あなたの完全なfilepathは
FILE_UPLOADED_PATH.$_FILES['csv_file']['name'];
上記のコードを例として使用できます。
ありがとう。