Как получить уникальное имя для каждого загруженного файла с помощью uploadify
Я загружаю файлы с помощью плагина jQuery uploadify. Все файлы загружаются в один и тот же каталог. Когда я пытаюсь загрузить файл дважды, он выдает мне следующую ошибку.
filename.gif (4.3KB) - IO Error
Я хочу каждый раз загружать файл с уникальным именем. Есть много других пользователей, загружающих файлы в тот же каталог. Таким образом, есть вероятность, что два пользователя используют одно и то же имя файла. Как я могу избежать перезаписи.
Мой Код:
$('.SingleFileUpload').uploadify({
'uploader' : '/uploadify/uploadify.swf',
'script' : '/uploadify/uploadify.php',
'cancelImg' : '/uploadify/cancel.png',
'folder' : '/uploads',
'auto' : true,
'queueID' : 'fileQueue',
'removeCompleted':false,
'onComplete' : function(event, ID, fileObj, response, data) {
$(event.target).closest('form').append( '<input type="hidden" name="uploaded_file" value="' + response + '">' );
}
});
3 answers
Я не думаю, что использование javascript хорошо или безопасно для этого, один из методов, который я использую, - это называть каждый файл, вычисляя его SHA1 на стороне сервера.
Для начала откажитесь от повторяющихся имен файлов:
$targetFolder = '/uploads'; // Relative to the root
if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
$targetFile = rtrim($targetPath,'/') . $_FILES['Filedata']['name'];
// Validate the file type
$fileTypes = array('jpg','jpeg','gif','png'); // File extensions
$fileParts = pathinfo($_FILES['Filedata']['name']);
if (in_array($fileParts['extension'],$fileTypes)) {
if (file_exists($targetFile)){
echo 'File does already exist, choose another name!';
}
else {
move_uploaded_file($tempFile,$targetFile);
echo '1';
}
} else {
echo 'Invalid file type.';
}
}
?>
Вы можете добавить ко всем своим именам файлов префикс идентификатора пользователя + символ подчеркивания (или любой символ, чтобы отделить идентификатор от имени файла, чтобы избежать UID1 + 2file == UID12 + file
.
Вместо того, чтобы заставлять пользователя выбирать другое имя, вы также можете реализовать автоматическое изменение имени: либо путем добавления префикса и/или постфикса, либо путем вычисления хэша файла. Последний параметр также предотвращает дублирование файлов (одно и то же имя, одно и то же содержимое) из появляющийся на сервере.
Я дублирую имя файла и добавляю copynr в конце. любить: имя файла (2) имя файла (3) имя файла(4) и т.д.
$('#upload').uploadify({
'uploader' : 'resources/plugins/uploadify/uploadify.swf',
'script' : 'resources/plugins/uploadify/uploadify.php',
'cancelImg' : 'resources/plugins/uploadify/cancel.png',
'folder' : 'uploads/',
'auto' : true,
'multi' : false,
'fileDesc' : '*.jpg;*.jpeg;*.png;*.gif;',
'fileExt' : '*.jpg;*.jpeg;*.png;*.gif;',
onComplete: function (evt, queueID, fileObj, response, data){
alert(response); // = uploaded filename
}
Только часть uploadify JS (не используя метод проверки!) Теперь uploadify.php часть
if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$ext = '.'.pathinfo($_FILES['Filedata']['name'], PATHINFO_EXTENSION);
$filename = substr($_FILES['Filedata']['name'],0,-strlen($ext));
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
$targetFile = str_replace('//','/',$targetPath) . $filename . $ext;
while(file_exists($targetFile)){
preg_match('/\([0-9]{1,}\)$/', $filename,$matches);
if(!empty($matches)){
preg_match('/[0-9]{1,}/', $matches[0],$nr);
$filename = substr($filename,0,-strlen($matches[0])) . '('.(((int)$nr[0])+1).')';
}else
$filename .= '(2)';
$targetFile = str_replace('//','/',$targetPath) .$filename . $ext;
}
if(!is_dir($targetPath)) mkdir(str_replace('//','/',$targetPath), 0755, true);
move_uploaded_file($tempFile,$targetFile);
echo $filename.$ext;}
НТХ