【问题标题】:How to handle file upload name如何处理文件上传名称
【发布时间】:2018-02-08 00:23:07
【问题描述】:

我正在尝试处理文件上传,但现在我面临两难境地。在处理文件名时,我实际上考虑使用两个选项:

选项 1:

move_uploaded_file($_FILES['pdf']['tmp_name'], sprintf('./uploads/%s.%s', sha1_file($_FILES['pdf']['tmp_name']),$ext

选项 2:

move_uploaded_file($_FILES['pdf']['tmp_name'], sprintf('./uploads/%s.%s', "name_$date", $ext

首先将使用 sha1_file 生成哈希,这看起来不太漂亮(我想从数据库中获取上传的文件名并在页面上显示),但会阻止多个相同的文件上传。

Second 获得了一个好看的文件名,但不能防止重复(file_exists 似乎可以识别重复但我无法停止 move_upload_file

你会建议我怎么做才能在没有文件上传重复的情况下获得漂亮的文件名?

【问题讨论】:

    标签: php file-upload


    【解决方案1】:

    也许是一个简单的解决方案:您可以使用 sha1 哈希的名称创建一个临时目录,并使用其原始名称放入文件名。

    这样,多文件上传不同的目录会转到不同的目录,但你会保留原来的文件名。

    例子:

    $uploadDir = "/your upload dir";
    $contentHash = sha1_file($_FILES['pdf']['tmp_name']);
    $tmpDir = $uploadDir . DIRECTORY_SEPARATOR . $contentHash;
    mkdir($tmpDir, 0777); 
    // add filename validation before storing it! 
    $fileName = $tmpDir . DIRECTORY_SEPARATOR . $_FILES['pdf']['name'];
    move_uploaded_file($_FILES['pdf']['tmp_name'], $fileName); 
    

    你会得到一个这样的目录结构:

    • 01BADCOFFEE123
      • test.pdf
    • (其他一些哈希)
      • test.pdf
    • ...

    稍后迭代文件,只需使用递归目录迭代器:

    $uploadDir = "/your upload dir";
    $fileIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($uploadDir), \RecursiveIteratorIterator::LEAVES_ONLY);
    

    无需在数据库中存储任何内容。

    【讨论】:

    • 我想过移动 sha1 文件并以这种方式重命名它,但我不知道是否可以通过这种方式获得相同的哈希来移动文件?
    • 我不明白你在说什么。您需要: 1. 从文件中获取散列 2. 使用散列的名称创建一个临时目录 3. 将上传的文件移动到具有原始名称的该目录。该解决方案有什么问题?
    • 问题是我无法将哈希值转换为变量。如果您知道如何获取哈希,请告诉我。
    • 为了更清楚,我添加了一个代码示例。你是说你总是得到相同的哈希?在这种情况下,文件可能尚未传输,尽管文档另有说明。在这种情况下,您需要将文件移动到另一个 tmp 文件。然后获取哈希。然后移动到最终位置。
    • 当我有时间我会检查一下。我要说的是文件上传是这样的:发送表单-> tmp 目录与tmp 名称-> 哈希tmp 文件-> 移动到上传目录。所以上传文件时会发生 sha1 和任何哈希,所以我无法获取哈希,因为文件已经上传。
    【解决方案2】:

    将您的 db 记录 ID 添加到您的文件名中,这样看起来不错且有意义。

    【讨论】:

    • 现在我不会将上传的文件添加到数据库,直到我弄清楚如何处理这种情况。但这对我来说是个谜。
    猜你喜欢
    • 2016-10-08
    • 2010-12-30
    • 2016-09-08
    • 2010-09-14
    • 2021-03-20
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多