Всем привет! Хочу сделать страницу для загрузки файлов, при всем при этом хотелось бы чтобы файлы загружались в бд в которой, к примеру будут (fileID(счетчик), files (сам файл), data( дата), name (имя файла или путь к этому файлу)). Я так понимаю, что поле files должно быть типа BLOB, а какой должно быть поле name? с остальными полями мне вроде все ясно. Подскажите как должна осуществляться загрузка файла: какая форма должна быть и так далее? и как автоматически создается ссылка на файл и записывается в бд? Ведь загрузка в каталог и бд по разному осуществляется, так?
Код (Text): <html> <head> <title>Загрузка файлов на сервант</title> </head> <body> <h2><p><b> Форма для загрузки файлов </b></p></h2> <form action="dan.php" method="post" enctype="multipart/form-data"> <input type="file" name="filename"><br> <input type="submit" value="Загрузить"><br> </form> </body> </html> dan.php PHP: <html> <head> <title>Результат загрузки файла</title> </head> <body> <?php if($_FILES["filename"]["size"] > 1024*3*1024) { echo ("Размер файла превышает три мегабайта"); exit; } if(copy($_FILES["filename"]["tmp_name"], "d:/".$_FILES["filename"]["name"])) { echo("Файл успешно загружен <br>"); echo("Характеристики файла: <br>"); echo("Имя файла: "); echo($_FILES["filename"]["name"]); echo("<br>Размер файла: "); echo($_FILES["filename"]["size"]); echo("<br>Каталог для загрузки: "); echo($_FILES["filename"]["tmp_name"]); echo("<br>Тип файла: "); echo($_FILES["filename"]["type"]); } else { echo("Ошибка загрузки файла"); } ?> </body> </html> Осталось немного переделать и всё
Jensi, я чесно говоря и не могу переделать, как грузятся на сервер это я уже знаю, а вот в базу вообще не представляю как, поэтому и спрашивал. Может поможешь с переделанием?
Насколько я это себе представляю - грузишь вот таким способом файл, берешь его содержимое функцией file_get_contents, удаляешь файл, кодируешь полученный текст и заносишь в базу. Когда кто-то запрашивает файл на скачивание - берешь содержимое, раскодируешь и отправляешь файл на загрузку (http://www.php.ru/forum/viewtopic.php?t=9221).
T-Mon, не, должно быть не так, если весь файл должен находится в бд, то ни надо его содержимое кодировать, а просто нужно загрузить в бд. имхо А как это реализовать я не знаю, или я не так все это себе представляю?
Luge, я же писал, что хочу страницу с файлами для загрузок сделать, в бд мне кажется удобней будет работать с файлами, и ссылки автоматически добавляются и при удалении файла ссылка тоже исчезнет. А вообще не хочешь ни говори, может для тебя это ни довод, а для меня, раз я сюда обратился за помощью, довод.
Roman82, http://php.net/pack http://php.net/base64_encode Как отдавать файл на загрузку из буфера - расписывать не буду.
а мне кажется что хранение файлов в бд будет сильно сказываться на времени выполнения запроса.. максимум что можно пихать в базу - это аватары. имхо. а почему бы тебе не сделать в бд files: id url name coment а сами файлы просто на сервак скидывать?
Apple, спасибо, с английским у меня проблемы, поэтому буду изучать дольше чем нужно. vital, как минимум, чтобы в дальнейшем небыло проблем со всякими остатками от этих файлов.
Сейчас подумал, что для хранения данных можно использовать blob поля в MySQL. Вам останется только правильно передать необходимый формат в БД. В противном случае, если вы не разбираетесь в типах, см. выше. Мой выбор - поля blob, a вообще, я не храню файлов в БД
все, кто хоть чуток знаком со схемой работы типичного вебсервера, не хранят. Очередному новичку в стотысячный раз рассказывать уже никто заново не будет. Все есть в поиске по форуму.
Apple, про поля blob я в самом начале писал, у меня с передачей проблемы. флоппик, я читал несколько статей, и там у каждого свое мнение, кто-то хранит кто-то нет. Я вот и подумал, что лучше это самому попробовать и посмотреть как это. T-Mon, да уж какой выйдет.
Думаю, явно накладнее будет получать огромные объемы информации с диска через СУБД, нежели напрямую. По поводу английского не обижайся, просто молча учи, будет легче запоминать названия функций, читать документацию, участвовать в конференциях, легче будет выезжать за границу, а за границей хороших программистов чтят. Я не ради желчного слова.
Мнение у всех одно: файлы не надо хранить файлы в базе. Иное мнение имеют только дураки или люди банально писали о другом применение: работа с Google App (там bigtable заменяет файловую систему ваще), мелкие файлы и т.д. Не та вещь, с которой стоит эксперементировать. http://php.net - вот эта штука, её нужно читать и с ней экперементировать. Называется мануал.
lexa, А Я ТО ДУМАЛ КАК ЖЕ ЭТО НАЗЫВАЕТСЯ. (без обид, это шутка такая). Всем спасибо за советы и ответы. Буду пробовать.
какая нафиг разница? всёравно всё будет хранится на диске, а вот выбоорка будет тормознутее, т.к. сначала пхп соединится с базой, сделает запрос, та найдёт нужный файл-таблицу, загрузит его, обработает, и отдаст пхп результат в виде массива, и всё это в памяти
Ладно, если все так уверенны, что будет лучше если файл будет на сервере хранится, то буду делать закачку файла на сервер. НО теперь ради спортивного интереса, может кто-нибудь объяснить как закачиваются файлы в базу?
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
Kreker, а если файлы хранятся на сервере, то не получится так, что после удаления файла его ссылка остается? А если при этом будет много файлов записываться и удалятся, будет, наверно, много мусора. Или, перед тем как выложить ссылку, надо будет делать проверку на существование файла или типа того? Так?