【问题标题】:How to get full filepath when uploading files in PHP?在 PHP 中上传文件时如何获取完整的文件路径?
【发布时间】:2011-08-14 13:43:24
【问题描述】:

我真的很想知道当我在 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 的完整文件路径,但找不到任何功能。

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

【问题讨论】:

  • 请首先提供此.CSV文件所在的目录路径以及您的此编码文件所在的目录
  • 如果您执行 print_r($_FILES),您会发现可以使用更多信息。例如 $_FILES['csv_file']['tmp_name'] 包含您上传文件的完整(临时)路径。 fopen 可以用这个做点什么。另见php.net/manual/en/features.file-upload.post-method.php
  • @vindia 我认为 $_FILES['csv_file']['tmp_name'] 显示了在服务器中临时存储上传文件的位置。我要问的是源的文件路径。
  • 你没有得到源的文件路径。 从不。浏览器出于安全/隐私原因将其过滤掉。 @vindia 指出了您代码中的功能错误。无论如何,您都不能在服务器上使用客户端文件路径。那是两个不同的文件系统,相同的路径是行不通的。

标签: php csv fopen filepath fgetcsv


【解决方案1】:

我能够成功导入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);
  }
 }
?>

【讨论】:

    【解决方案2】:

    ['name'] 指的是用户计算机上的原始文件名。这对你没有用,特别是因为它可能是空的。 (或者它可能包含虚假值,导致目录遍历漏洞。所以,避免它。)

    您需要使用['tmp_name'],这是一个服务器绝对路径,例如/tmp/upload85728,可用于fopen()move_uploaded_file()

    【讨论】:

      【解决方案3】:

      你需要在你的配置文件或你想使用的任何地方定义一个路径,然后无论你定义什么变量,你都可以在你的项目中使用。

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

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

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

      您可以使用上面的代码作为示例。

      谢谢。

      【讨论】:

      • 如果用户上传的csv文件不是我指定的文件路径怎么办
      • no..no..您实际上并不理解我的意思.. 每当用户从您的站点上传文件时,该文件只会上传到您指定的路径。所以在您需要编辑的时候/show 你可以很容易地把它拿回来……这就是我的建议……谢谢。
      • 用户可以从计算机的任何地方上传文件,但上传后的文件只能在特定的路径。所以它使我们的任务变得简单。
      猜你喜欢
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 2013-11-24
      相关资源
      最近更新 更多