PHPでファイルをアップロードするときに完全なFilepathを取得する方法は?

StackOverflow https://stackoverflow.com/questions/5816666

質問

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'];

上記のコードを例として使用できます。

ありがとう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top