Автор Тема: Закачка файла. Присвоить рандомное имя а затем переименовать.  (Прочитано 6562 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DJ Fat

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 158
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.mixgalaxy.ru/
Помогите пожалуйста модифицировать вот этот кусок скрипта. Программа закачивает файл, присваивает ему имя из файла composition.num (после каждой закачки число, которое хранится в этом файле увеличивается на единицу). Потом заносит информацию в БД. В общем, вам, программистам наверное виднее что и как:


$compositions_directory 
"/home/ejayru90/public_html/mixgalaxy/fruityloops/download/loops/";
$counter_fname="composition.num";
//-->

$pafiledb_sql->connect($db);
$config $pafiledb_sql->query($db,"SELECT * FROM $db[prefix]_settings",1);

if(
$submit) {

if(
$_FILES[\'userfile\'][\'type\']=="application/x-zip-compressed") {

        if($_FILES[\'userfile\'][\'size\'] < 819200) {

                if(is_uploaded_file($_FILES[\'userfile\'][\'tmp_name\'])) {  // Если файл был загружен

                $num=0;

                        if (file_exists($counter_fname)){ // Если файл существует

                                $f=fopen($counter_fname,"r");

                                $num=fread($f,filesize($counter_fname));

                                fclose($f);

                }

                        $num++;

                        $fh=fopen($counter_fname,"w+");

                        fputs($fh,$num);

                        fflush($fh);

                        fclose($fh);

                if (move_uploaded_file($_FILES[\'userfile\'][\'tmp_name\'], $compositions_directory.sprintf("c%04d.zip", $num))) {

                        echo "<meta http-equiv=\\"refresh\\" content=\\"0; URL=http://www.mixgalaxy.ru/fruityloops/loops_ok.shtml\\">";

                        chmod($compositions_directory.sprintf("c%04d.zip", $num),0777);
                        $filesize = round (($_FILES[\'userfile\'][\'size\'] / 1024), 0);

	
  $dlurl = "http://www.mixgalaxy.ru/fruityloops/download/loops/".sprintf("c%04d.zip", $num)."";

	
  $time = time();

$mail_id = sprintf("%04d", $num);

$note = stripslashes($note);

$pafiledb_sql->query($db, "INSERT INTO $db[prefix]_files VALUES(\'NULL\', \'$composition_name\', \'$email\', \'$name\', \'$composition_version\', \'\', \'\', \'\', \'$dlurl\', \'$time\', \'$cat_id\', \'default.gif\', \'0\', \'0\', \'0\', \'0\', \'\', \'0\', \'1\', \'$filesize\', \'$mail_id\', \'$note\', \'$composition_synthesizers_data\')", 0);


Мне нужно чтобы в этом скрипте загружаемому файлу присваивалось рандомное имя, а затем после добавления информации в БД этот файл с рандомным именем был переименован по какому-то заданному шаблону (по какому это я уже придумаю сам).
C уважением, DJ Fat
MixGalaxy.ru - Форумы MixGalaxy.ru - Всё о FruityLoops - eJay.ru[

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
все всегда сначала добавляют запись в базу получают ид и копируют сразу с новым именем

при ошибке строчку из базы стереть недолго

или ты вообще не понимаешь что этот код делает?

Оффлайн FreeSpace

  • Штатный лодырь
  • Ветеран
  • *****
  • Сообщений: 613
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.infinity.com.ua
Попробую себя в роли телепата: Если тебе нужно просто запретить скачивать файлы напрямую, а не через твой скрипт, то директорию с файлами надо вынести из корневой директории твоего сайта.
Если этого сделать нельзя, то можно просто положить в директорию с файлами файл .htacces всего с одной строчкой:
deny from all
Таким образом, доступ браузеру в эту директорию будет закрыт, а php сможет открывать и читать файлы из этой директории как обычно.
Программирование - это единственное искусство, которое способно воплотить столь уникальное сочетание эстетики и функциональности.

Оффлайн DJ Fat

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 158
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.mixgalaxy.ru/
RomikChef
Ты прав. Действительно лучше сначала занести а потом закачивать. Это немного меняет задачу. Тогда мне нужно немного другое - после занесения в базу инфы о файле присвоить файлу сразу не рандомное имя, а имя состоящее из cXXXX.zip, где XXXX - значение поля file_id в базе, куда мы перед закачкой заносили инфу. Пробовал так сделать, но ничего не получается :(
Значит тут я присваиваю в $num значение file_id у последней записи и добавляю 1:
$num[id] = $pafiledb_sql->query($db"SELECT file_id FROM $db[prefix]_files ORDER BY file_id DESC"2);
                
$num[id]++;

Но лезут ошибки:(
Вот. И насколько я понял добавлять в базу инфу (INSERT INTO) надо сразу после оператора if $submit {? Только если так сделать будет проблема - если файл не пройдет проверку на размер и формат то строка в базе останется, а файл не закачается :(
C уважением, DJ Fat
MixGalaxy.ru - Форумы MixGalaxy.ru - Всё о FruityLoops - eJay.ru[

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
бред какой
mysql_insert_id()

Оффлайн DJ Fat

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 158
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.mixgalaxy.ru/
RomikChef
Спасибо, на первый вопрос ты ответил а на второй нет :(
Про то где выполнять операцию INSERT INTO
C уважением, DJ Fat
MixGalaxy.ru - Форумы MixGalaxy.ru - Всё о FruityLoops - eJay.ru[

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
не понял - где был этот вопрос?
я его не видел.
а делать - где угодно между местом, где есть все данные для занесения и местом, где файл копируется

Оффлайн DJ Fat

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 158
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.mixgalaxy.ru/
RomikChef
Мне надо занести в базу ДО ТОГО как файл закачается. Покажи пожалуйста где в этом скрипте (какой строчкой) идет ЗАКАЧКА файла на сервер? Я её не вижу.
C уважением, DJ Fat
MixGalaxy.ru - Форумы MixGalaxy.ru - Всё о FruityLoops - eJay.ru[

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
я думаю, здесь.
if  (move_uploaded_file($_FILES[\'userfile\'][\'tmp_name\'
], $compositions_directory.sprintf("c%04d.zip", $num))) {

Оффлайн DJ Fat

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 158
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.mixgalaxy.ru/
А если у человека который закачивает файл оборвётся связь и файл не закачается, то что тогда делать?

Запись в базе будет, а файла - нет.

Как?:

1) Проверить закачался файл или нет
2) Если нет, то как удалить запись которую только что добавили
C уважением, DJ Fat
MixGalaxy.ru - Форумы MixGalaxy.ru - Всё о FruityLoops - eJay.ru[

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
не будет
все уже проверено до нас

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
только не спрашивай - где.
почитай http://faq.phpclub.net/upload
и постарайся составить хотя бы приблизительное представление о том, как работает твой код.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
кстати, вся эта тень не нужна
Цитировать
DJ Fat:
      $num=0;
             if (file_exists($counter_fname)){ // Если файл существует
                       $f=fopen($counter_fname,"r");
                        $num=fread($f,filesize($counter_fname));
                         fclose($f);
              }
                $num++;
               $fh=fopen($counter_fname,"w+");
                fputs($fh,$num);
                 fflush($fh);
                        fclose($fh);

$num ты берешь из базы

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28