上传文件时如何获取完整文件路径(PHP)?

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 的完整文件路径的函数,但是没有找到。

我对 Web 开发非常陌生,请耐心等待。请尽可能简单地回答... 请帮帮我...


请首先提供包含此 .CSV 文件的目录路径以及您的编码文件所在的位置。 - Allov
1
如果你执行print_r($_FILES),你会发现有更多的信息可以使用。例如,$_FILES['csv_file']['tmp_name']包含了上传文件的完整(临时)路径。fopen可以处理这些信息。请参考http://www.php.net/manual/en/features.file-upload.post-method.php。 - vindia
1
@vindia 我认为 $_FILES['csv_file']['tmp_name'] 显示了在服务器上暂时存储上传文件的位置。我想问的是源文件的文件路径。 - Newbie Coder
你永远不会得到源文件的文件路径。浏览器出于安全/隐私原因过滤掉了它。@vindia指出了你代码中的功能性错误。无论如何,你都不能在服务器上使用客户端的文件路径。那是两个不同的文件系统,相同的路径是行不通的。 - mario
可能是https://dev59.com/Pm035IYBdhLWcg3wYfAF的重复问题。 - Nagama Inamdar
3个回答

6
['name'] 是指用户计算机上的原始文件名称。这对您没有用处,特别是因为它可能为空。或者它可能包含虚假值,导致目录遍历漏洞。因此,请避免使用它。
您需要使用 ['tmp_name'],它是服务器绝对路径,如 /tmp/upload85728,可以用于 fopen()move_uploaded_file()

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

0

您需要在配置文件或任何您想使用的地方定义一个路径,然后将该变量用于您的项目中。

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

所以在放置这段代码之后,你的完整文件路径将是 -

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

你可以将上面的代码用作例子。

谢谢。


如果用户上传了一个不是我指定的文件路径的CSV文件,该怎么办? - Newbie Coder
不不不,你并没有真正理解我的意思。无论何时用户从你的网站上上传文件,该文件都只会上传到你指定的路径。所以在需要编辑或展示的时候,你可以轻松地找到它。这就是我建议的。谢谢。 - Chandresh M
用户可以从计算机的任何位置上传文件,但上传后的文件仅存储在特定路径中,这使我们的任务变得简单。 - Chandresh M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接