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']which 是一个服务器绝对路径/tmp/upload85728,可以用于fopen()or 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 回答