Здравствуйте. Вот есть скрипт загрузки файлов по урл: Код (Text): <?PHP if (!empty($_GET['url'])) { function filesize_get($file1) { // проверяем существует ли файл if(!file_exists($file1)) return "Файл отсутствуетxzxz."; //определяем размер файла $filesize = filesize($file1); // Если размер переданного в функцию файла больше 1кб if($filesize > 1024) { $filesize = ($filesize/1024); // если размер файла больше одного килобайта // пересчитываем в мегабайтах if($filesize > 1024) { $filesize = ($filesize/1024); // если размер файла больше одного мегабайта // пересчитываем в гигабайтах if($filesize > 1024) { $filesize = ($filesize/1024); $filesize = round($filesize, 1); return $filesize." ГБ"; } else { $filesize = round($filesize, 1); return $filesize." MБ"; } } else { $filesize = round($filesize, 1); return $filesize." Кб"; } } else { $filesize = round($filesize, 1); return $filesize." байт"; } } $file = basename($_GET['url']); if (file_get_contents($_GET['url'])) { $content = file_get_contents($_GET['url']); $f = fopen( "$file", "w" ); if (fwrite( $f, $content ) === FALSE) { echo "Не могу произвести запись в файл."; exit; } else {$filesize = filesize_get($file); echo " Файл <font color='red'>" .$file ."</font> записан.".$filesize; fclose( $f );} } else echo "Не могу качать файл."; } ?> Всё было супер, пока не догадался загрузить файл с одинаковым именем. Он перезаписал старый. Вообщем в целях страховки я хочу чтобы при загрузке файла в его имя приписывалась ещё какая либо цифра, чтобы его имя было уникальным. Кто может подсказать как это сделать?
берите имя как md5_file() и у вас всегда будут уникальные файлы (ну то есть коллизии у md5 возможны, но вероятность их крайне мала)
уникальное имя можно сгенерировать как uniqid() - которая зависит от таймера. или как md5(uniqid()) или написать свою функцию генерилку длинного случайного идентификатора.
кому-то надо чтобы имена были понятными, типа nastupila_vesna.jpg у вас в начале есть проверка if(!file_exists($file1)) вот точно также можно проверять наличие файла в вашей директории и если есть добавить в название date('U'), чтобы получилось nastupila_vesna_1353428384.jpg
Уважаемые Гуру, не подсказали бы вы что нужно исправить в коде чтобы имя генерировалось от таймера, то есть год, месяц, день. Я счел этот вариант самым подходящим. То есть чтобы файл переименовывался в вид типа 201303031039.jpg. Ну или чтобы к названию добавлялась дата, или любое число. То есть как в последнем сообщении, где файл проходит проверку.
Хм, тяжелый вопрос. Но я пока о таком даже не задумывался. Так а как составить чтобы было nastupila_vesna_1353428384.jpg? И если не трудно то подскажите что именно надо в коде изменить, а то я ламер ещё.
если сделать вообще вот так: $file = md5( $content ); то одинаковые имена случатся только у файлов с одинаковым содержимым. страшно переписать файл самим собой? имхо, нет =) и кстати, вы дважды загружаете файл Код (Text): if (file_get_contents($_GET['url'])) { $content = file_get_contents($_GET['url']);
у меня есть самописный класс для такого случая. кое-что там лишнего для вас, но я думаю выкинуть это будет просто. Работает он так. При наличии файлов присланных, он создаёт папку со случайным именем длинной два символа, и кладёт в неё все присланные папки с таким вот именем li76ww-onjw-0h. Где первая часть это время, вторая случайная одинаковая на все присланные, и третья - счётчик. Код (PHP): <?php class Files { private static $unifid_counter = -1, $unifid_rand = false, $unifid_randFolder = false; //////////////////////////////////////////////////////////////////////////////////////// // <editor-fold defaultstate="collapsed" desc="Extentions"> private static $extentions = array( // images 'png' => 'image/png', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'ico' => 'image/vnd.microsoft.icon', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', // archives 'zip' => 'application/zip', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', // audio/video 'mp3' => 'audio/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', // adobe 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', // offices 'doc' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', 'txt' => 'text/plain', //internet 'mht' => 'text/html', 'htm' => 'text/html', 'html' => 'text/html', 'php' => 'text/html', 'css' => 'text/css', 'js' => 'application/javascript', 'json' => 'application/json', 'xml' => 'application/xml', 'swf' => 'application/x-shockwave-flash', 'flv' => 'video/x-flv' ); private static $icons = array( // images 'image/png' => 'png', 'image/jpeg' => 'jpg', 'image/gif' => 'gif', 'image/bmp' => 'bmp', 'image/vnd.microsoft.icon' => 'ico', 'image/tiff' => 'tiff', 'image/svg+xml' => 'unknown', // archives 'application/zip' => 'zip', 'application/x-rar-compressed' => 'rar', 'application/x-msdownload' => 'unknown', 'application/vnd.ms-cab-compressed' => 'cab', // audio/video 'audio/mpeg' => 'mp3', 'video/quicktime' => 'unknown', // adobe 'application/pdf' => 'pdf', 'image/vnd.adobe.photoshop' => 'psd', 'application/postscript' => 'unknown', // offices 'application/msword' => 'doc', 'application/rtf' => 'rtf', 'application/vnd.ms-excel' => 'xls', 'application/vnd.ms-powerpoint' => 'ppt', 'application/vnd.oasis.opendocument.text' => 'unknown', 'application/vnd.oasis.opendocument.spreadsheet' => 'unknown', 'text/plain' => 'txt', //internet 'text/html' => 'html', 'text/css' => 'unknown', 'application/javascript' => 'unknown', 'application/json' => 'unknown', 'application/xml' => 'xml', 'application/x-shockwave-flash' => 'unknown', 'video/x-flv' => 'unknown' ); public static function MimeToExtention($mime) { return array_search($mime, self::$extentions); } public static function ExtentionToMime($extention) { if (isset(self::$extentions[$extention])) { return self::$extentions[$extention]; } return false; } public static function MimeToIcon($mime) { return '/images/fileicons/file-' . (isset(self::$icons[$mime]) ? self::$icons[$mime] : 'unknown') . '.png'; } //, Extentions </editor-fold> ///////////////////////////////////////////////////////////////////////////////////////. private static function unifid() { /* * функция использует 26 символов алфавита + 10 цифр чтобы создать уникальное имя файла в хранилище. * * За основу берется текущее время. Уникальность содержимого файлов не имеет значения. * Пример: li76ww-onjw-0h * $part1 = base_convert(time(), 10, 36); //Перевод текущего времени в 36-ти ричный формат: 6 символов. должно хватить на ближайшую четверть века. * $part3 = substr('00' . base_convert(self::$unifid_counter, 10, 36), -2); //счетчик файлов в текущем экземпляре скрипта * */ if (self::$unifid_rand === false) { self::$unifid_rand = substr('00' . base_convert(rand(0, 1295), 10, 36), -2); //один рандом на все вызовы функции в этом экземпляре скрипта. } ++self::$unifid_counter; return base_convert(time(), 10, 36) . '-' . self::$unifid_rand . '-' . substr('00' . base_convert(self::$unifid_counter, 10, 36), -2); } private static function randFolder() { if (self::$unifid_randFolder === false) { self::$unifid_randFolder = substr('00' . base_convert(rand(0, 1295), 10, 36), -2); //один рандом на все вызовы функции в этом экземпляре скрипта. } return self::$unifid_randFolder; } static public function AddNew($order, $work, $filename, $source, $mime) { /* * id int * unifid varchar(16) * date datetime * order int * name varchar(255) * mime varchar(255) */ if (User::$type == 1) { //если это автор include_once 'author.class.php'; $rights = Author::RightsInWork($work); if ($rights['upload'] !== true) { //и у него нет прав заливать файло return false; //мы ему от ворот поворот =) } } $unifid = self::unifid(); $randFolder = self::randFolder(); $copyto = $_SERVER['DOCUMENT_ROOT'] . '/files/' . $randFolder . '/' . $unifid; if (!is_dir($_SERVER['DOCUMENT_ROOT'] . '/files/' . $randFolder)) { mkdir($_SERVER['DOCUMENT_ROOT'] . '/files/' . $randFolder); } $user_type = User::$type; $card_id = User::$card_id; if (move_uploaded_file($source, $copyto) === true) { // удачно скопирован файл, можно заносить запись в БД $clientvisibility = (isset($_POST['clientvisibility']) and $_POST['clientvisibility'] == 1) ? 1 : 0; $authorvisibility = (isset($_POST['authorvisibility']) and $_POST['authorvisibility'] == 1) ? 1 : 0; $query = " INSERT INTO `files` (`id`, `clientvisibility`, `authorvisibility`, `unifid`, `folder`, `date`, `size`, `deleted`, `order`, `work`, `name`, `mime`, `user_type`, `card_id` ) VALUES ( NULL, {$clientvisibility}, {$authorvisibility}, '$unifid', '$randFolder', NOW(), " . DB::escape(filesize($copyto)) . ", NULL, '$order', '$work', '" . DB::escape($filename) . "', '" . DB::escape($mime) . "', '$user_type', '$card_id');"; if ($id = DB::id($query)) { //удачно скопирован, и запись помещена в БД Updater::Work($work); return $id; } } //запись о файле не была помещена в БД. Файл необходимо удалить. Извесить администратора. @unlink($copyto); Engine::logit("ERROR: не удалось поместить запись о новом файле в БД. Файл будет удален.(Заказ: $order, файл: $filename, загружен в: $source)."); return false; } public static function GetPath($id) { $id = intval($id); //security =) $file = DB::firstrow("SELECT * FROM `files` WHERE `id` = '$id'"); return $_SERVER['DOCUMENT_ROOT'] . '/files/' . $file['folder'] . '/' . $file['unifid']; } public static function Delete($id) { $id = intval($id); Site::Plain(); $file = DB::firstrow("SELECT * FROM `files` WHERE `id`=$id AND `enabled`=0"); if ($file !== false && DB::query("UPDATE `files` SET `deleted`=NOW(),`enabled` = 2, `clientvisibility` = 0, `authorvisibility` = 0 WHERE `id` = $id")) { Updater::Work($file['work']); echo 'OK'; return true; } echo 'ERROR'; } //////////////////////////////////////////////////////////////////////////////////////// // <editor-fold defaultstate="collapsed" desc="File download"> public static function StartDownload($id) { $id = intval($id); if ($file = DB::firstrow("SELECT * FROM files WHERE id='$id'")) { if (self::Download(self::GetPath($id), $file['name'])) { //скачался } else { throw new Exception('хз что случилось'); } } } private static function Download($path, $name, $type = 'application/force-download') { if (touch($path)) { $range = 0; $file_size = filesize($path); $properties = array( 'old_name' => $path, 'new_name' => $name, 'size' => $file_size ); if (isset($_SERVER['HTTP_RANGE'])) { $range = $_SERVER['HTTP_RANGE']; $range = str_replace('bytes=', '', $range); $range = str_replace('-', '', $range); } else { $range = 0; } if ($range > $properties['size']) { $range = 0; } if ($range) { header($_SERVER['SERVER_PROTOCOL'] . ' 206 Partial Content'); } else { header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK'); } header('Pragma: public'); header('Expires: 0'); header('Cache-Control:'); header('Cache-Control: public'); header('Content-Description: File Transfer'); header("Content-Type: $type"); header('Content-Disposition: attachment; filename="' . $properties['new_name'] . '";'); header('Content-Transfer-Encoding: binary'); header('Accept-Ranges: bytes'); if ($range) { header("Content-Range: bytes {$range}-" . ($properties['size'] - 1) . "/" . $properties['size']); header("Content-Length: " . ($properties['size'] - $range)); } else { header("Content-Length: " . $properties['size']); } @ini_set('max_execution_time', 0); @set_time_limit(); @ob_end_clean(); $handle = fopen($properties['old_name'], 'rb'); fseek($handle, $range); if ($handle === false) { return false; } //ob_flush(); while (!feof($handle)) { print (fread($handle, 1024 * 8)); flush(); } flush(); fclose($handle); return true; } return false; } //, File download </editor-fold> ///////////////////////////////////////////////////////////////////////////////////////. // //////////////////////////////////////////////////////////////////////////////////////// // <editor-fold defaultstate="collapsed" desc="File Info"> public static function FileInfo($id) { $id = intval($id); Site::Plain(); $file = DB::firstrow("SELECT * FROM `files` WHERE `id` = $id AND `enabled` = 0"); $uploader = DB::firstrow("SELECT `name` FROM `" . Users::$tables[$file['user_type']] . "` WHERE `id` = {$file['card_id']}"); if ($file !== false) { $file['uploader'] = $uploader['name'] . ' (' . Users::$russian_types[$file['user_type']] . ')'; $file['humansize'] = Site::HumanBytes($file['size']); $file['humandate'] = Site::HumanDatePrecise($file['date']); $file['icon'] = Files::MimeToIcon($file['mime']); $file['id'] = $id; echo json_encode($file); return true; } echo 'ERROR'; } public static function FindIDs() { Site::Plain(); //print_r ($_POST); //var_dump ($_GET); /* * var_dump ($_POST); * array 'files' => array * * 'SWFUpload_0_0' => string 'rogacha.jpg' (length=11) * * 'SWFUpload_0_1' => string 'Милашка.jpg' (length=18) Обратите внимание на длинну =) */ $work = Engine::intget('work'); //$order = Engine::intget('order'); $fileids = array(); //сюда будем складывать найденые id или нули if ($work !== false AND isset($_POST['files']) AND !empty($_POST['files']) AND is_array($_POST['files'])) { $workfiles = DB::assoc_id("SELECT `id`, `name` from `files` WHERE `work` = $work AND `deleted` IS NULL", 'name'); if ($workfiles === false) { $workfiles = array(); } foreach ($_POST['files'] as $swfuid => $file) { $id = array_search($file, $workfiles); if ($id === false) { $fileids[$swfuid] = 0; } else { $fileids[$swfuid] = $id; } } echo json_encode($fileids); return true; } echo 'ERROR'; } public static function AJAXupload($work) { Site::Plain(); $work = intval($work); // User authorisation if (isset($_SESSION)) { session_destroy(); } session_id($_POST['filetoken']); session_start(); if (User::Init(Engine::strget('login'), Engine::strget('password')) !== 1) { self::HandleError("UNAUTHORISED"); return false; } // Check post_max_size (http://php.ru/manual/features.file-upload.html#73762) $POST_MAX_SIZE = ini_get('post_max_size'); $unit = strtoupper(substr($POST_MAX_SIZE, -1)); $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1))); if (intval($_SERVER['CONTENT_LENGTH']) > $multiplier * intval($POST_MAX_SIZE) && $POST_MAX_SIZE) { self::HandleError("POST max size exided"); return false; } // Settings $save_path = $_SERVER['DOCUMENT_ROOT'] . "/files/"; // The path were we will save the file (getcwd() may not be reliable and should be tested in your environment) $upload_name = "files"; $max_file_size_in_bytes = 4294967295; // 4GB in bytes - max FAT32 filesize $extension_whitelist = array(); // Allowed file extensions $valid_chars_regex = '.A-Z0-9_ !@#$%^&()+={}\[\]\',~`-'; // Characters allowed in the file name (in a Regular Expression format) // Other variables $MAX_FILENAME_LENGTH = 255; $file_name = ""; $file_extension = ""; $uploadErrors = array( 0 => "There is no error, the file uploaded with success", 1 => "The uploaded file exceeds the upload_max_filesize directive in php.ini", 2 => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", 3 => "The uploaded file was only partially uploaded", 4 => "No file was uploaded", 6 => "Missing a temporary folder" ); // Validate the upload if (!isset($_FILES[$upload_name])) { self::HandleError("No upload found in \$_FILES for " . $upload_name); return false; } else if (isset($_FILES[$upload_name]["error"]) && $_FILES[$upload_name]["error"] != 0) { self::HandleError($uploadErrors[$_FILES[$upload_name]["error"]]); return false; } else if (!isset($_FILES[$upload_name]["tmp_name"]) || !@is_uploaded_file($_FILES[$upload_name]["tmp_name"])) { self::HandleError("Upload failed is_uploaded_file test."); return false; } else if (!isset($_FILES[$upload_name]['name'])) { self::HandleError("File has no name."); return false; } // Validate the file size (Warning the largest files supported by this code is 2GB) $file_size = @filesize($_FILES[$upload_name]["tmp_name"]); if (!$file_size || $file_size > $max_file_size_in_bytes) { self::HandleError("File exceeds the maximum allowed size"); return false; } // Validate file name (for our purposes we'll just remove invalid characters) $file_name = preg_replace('/[^' . $valid_chars_regex . ']|\.+$/i', "", basename($_FILES[$upload_name]['name'])); if (strlen($file_name) == 0 || strlen($file_name) > $MAX_FILENAME_LENGTH) { self::HandleError("Invalid file name"); return false; } if (!empty($extension_whitelist)) { // Validate file extention $path_info = pathinfo($_FILES[$upload_name]['name']); $file_extension = $path_info["extension"]; $is_valid_extension = false; foreach ($extension_whitelist as $extension) { if ($file_extension == $extension) { $is_valid_extension = true; break; } } if (!$is_valid_extension) { self::HandleError("Invalid file extension"); return false; } } //Файл прошел все проверки и должен быть прикреплен к работе. $work = DB::firstrow("SELECT * FROM `works` WHERE `id` = $work AND `enabled` = 0"); if ($work === false) { self::HandleError('No such work'); return false; } //проверить файл с таким именем на существование в данной работе. //если нету - добавить. //если есть - заменить. $file = DB::firstrow("SELECT * FROM `files` WHERE `enabled` = 0 AND `work`={$work['id']} AND `name`='" . DB::escape($_FILES[$upload_name]['name']) . "'"); $mime = self::ExtentionToMime(substr($_FILES[$upload_name]['name'], 1 + strrpos($_FILES[$upload_name]['name'], '.'))); $fileid = self::AddNew($work['order'], $work['id'], $_FILES[$upload_name]['name'], $_FILES[$upload_name]["tmp_name"], $mime); if ($file) { //обновляем - старый deleted, enabled = 1 Engine::logit("Обновляю файл №{$file['id']}, замещаю на №$fileid имя {$_FILES[$upload_name]['name']}"); DB::query("UPDATE `files` SET `enabled` = 1, `clientvisibility` = 0, `authorvisibility` = 0, `deleted` = NOW() WHERE `id` = {$file['id']}"); Updater::Work($work['id']); } self::FileInfo($fileid); return true; } /* Handles the error output. This function was written for SWFUpload for Flash Player 8 which cannot return data to the server, so it just returns a 500 error. For Flash Player 9 you will want to change this to return the server data you want to indicate an error and then use SWFUpload's uploadSuccess to check the server_data for your error indicator. */ private static function HandleError($message) { //header("HTTP/1.1 500 Internal Server Error"); echo $message; } //, File upload </editor-fold> ///////////////////////////////////////////////////////////////////////////////////////. //////////////////////////////////////////////////////////////////////////////////////// // // <editor-fold defaultstate="collapsed" desc="Download in one archive"> public static function DownloadAllForWork($id) { $id = intval($id); // тут проверка на привилегии $files = DB::assoc("SELECT * FROM `files` WHERE `deleted` IS NULL AND `enabled` = 0 AND `work` = $id"); if ($files === false) { Site::Warning("Нет доступных файлов для данной работы."); } else { $zip = new ZipArchive; $zipname = $_SERVER['DOCUMENT_ROOT'] . '/zips/' . self::randFolder() . uniqid() . '.zip'; //randFolder gives more safety (to me) $zipopen = $zip->open($zipname, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($zipopen !== true) { Site::Error('Не удалось создать архив. Администрация извещена. Попробуйте повторить попытку позднее. Извините.'); echo 'КОД: ' . $zipopen; } else { foreach ($files as $file) { $zip->addFile(self::GetPath($file['id']), iconv("UTF-8", "CP866", $file['name'])); } $zip->close(); Site::Plain(); if (self::Download($zipname, $file['order'] . '-' . $file['work'] . '.zip')) { //скачался } else { //хз что случилось } } } } public static function SendOrderFilesToClient($id) { $id = intval($id); // тут проверка на привилегии $zipname = self::CreateZipForOrder($id); if ($zipname === false) { Site::Error('Невозможно создать файл к заказу №' . $id); } else { Site::Msg("Файлы заказа №$id отправлены клиенту."); } } public static function DownloadAllForOrder($id) { $id = intval($id); // тут проверка на привилегии $zipname = self::CreateZipForOrder($id); if ($zipname === false) { Site::Error('Невозможно создать файл к заказу №' . $id); } else { Site::Plain(); if (self::Download($zipname, $id . '.zip')) { //скачался } else { //хз что случилось } } } private static function CreateZipForOrder($id) { $id = intval($id); // тут проверка на привилегии $workfiles = DB::assoc_sorted("SELECT * FROM `files` WHERE `deleted` IS NULL AND `enabled` = 0 AND `order` = $id", 'work'); if ($workfiles === false) { Site::Warning("Нет доступных файлов для данного заказа."); return false; } else { $zip = new ZipArchive; $zipname = $_SERVER['DOCUMENT_ROOT'] . '/zips/' . self::randFolder() . uniqid() . '.zip'; //randFolder gives more safety (to me) $zipopen = $zip->open($zipname, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($zipopen !== true) { Site::Error('Не удалось создать архив. Администрация извещена. Попробуйте повторить попытку позднее. Извините.'); //echo 'КОД: ' . $zipopen; return false; } else { foreach ($workfiles as $work => $files) { $zip->addEmptyDir($work); foreach ($files as $file) { if (!$zip->addFile(self::GetPath($file['id']), $work . '/' . iconv("UTF-8", "CP866", $file['name']))) { $zip->close(); unlink($zipname); return false; } } } $zip->close(); } } return $zipname; } public static function DownloadAllForPack($id) { $id = intval($id); // тут проверка на привилегии $workfiles = DB::assoc_sorted("SELECT * FROM `files` WHERE `work` IN ( SELECT `t1`.`work` FROM `pack_works` AS `t1`, `packs` AS `t2` WHERE `t1`.`pack` = `t2`.`id` AND `t2`.`id` = '{$id}' AND `t2`.`enabled` = '0' )", 'work'); if ($workfiles === false) { Site::Warning("Нет доступных файлов для данного заказа."); } else { $zip = new ZipArchive; $zipname = $_SERVER['DOCUMENT_ROOT'] . '/zips/' . self::randFolder() . uniqid() . '.zip'; //randFolder gives more safety (to me) $zipopen = $zip->open($zipname, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($zipopen !== true) { Site::Error('Не удалось создать архив. Администрация извещена. Попробуйте повторить попытку позднее. Извините.'); echo 'КОД: ' . $zipopen; } else { foreach ($workfiles as $work => $files) { $zip->addEmptyDir($work); foreach ($files as $file) { $zip->addFile(self::GetPath($file['id']), $work . '/' . iconv("UTF-8", "CP866", $file['name'])); } } $zip->close(); Site::Plain(); if (self::Download($zipname, $id . '.zip')) { //скачался } else { //хз что случилось } } } } //, Download in one archive </editor-fold> ///////////////////////////////////////////////////////////////////////////////////////.
Я просто нашел готовый код и встроил в свой простой движок, который впринципе тоже собрал по чужому коду. Так что не особо силен в этом всём. =) А если допустим картинка отличается хотя бы одним пикселем, то мд5 уже будет другой? Извините за глупый вопрос.
будет другой. но в этом смысла никакого нет. зачем читать файл, когда тебе нужно просто уникальное случайное нечто. на вот тебе гарантированно униальное: $name = base_convert(time(), 10, 36).'-'.base_convert(rand(0,2000000000), 10, 36);
Когда файл загружается на сервер, обычно помимо самого файла - также создаётся запись в базе данных, в которой есть информация о файле - название там, описание. Всякая инфа, короче. Обычно в таких случаях я сперва вставляю запись в базу, а потом сохраняю файл. В качестве названия файла - использую ID вставленной в базу записи.
вот это мне пригодилось, теперь файлы записываются как mj2zjn-b3srhx.jpg. Я конечно не очень понимаю логики генерирование такого слова, почему первая часть это время, вторая случайная одинаковая на все присланные, и третья - счётчик. Ну да Бог с ним, когда нибудь пойму. И что значат цифры 10 и 36? Всем спасибо за помощь!
В простом скрипте галерея сделал так: Код (Text): $fotodir='uploads'; $filesdir = scandir($fotodir, 1); $files=count($filesdir); $number=1000-$files;// Присвоение загружаемому файлу порядкового номера 1000,999,998 и тд или можно наоборот $fotoname=$number.'.'.$ext;