Переименуйте загруженные файлы, чтобы избежать перезаписи - PullRequest
2 голосов
/ 23 февраля 2011

У меня есть этот простой скрипт, который отлично работает, но в настоящее время перезаписывает файлы с повторяющимися именами. Как я могу избежать этого?

<?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 ]

2 голосов
/ 23 февраля 2011

Добавьте if (file_exists($upload_path.$filename)) перед загрузкой и установите $filename на что-то другое, если это произойдет.

1 голос
/ 23 февраля 2011

Один из вариантов - использовать базу данных для хранения оригинальных имен вместе с уникальным идентификатором.

Затем вы можете сохранить файл под любым уникальным именем.

  • Используйте только идентификатор ... file = 1
  • Используйте идентификатор и добавочный номер = 1.mp3
  • Используйте комбинацию идентификатора и имени = 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

0 голосов
/ 23 февраля 2011

сохраните файл с хэшем в качестве имени и сохраните оригинальное имя файла в базе данных / плоский файл вместе с хэшем.

Если вы хотите использовать плоские файлы, может случиться так, что пользовательский файл будет сохранен как .dat, а информация о файле будет сохранена как .json или .xml или даже просто как сериализованный объект PHP, если вы предпочитаете.

также, ваша логика обнаружения расширения файла не работает, как только имя файла содержит более одной точки (точки) в имени.

0 голосов
/ 23 февраля 2011

Используйте свое собственное имя файла вместо оригинального.

Это может быть, например, сгенерировано с помощью uniqid ()

...