5

PHPでファイルをアップロードするときに、完全なファイルパスを取得する方法を本当に知りたいですか?

これが私の問題です...

PHPでcsvファイルをインポートしています。ファイルのアップロードは問題ありませんが、csv ファイルのインポートに使用される関数 fgetcsv() には fopen が必要です。fopen は、ファイルがphpファイルと同じディレクトリにある必要があることを意味する正確なファイルパスを必要とするため、頭痛の種です。ユーザーが別のディレクトリからファイルを取得した場合はどうなりますか。

これが私のコードです:

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);
  }
 }
?>

ここで fopen は、変数によって渡されるファイル名のみを取得できます$_FILES['csv_file']['name']。インターネットで $_FILES の完全なファイルパスを取得する関数を取得しようとしましたが、見つかりません。

私はウェブ開発に非常に慣れていないので、しばらくお待ちください。できるだけ簡単に答えてください...助けてください...

4

3 に答える 3

6

['name']、ユーザーのコンピューター上の元のファイル名を指します。特に空である可能性があるため、それはあなたにとって役に立ちません。(または、偽の値が含まれている可能性があり、ディレクトリトラバーサルの悪用を引き起こします。したがって、それを避けてください。)

またはに使用できる['tmp_name']ようなサーバー絶対パスであるを使用する必要があります。/tmp/upload85728fopen()move_uploaded_file()

于 2011-04-28T10:01:37.807 に答える
3

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);
  }
 }
?>
于 2011-04-29T05:25:20.073 に答える
0

構成ファイルまたは使用したい場所へのパスを定義する必要があり、その変数を定義すると、プロジェクトで使用できます。

i.e: define('FILE_UPLOADED_PATH','folder1/folder2/so on');

したがって、このコードを配置した後、完全なファイルパスは次のようになります-

FILE_UPLOADED_PATH.$_FILES['csv_file']['name'];

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

ありがとう。

于 2011-04-28T09:52:49.100 に答える