Forum Webscript.Ru

Программирование => PHP => Тема начата: DJ Fat от 07 Февраля 2004, 00:38:29

Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: DJ Fat от 07 Февраля 2004, 00:38:29
Помогите пожалуйста модифицировать вот этот кусок скрипта. Программа закачивает файл, присваивает ему имя из файла 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 "";

                        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);


Мне нужно чтобы в этом скрипте загружаемому файлу присваивалось рандомное имя, а затем после добавления информации в БД этот файл с рандомным именем был переименован по какому-то заданному шаблону (по какому это я уже придумаю сам).
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: Меняздесьдавнонет от 07 Февраля 2004, 00:59:24
все всегда сначала добавляют запись в базу получают ид и копируют сразу с новым именем

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

или ты вообще не понимаешь что этот код делает?
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: FreeSpace от 07 Февраля 2004, 01:18:52
Попробую себя в роли телепата: Если тебе нужно просто запретить скачивать файлы напрямую, а не через твой скрипт, то директорию с файлами надо вынести из корневой директории твоего сайта.
Если этого сделать нельзя, то можно просто положить в директорию с файлами файл .htacces всего с одной строчкой:
deny from all
Таким образом, доступ браузеру в эту директорию будет закрыт, а php сможет открывать и читать файлы из этой директории как обычно.
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: DJ Fat от 07 Февраля 2004, 21:58:24
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 {? Только если так сделать будет проблема - если файл не пройдет проверку на размер и формат то строка в базе останется, а файл не закачается :(
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: Меняздесьдавнонет от 07 Февраля 2004, 22:22:34
бред какой
mysql_insert_id()
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: DJ Fat от 07 Февраля 2004, 22:43:20
RomikChef
Спасибо, на первый вопрос ты ответил а на второй нет :(
Про то где выполнять операцию INSERT INTO
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: Меняздесьдавнонет от 07 Февраля 2004, 22:52:38
не понял - где был этот вопрос?
я его не видел.
а делать - где угодно между местом, где есть все данные для занесения и местом, где файл копируется
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: DJ Fat от 07 Февраля 2004, 22:55:33
RomikChef
Мне надо занести в базу ДО ТОГО как файл закачается. Покажи пожалуйста где в этом скрипте (какой строчкой) идет ЗАКАЧКА файла на сервер? Я её не вижу.
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: Меняздесьдавнонет от 07 Февраля 2004, 23:07:27
я думаю, здесь.
if  (move_uploaded_file($_FILES[\'userfile\'][\'tmp_name\'
], $compositions_directory.sprintf("c%04d.zip", $num))) {
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: DJ Fat от 07 Февраля 2004, 23:10:56
А если у человека который закачивает файл оборвётся связь и файл не закачается, то что тогда делать?

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

Как?:

1) Проверить закачался файл или нет
2) Если нет, то как удалить запись которую только что добавили
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: Меняздесьдавнонет от 07 Февраля 2004, 23:18:06
не будет
все уже проверено до нас
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: Меняздесьдавнонет от 07 Февраля 2004, 23:22:05
только не спрашивай - где.
почитай http://faq.phpclub.net/upload
и постарайся составить хотя бы приблизительное представление о том, как работает твой код.
Название: Закачка файла. Присвоить рандомное имя а затем переименовать.
Отправлено: Меняздесьдавнонет от 07 Февраля 2004, 23:24:29
кстати, вся эта тень не нужна
Цитировать
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 ты берешь из базы