我有这个简单的脚本工作正常,但目前覆盖重复名称的文件。我怎么能避免这个?
<?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');
?>
答案 0 :(得分:2)
在您上传之前添加if (file_exists($upload_path.$filename))
,并将$filename
设置为其他内容。
答案 1 :(得分:1)
一种选择是使用数据库存储原始名称以及唯一ID。
然后您可以将文件保存为您想要的任何唯一名称。
然后使用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
答案 2 :(得分:0)
使用您自己的文件名而不是原始文件名。
这可以通过uniqid()
生成答案 3 :(得分:0)
以散列作为名称存储文件,并将原始文件名与散列一起存储在数据库/平面文件中。
如果你想使用平面文件,它可能只是用户文件存储为.dat,有关文件的信息存储为.json或.xml,如果你愿意,甚至只是一个序列化的PHP对象。< / p>
此外,只要文件名在名称中有多个点(句点),文件扩展名检测逻辑就会失败。