За последние 24 часа нас посетили 34074 программиста и 1746 роботов. Сейчас ищут 1128 программистов ...

Загрузка файла в базу

Тема в разделе "PHP для новичков", создана пользователем Roman82, 4 май 2009.

  1. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    Всем привет!
    Хочу сделать страницу для загрузки файлов, при всем при этом хотелось бы чтобы файлы загружались в бд в которой, к примеру будут (fileID(счетчик), files (сам файл), data( дата), name (имя файла или путь к этому файлу)).
    Я так понимаю, что поле files должно быть типа BLOB, а какой должно быть поле name? с остальными полями мне вроде все ясно.
    Подскажите как должна осуществляться загрузка файла: какая форма должна быть и так далее? и как автоматически создается ссылка на файл и записывается в бд?
    Ведь загрузка в каталог и бд по разному осуществляется, так?
     
  2. Jensi

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

    С нами с:
    9 апр 2009
    Сообщения:
    299
    Симпатии:
    0
    Код (Text):
    1. <html>
    2. <head>
    3.   <title>Загрузка файлов на сервант</title>
    4. </head>
    5. <body>
    6.       <h2><p><b> Форма для загрузки файлов </b></p></h2>
    7.       <form action="dan.php" method="post" enctype="multipart/form-data">
    8.       <input type="file" name="filename"><br>
    9.       <input type="submit" value="Загрузить"><br>
    10.       </form>
    11. </body>
    12. </html>
    dan.php
    PHP:
    1. <html>
    2. <head>
    3.   <title>Результат загрузки файла</title>
    4. </head>
    5. <body>
    6.  
    7. <?php
    8.  
    9.    if($_FILES["filename"]["size"] > 1024*3*1024)
    10.    {
    11.      echo ("Размер файла превышает три мегабайта");
    12.      exit;
    13.    }
    14.    if(copy($_FILES["filename"]["tmp_name"],
    15.      "d:/".$_FILES["filename"]["name"]))
    16.    {
    17.      echo("Файл успешно загружен <br>");
    18.      echo("Характеристики файла: <br>");
    19.      echo("Имя файла: ");
    20.      echo($_FILES["filename"]["name"]);
    21.      echo("<br>Размер файла: ");
    22.      echo($_FILES["filename"]["size"]);
    23.      echo("<br>Каталог для загрузки: ");
    24.      echo($_FILES["filename"]["tmp_name"]);
    25.      echo("<br>Тип файла: ");
    26.      echo($_FILES["filename"]["type"]);
    27.    } else {
    28.       echo("Ошибка загрузки файла");
    29.    }
    30. ?>
    31. </body>
    32. </html>
    33.  
    Осталось немного переделать и всё:)
     
  3. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    Jensi, я чесно говоря и не могу переделать, как грузятся на сервер это я уже знаю, а вот в базу вообще не представляю как, поэтому и спрашивал. Может поможешь с переделанием?
     
  4. T-Mon

    T-Mon Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    67
    Симпатии:
    0
    Адрес:
    Kyiv
    Насколько я это себе представляю - грузишь вот таким способом файл, берешь его содержимое функцией file_get_contents, удаляешь файл, кодируешь полученный текст и заносишь в базу. Когда кто-то запрашивает файл на скачивание - берешь содержимое, раскодируешь и отправляешь файл на загрузку (http://www.php.ru/forum/viewtopic.php?t=9221).
     
  5. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    T-Mon, не, должно быть не так, если весь файл должен находится в бд, то ни надо его содержимое кодировать, а просто нужно загрузить в бд. имхо
    А как это реализовать я не знаю, или я не так все это себе представляю?
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Roman82
    Приведёшь нормальный довод, почему так хочется файлы в базе хранить — может расскажу как
     
  7. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    Luge, я же писал, что хочу страницу с файлами для загрузок сделать, в бд мне кажется удобней будет работать с файлами, и ссылки автоматически добавляются и при удалении файла ссылка тоже исчезнет.
    А вообще не хочешь ни говори, может для тебя это ни довод, а для меня, раз я сюда обратился за помощью, довод.
     
  8. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
  9. vital

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

    С нами с:
    18 дек 2006
    Сообщения:
    162
    Симпатии:
    0
    Адрес:
    Минск
    а мне кажется что хранение файлов в бд будет сильно сказываться на времени выполнения запроса.. максимум что можно пихать в базу - это аватары. имхо.

    а почему бы тебе не сделать в бд
    files:
    id
    url
    name
    coment
    а сами файлы просто на сервак скидывать?
     
  10. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    Apple, спасибо, с английским у меня проблемы, поэтому буду изучать дольше чем нужно.
    vital, как минимум, чтобы в дальнейшем небыло проблем со всякими остатками от этих файлов.
     
  11. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Сейчас подумал, что для хранения данных можно использовать blob поля в MySQL.
    Вам останется только правильно передать необходимый формат в БД.
    В противном случае, если вы не разбираетесь в типах, см. выше.
    Мой выбор - поля blob, a вообще, я не храню файлов в БД :)
     
  12. все, кто хоть чуток знаком со схемой работы типичного вебсервера, не хранят. Очередному новичку в стотысячный раз рассказывать уже никто заново не будет. Все есть в поиске по форуму.
     
  13. T-Mon

    T-Mon Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    67
    Симпатии:
    0
    Адрес:
    Kyiv
    Хреновый из тебя выйдет программист...
     
  14. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    Apple, про поля blob я в самом начале писал, у меня с передачей проблемы.
    флоппик, я читал несколько статей, и там у каждого свое мнение, кто-то хранит кто-то нет. Я вот и подумал, что лучше это самому попробовать и посмотреть как это.
    T-Mon, да уж какой выйдет.
     
  15. T-Mon

    T-Mon Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    67
    Симпатии:
    0
    Адрес:
    Kyiv
    Думаю, явно накладнее будет получать огромные объемы информации с диска через СУБД, нежели напрямую.

    По поводу английского не обижайся, просто молча учи, будет легче запоминать названия функций, читать документацию, участвовать в конференциях, легче будет выезжать за границу, а за границей хороших программистов чтят. Я не ради желчного слова.
     
  16. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    T-Mon, спасибо, учту!
     
  17. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Мнение у всех одно: файлы не надо хранить файлы в базе. Иное мнение имеют только дураки или люди банально писали о другом применение: работа с Google App (там bigtable заменяет файловую систему ваще), мелкие файлы и т.д.

    Не та вещь, с которой стоит эксперементировать. http://php.net - вот эта штука, её нужно читать и с ней экперементировать. Называется мануал.
     
  18. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    lexa, А Я ТО ДУМАЛ КАК ЖЕ ЭТО НАЗЫВАЕТСЯ. :D (без обид, это шутка такая).
    Всем спасибо за советы и ответы. Буду пробовать.
     
  19. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    какая нафиг разница? всёравно всё будет хранится на диске, а вот выбоорка будет тормознутее, т.к. сначала пхп соединится с базой, сделает запрос, та найдёт нужный файл-таблицу, загрузит его, обработает, и отдаст пхп результат в виде массива, и всё это в памяти
     
  20. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    Ладно, если все так уверенны, что будет лучше если файл будет на сервере хранится, то буду делать закачку файла на сервер.
    НО теперь ради спортивного интереса, может кто-нибудь объяснить как закачиваются файлы в базу?
     
  21. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Roman82
    На самом деле, если поверхностно изучить принцип работы СУБД, то Вам станет смешно над тем, что Вы пытались сделать.

    База данных -- это набор текстовых файлов (или бинарных). Один файл на ключ, второй -- на данные.
    А теперь представьте, Вы закачиваете файл на сервер, потом его читаете, отправляете к СУБД, та его снова записывает в файл.
    Если файл хранить в файловой системе, то апач просто будет отдавать файл клиенту, читая его с диска.
    Если файл хранить в БД, то PHP будет обращаться к MySQL, запрашивая текст файла, та ему будет его пересылать, а PHP через апач будет отдавать файл клиенту.
    Какие неприятности это может за собой повлечь:
    1) Время выполнения скриптов возрастет в разы (на хостингах забанят, если файлы большие)
    2) Количество одновременно исполняемых скриптов на хостингах ограничено.
    3) Количество коннектов к БД на хостингах ограничено

    Ну если у Вас есть свой сервер -- ставьте, только помните, что данных "внутри" веб-сервера из-за этого шуровать будет больше, а следовательно нагрузка на сервер будет гораздо выше.


    $file = file_get_contents("loadfile.jpg");
    mysql_query('INSERT INTO `images` (NULL, "'.mysql_real_escape_string($file).'")')

    Но длина запроса, вроде бы, ограничена, да и размер исполняемого РНР-файла слишком увеличится. Лучше использовать прямую загрузку:
    mysq_query('LOAD DATA INFILE "'.$loadfilename.'" INTO `images` (`imagetxt`))

    imagetxt должна быть LONGBLOB
     
  22. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    Kreker, а если файлы хранятся на сервере, то не получится так, что после удаления файла его ссылка остается?
    А если при этом будет много файлов записываться и удалятся, будет, наверно, много мусора.
    Или, перед тем как выложить ссылку, надо будет делать проверку на существование файла или типа того?
    Так?
     
  23. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Блин, туго идёт. Сам же задаёшь вопрос и тут же на него отвечаешь.
     
  24. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    Hight, :), сам уже, после того как написал, понял.
    Тогда как сделать такую проверку?
     
  25. Cron

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

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы