За последние 24 часа нас посетили 43396 программистов и 1723 робота. Сейчас ищут 647 программистов ...

Как задать уникальное имя для загружаемого файла?

Тема в разделе "PHP для новичков", создана пользователем marius, 3 мар 2013.

  1. marius

    marius Активный пользователь

    С нами с:
    3 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте. Вот есть скрипт загрузки файлов по урл:
    Код (Text):
    1. <?PHP
    2. if (!empty($_GET['url']))
    3. {
    4. function filesize_get($file1)
    5. {
    6. // проверяем существует ли файл
    7. if(!file_exists($file1)) return "Файл отсутствуетxzxz.";
    8. //определяем размер файла
    9. $filesize = filesize($file1);
    10. // Если размер переданного в функцию файла больше 1кб
    11. if($filesize > 1024)
    12. {
    13. $filesize = ($filesize/1024);
    14. // если размер файла больше одного килобайта
    15. // пересчитываем в мегабайтах
    16. if($filesize > 1024)
    17. {
    18. $filesize = ($filesize/1024);
    19. // если размер файла больше одного мегабайта
    20. // пересчитываем в гигабайтах
    21. if($filesize > 1024)
    22. {
    23. $filesize = ($filesize/1024);
    24. $filesize = round($filesize, 1);
    25. return $filesize." ГБ";
    26. }
    27. else
    28. {
    29. $filesize = round($filesize, 1);
    30. return $filesize." MБ";
    31. }
    32. }
    33. else
    34. {
    35. $filesize = round($filesize, 1);
    36. return $filesize." Кб";
    37. }
    38. }
    39. else
    40. {
    41. $filesize = round($filesize, 1);
    42. return $filesize." байт";
    43. }
    44. }
    45. $file = basename($_GET['url']);
    46. if (file_get_contents($_GET['url']))
    47. {
    48. $content = file_get_contents($_GET['url']);
    49. $f = fopen( "$file", "w" );
    50. if (fwrite( $f, $content ) === FALSE)
    51. {
    52. echo "Не могу произвести запись в файл.";
    53. exit;
    54. }
    55. else {$filesize = filesize_get($file); echo " Файл <font color='red'>" .$file ."</font> записан.".$filesize;
    56. fclose( $f );}
    57. }
    58. else echo "Не могу качать файл.";
    59. }
    60. ?>
    Всё было супер, пока не догадался загрузить файл с одинаковым именем. Он перезаписал старый. Вообщем в целях страховки я хочу чтобы при загрузке файла в его имя приписывалась ещё какая либо цифра, чтобы его имя было уникальным. Кто может подсказать как это сделать?
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    берите имя как md5_file() и у вас всегда будут уникальные файлы (ну то есть коллизии у md5 возможны, но вероятность их крайне мала)
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    уникальное имя можно сгенерировать как uniqid() - которая зависит от таймера. или как md5(uniqid()) или написать свою функцию генерилку длинного случайного идентификатора.
     
  4. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    кому-то надо чтобы имена были понятными, типа nastupila_vesna.jpg
    у вас в начале есть проверка if(!file_exists($file1)) вот точно также можно проверять наличие файла в вашей директории и если есть добавить в название date('U'), чтобы получилось nastupila_vesna_1353428384.jpg
     
  5. marius

    marius Активный пользователь

    С нами с:
    3 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Уважаемые Гуру, не подсказали бы вы что нужно исправить в коде чтобы имя генерировалось от таймера, то есть год, месяц, день. Я счел этот вариант самым подходящим. То есть чтобы файл переименовывался в вид типа 201303031039.jpg. Ну или чтобы к названию добавлялась дата, или любое число. То есть как в последнем сообщении, где файл проходит проверку.
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    $file = date('YmdHis') . 'jpg';
     
  7. marius

    marius Активный пользователь

    С нами с:
    3 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Спасибо! =)
     
  8. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    а если в течении секунды будет загружено несколько файлов?
     
  9. marius

    marius Активный пользователь

    С нами с:
    3 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Хм, тяжелый вопрос. Но я пока о таком даже не задумывался. Так а как составить чтобы было nastupila_vesna_1353428384.jpg? И если не трудно то подскажите что именно надо в коде изменить, а то я ламер ещё.
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    если сделать вообще вот так:
    $file = md5( $content );
    то одинаковые имена случатся только у файлов с одинаковым содержимым. страшно переписать файл самим собой? имхо, нет =)
    и кстати, вы дважды загружаете файл
    Код (Text):
    1. if (file_get_contents($_GET['url']))
    2. {
    3. $content = file_get_contents($_GET['url']);
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    у меня есть самописный класс для такого случая. кое-что там лишнего для вас, но я думаю выкинуть это будет просто.

    Работает он так. При наличии файлов присланных, он создаёт папку со случайным именем длинной два символа, и кладёт в неё все присланные папки с таким вот именем li76ww-onjw-0h. Где первая часть это время, вторая случайная одинаковая на все присланные, и третья - счётчик.

    Код (PHP):
    1. <?php
    2.  
    3. class Files {
    4.  
    5.   private static
    6.           $unifid_counter = -1,
    7.           $unifid_rand = false,
    8.           $unifid_randFolder = false;
    9. ////////////////////////////////////////////////////////////////////////////////////////
    10. // <editor-fold defaultstate="collapsed" desc="Extentions">
    11.   private static $extentions = array(
    12. // images
    13.       'png' => 'image/png',
    14.       'jpg' => 'image/jpeg',
    15.       'jpeg' => 'image/jpeg',
    16.       'jpe' => 'image/jpeg',
    17.       'gif' => 'image/gif',
    18.       'bmp' => 'image/bmp',
    19.       'ico' => 'image/vnd.microsoft.icon',
    20.       'tiff' => 'image/tiff',
    21.       'tif' => 'image/tiff',
    22.       'svg' => 'image/svg+xml',
    23.       'svgz' => 'image/svg+xml',
    24.       // archives
    25.       'zip' => 'application/zip',
    26.       'rar' => 'application/x-rar-compressed',
    27.       'exe' => 'application/x-msdownload',
    28.       'msi' => 'application/x-msdownload',
    29.       'cab' => 'application/vnd.ms-cab-compressed',
    30.       // audio/video
    31.       'mp3' => 'audio/mpeg',
    32.       'qt' => 'video/quicktime',
    33.       'mov' => 'video/quicktime',
    34.       // adobe
    35.       'pdf' => 'application/pdf',
    36.       'psd' => 'image/vnd.adobe.photoshop',
    37.       'ai' => 'application/postscript',
    38.       'eps' => 'application/postscript',
    39.       'ps' => 'application/postscript',
    40.       // offices
    41.       'doc' => 'application/msword',
    42.       'rtf' => 'application/rtf',
    43.       'xls' => 'application/vnd.ms-excel',
    44.       'ppt' => 'application/vnd.ms-powerpoint',
    45.       'odt' => 'application/vnd.oasis.opendocument.text',
    46.       'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
    47.       'txt' => 'text/plain',
    48.       //internet
    49.       'mht' => 'text/html',
    50.       'htm' => 'text/html',
    51.       'html' => 'text/html',
    52.       'php' => 'text/html',
    53.       'css' => 'text/css',
    54.       'js' => 'application/javascript',
    55.       'json' => 'application/json',
    56.       'xml' => 'application/xml',
    57.       'swf' => 'application/x-shockwave-flash',
    58.       'flv' => 'video/x-flv'
    59.   );
    60.   private static $icons = array(
    61. // images
    62.       'image/png' => 'png',
    63.       'image/jpeg' => 'jpg',
    64.       'image/gif' => 'gif',
    65.       'image/bmp' => 'bmp',
    66.       'image/vnd.microsoft.icon' => 'ico',
    67.       'image/tiff' => 'tiff',
    68.       'image/svg+xml' => 'unknown',
    69.       // archives
    70.       'application/zip' => 'zip',
    71.       'application/x-rar-compressed' => 'rar',
    72.       'application/x-msdownload' => 'unknown',
    73.       'application/vnd.ms-cab-compressed' => 'cab',
    74.       // audio/video
    75.       'audio/mpeg' => 'mp3',
    76.       'video/quicktime' => 'unknown',
    77.       // adobe
    78.       'application/pdf' => 'pdf',
    79.       'image/vnd.adobe.photoshop' => 'psd',
    80.       'application/postscript' => 'unknown',
    81.       // offices
    82.       'application/msword' => 'doc',
    83.       'application/rtf' => 'rtf',
    84.       'application/vnd.ms-excel' => 'xls',
    85.       'application/vnd.ms-powerpoint' => 'ppt',
    86.       'application/vnd.oasis.opendocument.text' => 'unknown',
    87.       'application/vnd.oasis.opendocument.spreadsheet' => 'unknown',
    88.       'text/plain' => 'txt',
    89.       //internet
    90.       'text/html' => 'html',
    91.       'text/css' => 'unknown',
    92.       'application/javascript' => 'unknown',
    93.       'application/json' => 'unknown',
    94.       'application/xml' => 'xml',
    95.       'application/x-shockwave-flash' => 'unknown',
    96.       'video/x-flv' => 'unknown'
    97.   );
    98.  
    99.   public static function MimeToExtention($mime) {
    100.     return array_search($mime, self::$extentions);
    101.   }
    102.  
    103.   public static function ExtentionToMime($extention) {
    104.     if (isset(self::$extentions[$extention])) {
    105.       return self::$extentions[$extention];
    106.     }
    107.     return false;
    108.   }
    109.  
    110.   public static function MimeToIcon($mime) {
    111.     return '/images/fileicons/file-' . (isset(self::$icons[$mime]) ? self::$icons[$mime] : 'unknown') . '.png';
    112.   }
    113.  
    114. //, Extentions   </editor-fold>
    115. ///////////////////////////////////////////////////////////////////////////////////////.
    116.  
    117.   private static function unifid() {
    118.     /*
    119.      * функция использует 26 символов алфавита + 10 цифр чтобы создать уникальное имя файла в хранилище.
    120.      *
    121.      * За основу берется текущее время. Уникальность содержимого файлов не имеет значения.
    122.      * Пример: li76ww-onjw-0h
    123.      * $part1 = base_convert(time(), 10, 36); //Перевод текущего времени в 36-ти ричный формат: 6 символов. должно хватить на ближайшую четверть века.
    124.      * $part3 = substr('00' . base_convert(self::$unifid_counter, 10, 36), -2); //счетчик файлов в текущем экземпляре скрипта
    125.      *
    126.      */
    127.     if (self::$unifid_rand === false) {
    128.       self::$unifid_rand = substr('00' . base_convert(rand(0, 1295), 10, 36), -2); //один рандом на все вызовы функции в этом экземпляре скрипта.
    129.     }
    130.     ++self::$unifid_counter;
    131.     return base_convert(time(), 10, 36) . '-' . self::$unifid_rand . '-' . substr('00' . base_convert(self::$unifid_counter, 10, 36), -2);
    132.   }
    133.  
    134.   private static function randFolder() {
    135.     if (self::$unifid_randFolder === false) {
    136.       self::$unifid_randFolder = substr('00' . base_convert(rand(0, 1295), 10, 36), -2); //один рандом на все вызовы функции в этом экземпляре скрипта.
    137.     }
    138.     return self::$unifid_randFolder;
    139.   }
    140.  
    141.   static public function AddNew($order, $work, $filename, $source, $mime) {
    142.     /*
    143.      *  id    int
    144.      *  unifid    varchar(16)
    145.      *  date    datetime
    146.      *  order    int
    147.      *  name    varchar(255)
    148.      *  mime    varchar(255)
    149.      */
    150.     if (User::$type == 1) {
    151.       //если это автор
    152.       include_once 'author.class.php';
    153.       $rights = Author::RightsInWork($work);
    154.       if ($rights['upload'] !== true) {
    155.         //и у него нет прав заливать файло
    156.         return false; //мы ему от ворот поворот =)
    157.       }
    158.     }
    159.  
    160.     $unifid = self::unifid();
    161.     $randFolder = self::randFolder();
    162.     $copyto = $_SERVER['DOCUMENT_ROOT'] . '/files/' . $randFolder . '/' . $unifid;
    163.     if (!is_dir($_SERVER['DOCUMENT_ROOT'] . '/files/' . $randFolder)) {
    164.       mkdir($_SERVER['DOCUMENT_ROOT'] . '/files/' . $randFolder);
    165.     }
    166.     $user_type = User::$type;
    167.     $card_id = User::$card_id;
    168.     if (move_uploaded_file($source, $copyto) === true) {
    169.       // удачно скопирован файл, можно заносить запись в БД
    170.       $clientvisibility = (isset($_POST['clientvisibility']) and $_POST['clientvisibility'] == 1) ? 1 : 0;
    171.       $authorvisibility = (isset($_POST['authorvisibility']) and $_POST['authorvisibility'] == 1) ? 1 : 0;
    172.       $query = "
    173.         INSERT INTO `files` (`id`, `clientvisibility`, `authorvisibility`, `unifid`, `folder`, `date`, `size`, `deleted`, `order`, `work`, `name`, `mime`, `user_type`, `card_id` )
    174.         VALUES ( NULL, {$clientvisibility}{$authorvisibility}, '$unifid', '$randFolder', NOW(), " . DB::escape(filesize($copyto)) . ", NULL, '$order', '$work', '" . DB::escape($filename) . "', '" . DB::escape($mime) . "', '$user_type', '$card_id');";
    175.  
    176.       if ($id = DB::id($query)) {
    177.         //удачно скопирован, и запись помещена в БД
    178.         Updater::Work($work);
    179.         return $id;
    180.       }
    181.     }
    182. //запись о файле не была помещена в БД. Файл необходимо удалить. Извесить администратора.
    183.     @unlink($copyto);
    184.     Engine::logit("ERROR: не удалось поместить запись о новом файле в БД. Файл будет удален.(Заказ: $order, файл: $filename, загружен в: $source).");
    185.     return false;
    186.   }
    187.  
    188.   public static function GetPath($id) {
    189.     $id = intval($id); //security =)
    190.     $file = DB::firstrow("SELECT * FROM `files` WHERE `id` = '$id'");
    191.     return $_SERVER['DOCUMENT_ROOT'] . '/files/' . $file['folder'] . '/' . $file['unifid'];
    192.   }
    193.  
    194.   public static function Delete($id) {
    195.     $id = intval($id);
    196.     Site::Plain();
    197.     $file = DB::firstrow("SELECT * FROM `files` WHERE `id`=$id AND `enabled`=0");
    198.     if ($file !== false
    199.             && DB::query("UPDATE `files` SET `deleted`=NOW(),`enabled` = 2, 
    200.                     `clientvisibility` = 0, `authorvisibility` = 0
    201.               WHERE `id` = $id")) {
    202.         Updater::Work($file['work']);
    203.         echo 'OK';
    204.         return true;
    205.     }
    206.     echo 'ERROR';
    207.   }
    208.  
    209.   ////////////////////////////////////////////////////////////////////////////////////////
    210.   // <editor-fold defaultstate="collapsed" desc="File download">
    211.  
    212.   public static function StartDownload($id) {
    213.     $id = intval($id);
    214.     if ($file = DB::firstrow("SELECT * FROM files WHERE id='$id'")) {
    215.       if (self::Download(self::GetPath($id), $file['name'])) {
    216.         //скачался
    217.       } else {
    218.         throw new Exception('хз что случилось');
    219.       }
    220.     }
    221.   }
    222.  
    223.   private static function Download($path, $name, $type = 'application/force-download') {
    224.     if (touch($path)) {
    225.       $range = 0;
    226.       $file_size = filesize($path);
    227.       $properties = array(
    228.           'old_name' => $path,
    229.           'new_name' => $name,
    230.           'size' => $file_size
    231.       );
    232.  
    233.       if (isset($_SERVER['HTTP_RANGE'])) {
    234.         $range = $_SERVER['HTTP_RANGE'];
    235.         $range = str_replace('bytes=', '', $range);
    236.         $range = str_replace('-', '', $range);
    237.       } else {
    238.         $range = 0;
    239.       }
    240.       if ($range > $properties['size']) {
    241.         $range = 0;
    242.       }
    243.  
    244.  
    245.       if ($range) {
    246.         header($_SERVER['SERVER_PROTOCOL'] . ' 206 Partial Content');
    247.       } else {
    248.         header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
    249.       }
    250.       header('Pragma: public');
    251.       header('Expires: 0');
    252.       header('Cache-Control:');
    253.       header('Cache-Control: public');
    254.       header('Content-Description: File Transfer');
    255.       header("Content-Type: $type");
    256.       header('Content-Disposition: attachment; filename="' . $properties['new_name'] . '";');
    257.       header('Content-Transfer-Encoding: binary');
    258.       header('Accept-Ranges: bytes');
    259.  
    260.       if ($range) {
    261.         header("Content-Range: bytes {$range}-" . ($properties['size'] - 1) . "/" . $properties['size']);
    262.         header("Content-Length: " . ($properties['size'] - $range));
    263.       } else {
    264.         header("Content-Length: " . $properties['size']);
    265.       }
    266.  
    267.       @ini_set('max_execution_time', 0);
    268.       @set_time_limit();
    269.       @ob_end_clean();
    270.  
    271.  
    272.       $handle = fopen($properties['old_name'], 'rb');
    273.       fseek($handle, $range);
    274.  
    275.       if ($handle === false) {
    276.         return false;
    277.       }
    278.       //ob_flush();
    279.       while (!feof($handle)) {
    280.         print (fread($handle, 1024 * 8));
    281.         flush();
    282.       }
    283.       flush();
    284.       fclose($handle);
    285.       return true;
    286.     }
    287.     return false;
    288.   }
    289.  
    290.   //, File download   </editor-fold>
    291.   ///////////////////////////////////////////////////////////////////////////////////////.
    292.   //
    293.   ////////////////////////////////////////////////////////////////////////////////////////
    294.   // <editor-fold defaultstate="collapsed" desc="File Info">
    295.   public static function FileInfo($id) {
    296.     $id = intval($id);
    297.     Site::Plain();
    298.     $file = DB::firstrow("SELECT * FROM `files` WHERE `id` = $id AND `enabled` = 0");
    299.     $uploader = DB::firstrow("SELECT `name` FROM `" . Users::$tables[$file['user_type']] . "` WHERE `id` = {$file['card_id']}");
    300.     if ($file !== false) {
    301.       $file['uploader'] = $uploader['name'] . ' (' . Users::$russian_types[$file['user_type']] . ')';
    302.       $file['humansize'] = Site::HumanBytes($file['size']);
    303.       $file['humandate'] = Site::HumanDatePrecise($file['date']);
    304.       $file['icon'] = Files::MimeToIcon($file['mime']);
    305.       $file['id'] = $id;
    306.       echo json_encode($file);
    307.       return true;
    308.     }
    309.     echo 'ERROR';
    310.   }
    311.  
    312.   public static function FindIDs() {
    313.     Site::Plain();
    314.     //print_r ($_POST);
    315.     //var_dump ($_GET);
    316.     /*
    317.      * var_dump ($_POST);
    318.      * array 'files' => array
    319.      * * 'SWFUpload_0_0' => string 'rogacha.jpg' (length=11)
    320.      * * 'SWFUpload_0_1' => string 'Милашка.jpg' (length=18) Обратите внимание на длинну =)
    321.      */
    322.     $work = Engine::intget('work');
    323.     //$order = Engine::intget('order');
    324.     $fileids = array(); //сюда будем складывать найденые id или нули
    325.     if ($work !== false AND isset($_POST['files']) AND !empty($_POST['files']) AND is_array($_POST['files'])) {
    326.       $workfiles = DB::assoc_id("SELECT `id`, `name` from `files` WHERE `work` = $work AND `deleted` IS NULL", 'name');
    327.       if ($workfiles === false) {
    328.         $workfiles = array();
    329.       }
    330.       foreach ($_POST['files'] as $swfuid => $file) {
    331.         $id = array_search($file, $workfiles);
    332.         if ($id === false) {
    333.           $fileids[$swfuid] = 0;
    334.         } else {
    335.           $fileids[$swfuid] = $id;
    336.         }
    337.       }
    338.       echo json_encode($fileids);
    339.       return true;
    340.     }
    341.     echo 'ERROR';
    342.   }
    343.  
    344.   public static function AJAXupload($work) {
    345.     Site::Plain();
    346.     $work = intval($work);
    347.     // User authorisation
    348.     if (isset($_SESSION)) {
    349.       session_destroy();
    350.     }
    351.     session_id($_POST['filetoken']);
    352.     session_start();
    353.     if (User::Init(Engine::strget('login'), Engine::strget('password')) !== 1) {
    354.       self::HandleError("UNAUTHORISED");
    355.       return false;
    356.     }
    357.  
    358.     // Check post_max_size (http://php.ru/manual/features.file-upload.html#73762)
    359.     $POST_MAX_SIZE = ini_get('post_max_size');
    360.     $unit = strtoupper(substr($POST_MAX_SIZE, -1));
    361.     $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1)));
    362.  
    363.     if (intval($_SERVER['CONTENT_LENGTH']) > $multiplier * intval($POST_MAX_SIZE) && $POST_MAX_SIZE) {
    364.       self::HandleError("POST max size exided");
    365.       return false;
    366.     }
    367.  
    368.     // Settings
    369.     $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)
    370.     $upload_name = "files";
    371.     $max_file_size_in_bytes = 4294967295;    // 4GB in bytes - max FAT32 filesize
    372.     $extension_whitelist = array(); // Allowed file extensions
    373.     $valid_chars_regex = '.A-Z0-9_ !@#$%^&()+={}\[\]\',~`-';    // Characters allowed in the file name (in a Regular Expression format)
    374.     // Other variables
    375.     $MAX_FILENAME_LENGTH = 255;
    376.     $file_name = "";
    377.     $file_extension = "";
    378.     $uploadErrors = array(
    379.         0 => "There is no error, the file uploaded with success",
    380.         1 => "The uploaded file exceeds the upload_max_filesize directive in php.ini",
    381.         2 => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
    382.         3 => "The uploaded file was only partially uploaded",
    383.         4 => "No file was uploaded",
    384.         6 => "Missing a temporary folder"
    385.     );
    386.  
    387.  
    388.     // Validate the upload
    389.     if (!isset($_FILES[$upload_name])) {
    390.       self::HandleError("No upload found in \$_FILES for " . $upload_name);
    391.       return false;
    392.     } else if (isset($_FILES[$upload_name]["error"]) && $_FILES[$upload_name]["error"] != 0) {
    393.       self::HandleError($uploadErrors[$_FILES[$upload_name]["error"]]);
    394.       return false;
    395.     } else if (!isset($_FILES[$upload_name]["tmp_name"]) || !@is_uploaded_file($_FILES[$upload_name]["tmp_name"])) {
    396.       self::HandleError("Upload failed is_uploaded_file test.");
    397.       return false;
    398.     } else if (!isset($_FILES[$upload_name]['name'])) {
    399.       self::HandleError("File has no name.");
    400.       return false;
    401.     }
    402.  
    403.     // Validate the file size (Warning the largest files supported by this code is 2GB)
    404.     $file_size = @filesize($_FILES[$upload_name]["tmp_name"]);
    405.     if (!$file_size || $file_size > $max_file_size_in_bytes) {
    406.       self::HandleError("File exceeds the maximum allowed size");
    407.       return false;
    408.     }
    409.  
    410.     // Validate file name (for our purposes we'll just remove invalid characters)
    411.     $file_name = preg_replace('/[^' . $valid_chars_regex . ']|\.+$/i', "", basename($_FILES[$upload_name]['name']));
    412.     if (strlen($file_name) == 0 || strlen($file_name) > $MAX_FILENAME_LENGTH) {
    413.       self::HandleError("Invalid file name");
    414.       return false;
    415.     }
    416.     if (!empty($extension_whitelist)) {
    417.       // Validate file extention
    418.       $path_info = pathinfo($_FILES[$upload_name]['name']);
    419.       $file_extension = $path_info["extension"];
    420.       $is_valid_extension = false;
    421.       foreach ($extension_whitelist as $extension) {
    422.         if ($file_extension == $extension) {
    423.           $is_valid_extension = true;
    424.           break;
    425.         }
    426.       }
    427.       if (!$is_valid_extension) {
    428.         self::HandleError("Invalid file extension");
    429.         return false;
    430.       }
    431.     }
    432.  
    433.     //Файл прошел все проверки и должен быть прикреплен к работе.
    434.     $work = DB::firstrow("SELECT * FROM `works` WHERE `id` = $work AND `enabled` = 0");
    435.     if ($work === false) {
    436.       self::HandleError('No such work');
    437.       return false;
    438.     }
    439.     //проверить файл с таким именем на существование в данной работе.
    440.     //если нету - добавить.
    441.     //если есть - заменить.
    442.     $file = DB::firstrow("SELECT * FROM `files` WHERE `enabled` = 0 AND `work`={$work['id']} AND `name`='" . DB::escape($_FILES[$upload_name]['name']) . "'");
    443.  
    444.     $mime = self::ExtentionToMime(substr($_FILES[$upload_name]['name'], 1 + strrpos($_FILES[$upload_name]['name'], '.')));
    445.     $fileid = self::AddNew($work['order'], $work['id'], $_FILES[$upload_name]['name'], $_FILES[$upload_name]["tmp_name"], $mime);
    446.     if ($file) {
    447.       //обновляем - старый deleted, enabled = 1
    448.       Engine::logit("Обновляю файл №{$file['id']}, замещаю на №$fileid имя {$_FILES[$upload_name]['name']}");
    449.       DB::query("UPDATE `files` SET `enabled` = 1, `clientvisibility` = 0, `authorvisibility` = 0, `deleted` = NOW() WHERE `id` = {$file['id']}");
    450.       Updater::Work($work['id']);
    451.     }
    452.     
    453.     self::FileInfo($fileid);
    454.     return true;
    455.   }
    456.  
    457.   /* Handles the error output.  This function was written for SWFUpload for Flash Player 8 which
    458.     cannot return data to the server, so it just returns a 500 error. For Flash Player 9 you will
    459.     want to change this to return the server data you want to indicate an error and then use SWFUpload's
    460.     uploadSuccess to check the server_data for your error indicator. */
    461.  
    462.   private static function HandleError($message) {
    463.     //header("HTTP/1.1 500 Internal Server Error");
    464.     echo $message;
    465.   }
    466.  
    467.   //, File upload   </editor-fold>
    468.   ///////////////////////////////////////////////////////////////////////////////////////.
    469.   ////////////////////////////////////////////////////////////////////////////////////////
    470.   //
    471.   // <editor-fold defaultstate="collapsed" desc="Download in one archive">
    472.   public static function DownloadAllForWork($id) {
    473.     $id = intval($id);
    474.     // тут проверка на привилегии
    475.     $files = DB::assoc("SELECT * FROM `files` WHERE `deleted` IS NULL AND `enabled` = 0 AND `work` = $id");
    476.     if ($files === false) {
    477.       Site::Warning("Нет доступных файлов для данной работы.");
    478.     } else {
    479.       $zip = new ZipArchive;
    480.       $zipname = $_SERVER['DOCUMENT_ROOT'] . '/zips/' . self::randFolder() . uniqid() . '.zip'; //randFolder gives more safety (to me)
    481.       $zipopen = $zip->open($zipname, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
    482.       if ($zipopen !== true) {
    483.         Site::Error('Не удалось создать архив. Администрация извещена. Попробуйте повторить попытку позднее. Извините.');
    484.         echo 'КОД: ' . $zipopen;
    485.       } else {
    486.         foreach ($files as $file) {
    487.           $zip->addFile(self::GetPath($file['id']), iconv("UTF-8", "CP866", $file['name']));
    488.         }
    489.         $zip->close();
    490.         Site::Plain();
    491.         if (self::Download($zipname, $file['order'] . '-' . $file['work'] . '.zip')) {
    492.           //скачался
    493.         } else {
    494.           //хз что случилось
    495.         }
    496.       }
    497.     }
    498.   }
    499.  
    500.   public static function SendOrderFilesToClient($id) {
    501.     $id = intval($id);
    502.     // тут проверка на привилегии
    503.     $zipname = self::CreateZipForOrder($id);
    504.     if ($zipname === false) {
    505.       Site::Error('Невозможно создать файл к заказу №' . $id);
    506.     } else {
    507.       Site::Msg("Файлы заказа №$id отправлены клиенту.");
    508.     }
    509.   }
    510.  
    511.   public static function DownloadAllForOrder($id) {
    512.     $id = intval($id);
    513.     // тут проверка на привилегии
    514.     $zipname = self::CreateZipForOrder($id);
    515.     if ($zipname === false) {
    516.       Site::Error('Невозможно создать файл к заказу №' . $id);
    517.     } else {
    518.       Site::Plain();
    519.       if (self::Download($zipname, $id . '.zip')) {
    520.         //скачался
    521.       } else {
    522.         //хз что случилось
    523.       }
    524.     }
    525.   }
    526.  
    527.   private static function CreateZipForOrder($id) {
    528.     $id = intval($id);
    529.     // тут проверка на привилегии
    530.     $workfiles = DB::assoc_sorted("SELECT * FROM `files` WHERE `deleted` IS NULL AND `enabled` = 0 AND `order` = $id", 'work');
    531.     if ($workfiles === false) {
    532.       Site::Warning("Нет доступных файлов для данного заказа.");
    533.       return false;
    534.     } else {
    535.       $zip = new ZipArchive;
    536.       $zipname = $_SERVER['DOCUMENT_ROOT'] . '/zips/' . self::randFolder() . uniqid() . '.zip'; //randFolder gives more safety (to me)
    537.       $zipopen = $zip->open($zipname, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
    538.       if ($zipopen !== true) {
    539.         Site::Error('Не удалось создать архив. Администрация извещена. Попробуйте повторить попытку позднее. Извините.');
    540.         //echo 'КОД: ' . $zipopen;
    541.         return false;
    542.       } else {
    543.         foreach ($workfiles as $work => $files) {
    544.           $zip->addEmptyDir($work);
    545.           foreach ($files as $file) {
    546.             if (!$zip->addFile(self::GetPath($file['id']), $work . '/' . iconv("UTF-8", "CP866", $file['name']))) {
    547.               $zip->close();
    548.               unlink($zipname);
    549.               return false;
    550.             }
    551.           }
    552.         }
    553.         $zip->close();
    554.       }
    555.     }
    556.     return $zipname;
    557.   }
    558.  
    559.   public static function DownloadAllForPack($id) {
    560.     $id = intval($id);
    561.     // тут проверка на привилегии
    562.  
    563.     $workfiles = DB::assoc_sorted("SELECT * FROM `files` WHERE `work` IN (
    564.     SELECT `t1`.`work`
    565.     FROM `pack_works` AS `t1`, `packs` AS `t2`
    566.     WHERE `t1`.`pack` = `t2`.`id` AND `t2`.`id` = '{$id}' AND `t2`.`enabled` = '0'
    567.     )", 'work');
    568.  
    569.     if ($workfiles === false) {
    570.       Site::Warning("Нет доступных файлов для данного заказа.");
    571.     } else {
    572.       $zip = new ZipArchive;
    573.       $zipname = $_SERVER['DOCUMENT_ROOT'] . '/zips/' . self::randFolder() . uniqid() . '.zip'; //randFolder gives more safety (to me)
    574.       $zipopen = $zip->open($zipname, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
    575.       if ($zipopen !== true) {
    576.         Site::Error('Не удалось создать архив. Администрация извещена. Попробуйте повторить попытку позднее. Извините.');
    577.         echo 'КОД: ' . $zipopen;
    578.       } else {
    579.         foreach ($workfiles as $work => $files) {
    580.           $zip->addEmptyDir($work);
    581.           foreach ($files as $file) {
    582.             $zip->addFile(self::GetPath($file['id']), $work . '/' . iconv("UTF-8", "CP866", $file['name']));
    583.           }
    584.         }
    585.         $zip->close();
    586.         Site::Plain();
    587.         if (self::Download($zipname, $id . '.zip')) {
    588.           //скачался
    589.         } else {
    590.           //хз что случилось
    591.         }
    592.       }
    593.     }
    594.   }
    595.  
    596.   //, Download in one archive   </editor-fold>
    597.   ///////////////////////////////////////////////////////////////////////////////////////.
     
  12. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    а сколько урлов будет за один раз? если один, то в принципе у ТС все есть и все уже сказано.
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    урлов? по айдишнику файлы отдаются.
     
  14. marius

    marius Активный пользователь

    С нами с:
    3 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Я просто нашел готовый код и встроил в свой простой движок, который впринципе тоже собрал по чужому коду. Так что не особо силен в этом всём. =)

    А если допустим картинка отличается хотя бы одним пикселем, то мд5 уже будет другой? Извините за глупый вопрос.
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    будет другой. но в этом смысла никакого нет. зачем читать файл, когда тебе нужно просто уникальное случайное нечто.
    на вот тебе гарантированно униальное:

    $name = base_convert(time(), 10, 36).'-'.base_convert(rand(0,2000000000), 10, 36);
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    а в tmp_name разве не уникальное?
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не опасно ли его юзать? =)
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Говорят, что оно все-таки уникально только в пределах сессии.
     
  19. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Когда файл загружается на сервер, обычно помимо самого файла - также создаётся запись в базе данных, в которой есть информация о файле - название там, описание. Всякая инфа, короче. Обычно в таких случаях я сперва вставляю запись в базу, а потом сохраняю файл. В качестве названия файла - использую ID вставленной в базу записи.
     
  20. marius

    marius Активный пользователь

    С нами с:
    3 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    вот это мне пригодилось, теперь файлы записываются как mj2zjn-b3srhx.jpg. Я конечно не очень понимаю логики генерирование такого слова, почему первая часть это время, вторая случайная одинаковая на все присланные, и третья - счётчик. Ну да Бог с ним, когда нибудь пойму.
    И что значат цифры 10 и 36?
    Всем спасибо за помощь!
     
  21. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    конвертирование системы счисления. с этого как-бы начинают изучение программирования =)
     
  22. marius

    marius Активный пользователь

    С нами с:
    3 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Ну что же, буду учить. =)
     
  23. nixx

    nixx Активный пользователь

    С нами с:
    20 фев 2013
    Сообщения:
    132
    Симпатии:
    0
    В простом скрипте галерея сделал так:
    Код (Text):
    1. $fotodir='uploads';
    2. $filesdir = scandir($fotodir, 1);
    3. $files=count($filesdir);
    4.  $number=1000-$files;// Присвоение загружаемому файлу порядкового номера 1000,999,998 и тд или можно наоборот
    5. $fotoname=$number.'.'.$ext;
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Нет у меня там никакой логики. Одна параноя. =)
     
  25. marius

    marius Активный пользователь

    С нами с:
    3 мар 2013
    Сообщения:
    9
    Симпатии:
    0
    Это тоже себе запишу в снипиты=)