【问题标题】:PHP $_FILES['file']['tmp_name']: How to preserve filename and extension?PHP $_FILES['file']['tmp_name']:如何保留文件名和扩展名?
【发布时间】:2011-04-26 02:39:51
【问题描述】:

我正在尝试从表单上传 doc 文件并将其发送到电子邮件。我正在使用

$_FILES['file']['tmp_name'];

问题是,它返回的是一个随机生成的文件名。所以,当它到达收件箱时,文件名是phpvwRGKN.dat(文件名每次都是随机的)。

如何保留文件名和扩展名?

注意:我使用的是geekMail class

【问题讨论】:

  • 老兄 print_r($_FILES);

标签: php


【解决方案1】:

$_FILES['file']['tmp_name']; 将包含服务器上文件的临时文件名。在您处理文件之前,这只是您服务器上的占位符

$_FILES['file']['name']; 包含从用户计算机上传文件的原始名称。

【讨论】:

  • $geekMail->attach('/home/willem/file2.zip') 应该是使用库的格式。所以我不得不使用 $attachment = $_FILES['file']['tmp_name']; $geekMail->attach($attachment);有没有办法可以将 ['name'] 与路径一起传递?
  • 如果你创建一个 src 为 tmp_name 的 img,会发生什么?
  • 感谢您的解释!在网络上的任何地方都找不到该信息
  • 耶!没有太多关于这方面的文档。
  • 我发现$_FILES['file']['name']url 编码的。所以如果我上传Script for "Star Wars".pdf 那么$_FILES['file']['name'] 将是Script for %22Star Wars%22.pdf。您可能想使用urldecode() 来准确获取原始名称。
【解决方案2】:

$_FILES["file"]["name"] - the name of the uploaded file

来自http://www.w3schools.com/php/php_file_upload.asp

【讨论】:

  • 如果我使用 $_FILES["file"]["name"] 并将它分配给一个变量,比如 $attachment,那么它将不起作用,因为它只返回一个文件名。我想我需要给出路径,并且路径只能来自 tmp_name。如果我错了,请纠正我。
  • 大多数邮件库都有两个用于附件的文件名。一个是服务器上文件的名称/位置,另一个是您希望用户看到的名称。在您的情况下,名称/位置是 tmp_name,最终用户文件名是 name
  • 根据您的问题,我了解到您希望使用名称而不是 tmp_name 将文件存储在服务器上。要做的事情是使用php.net/manual/en/function.move-uploaded-file.php move_uploaded_file() 并将tmp_file 移动到带有name 文件名的永久路径。
  • 不,我想通过电子邮件发送文件而不是上传到服务器。
  • 那么,你可以rename($_FILES["file"]["tmp_name"], $_FILES["file"]["name"])它...
【解决方案3】:

$_FILES["file"]["tmp_name"] 包含服务器上文件内容的实际副本,而
$_FILES["file"]["name"] 包含您从客户端计算机上载的文件的名称。

【讨论】:

    【解决方案4】:

    只是一个建议,但您可以尝试使用 Pear Mail_Mime 类。

    http://pear.php.net/package/Mail_Mime/docs

    否则,您可以使用一些代码。使用 rename() 的 Gabi Purcaru 方法不会像它所写的那样工作。请参阅此帖子http://us3.php.net/manual/en/function.rename.php#97347。你需要这样的东西:

    $dir = dirname($_FILES["file"]["tmp_name"]);
    $destination = $dir . DIRECTORY_SEPARATOR . $_FILES["file"]["name"];
    rename($_FILES["file"]["tmp_name"], $destination);
    $geekMail->attach($destination);
    

    【讨论】:

      【解决方案5】:

      就像上面提到的@Gabi Purcaru 一样,重命名和移动文件的正确方法是使用move_uploaded_file()。它执行一些安全检查以防止安全漏洞和其他漏洞。如果您想使用 $_FILES['file']['name'] 的值或从它派生的扩展,则需要清理它的值。使用pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION) 安全地获取扩展。

      【讨论】:

        【解决方案6】:

        如果要获取上传的文件名,请使用$_FILES["file"]["name"]

        但是如果你想阅读上传的文件,你应该使用$_FILES["file"]["tmp_name"],因为tmp_name 是你上传文件的临时副本,它比使用更容易

        $_FILES["file"]["name"] // This name includes a file path, which makes file read process more complex

        【讨论】:

          猜你喜欢
          • 2014-04-03
          • 2017-03-12
          • 1970-01-01
          • 1970-01-01
          • 2015-11-12
          • 1970-01-01
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          相关资源
          最近更新 更多