重命名上传的文件以避免覆盖

时间:2011-02-23 02:07:28

标签: php upload duplicates

我有这个简单的脚本工作正常,但目前覆盖重复名称的文件。我怎么能避免这个?

<?php
   // Configuration - Your Options
    $allowed_filetypes = array('.mp3'); // These will be the types of file that will pass the validation.
    $max_filesize = 1048576; // Maximum filesize in BYTES (currently 0.5MB).
    $upload_path = './uploads/'; // The place the files will be uploaded to (currently a 'files' directory).

    $filename = $_FILES['userfile']['name']; // Get the name of the file (including file extension).
    $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // Get the extension from the filename.

    if(!in_array($ext,$allowed_filetypes))

        header('Location: http://www.website.com/five/error');

    if(filesize($_FILES['userfile']['tmp_name']) > $max_filesize)

        header('Location: http://www.website.com/five/error');

    if(!is_writable($upload_path))

        header('Location: http://www.website.com/five/error');

    if(move_uploaded_file($_FILES['userfile']['tmp_name'],$upload_path . $filename))

//         echo 'Your file upload was successful, view the file <a href="' . $upload_path . $filename . '" title="Your File">here</a>'; // It worked.
        header('Location: http://www.website.com/five/sent');

    else

        header('Location: http://www.website.com/five/error');

?>

4 个答案:

答案 0 :(得分:2)

在您上传之前添加if (file_exists($upload_path.$filename)),并将$filename设置为其他内容。

答案 1 :(得分:1)

一种选择是使用数据库存储原始名称以及唯一ID。

然后您可以将文件保存为您想要的任何唯一名称。

  • 仅使用id ... file = 1
  • 使用id和extension = 1.mp3
  • 使用id和name = 1_name_of_file.mp3
  • 的组合
  • 或任何其他独特的命名选项。

然后使用php来提供文件。使用原始文件名设置标题。

用户不会知道您如何存储文件。可以使用该名称上载和下载具有相同名称的多个文件,但这些文件唯一地存储在服务器上。

<?php

$actualFile = './uploads/'.$id;

// Can use some smarts to determine the mime type here
header('Content-type: application/force-download');

// The user will be prompted to save it as the filename given here.
header('Content-Disposition: attachment; filename="'.$originalName.'"');
header("Content-Length: ".filesize($actualFile));


// The actual file on the server
readfile($actualFile);
?>

您还可以为缓存设置许多其他标题选项等。

http://php.net/manual/en/function.header.php

Fileinfo是一个很好的扩展,用于确定mimetypes

http://www.php.net/manual/en/function.finfo-file.php

答案 2 :(得分:0)

使用您自己的文件名而不是原始文件名。

这可以通过uniqid()

生成

答案 3 :(得分:0)

以散列作为名称存储文件,并将原始文件名与散列一起存储在数据库/平面文件中。

如果你想使用平面文件,它可能只是用户文件存储为.dat,有关文件的信息存储为.json或.xml,如果你愿意,甚至只是一个序列化的PHP对象。< / p>

此外,只要文件名在名称中有多个点(句点),文件扩展名检测逻辑就会失败。