Как создать сайт файлообменник


Делаем свой webfile / Хабр

Отчего-то всегда хотел сделать свой сервис для загрузки файлов. Всевозможные slil/zalil не устраивали своей скоростью. ifolder — обилием рекламы. Пользовался не очень популярным (от этого он ни чуть хуже не становился) сервисом up.spbland.ru. Но это как-то не правильно. И тут я решил написать свой сервис. Не буду вдаваться в подробности и рутину, только концепция.

Требования перед ресурсом:
— загрузка файлов методом POST не менее 100 мб, хотя почему бы и не 1000?
— обязательная визуализация процесса, т.е. upload progressbar
— возможность докачки файлов пользователями (во время скачивания)
— исключить возможность установки прямых ссылок на файлы на сторонних форумах, сайтах. Только через site.ru/ID

Сперва расскажу об upload progressbar:
Во время приема большого количества multipart/form-data информации apache складывает все в /tmp, а уже после окончания загрузки (т.е. при поступлении всего запроса на web сервер) передает управление к php, который в свою очередь делает move_uploaded_file. По своей природе php устроен так, что процесс А не может знать на какой стадии загрузки находится процесс Б. Именно для этого и придумали эксперементально расширение: uploadprogress. По мимо input type=«file», в форму необходимо добавить input type=«hidden» name=«UPLOAD_IDENTIFIER» value=«какое-то число», позже по этому идентификатору можно будет при помощи функции uploadprogress_get_info() отслеживать состояние загрузки: кол-во полученных байт, всего байт, скорость и другие параметры. В моем случае я через AJAX обращался с скрипту раз в секунду и получал актуальную информацию.

Поставленные задачи можно выполнить:
— плохо
— нормально
— круто, в масштабе всей планеты

Плохо — это значит принимать файлы и отдавать файлы через php. Чуть-чуть улучшить этот путь можно было бы заручившись поддержкой HTTP 206 Partial Content. Однако этот путь — путь латания дыр, не заслуживающий внимания.

Круто: отдачей файлов должен заниматься Apache, а лучше nginx. Во первых эти программы в полной мере поддерживаю спецификацию HTTP/1.1, во вторых Apache всегда будет работать быстрее, чем интерпретируемый php. В nginx для отдачи файлов реализован специальный механизм X-Accel-Redirect. Суть заключается в том, что nginx устанавливается в качестве прозрачного прокси сервера. Nginx обрабатывает, поступающий от пользователя, запрос к файлу site.ru/somefiles/123.mp3 и передает его на Apache&php. Далее либо средствами nginx, либо через mod_rewrite

RewriteRule ^/somefiles/(.*)$ /get.php?path=$1 [L]

запрос сводится к /get.php?path=123.mp3
В php анализируя ip адрес клиента, сессии и т.п. принимается решение о выдаче файла, либо об отказе. Далее php передает специальным образом сформированный заголовок:

header("X-Accel-Redirect: /files/123.mp3")

nginx перехватывает управление на себя и уже сам начинает отдавать файл своими средствами, делая это в миллион раз эффективнее чем apache. Однако у такого метода есть свой косяк: при загрузке файла на сервер nginx полностью получает весь запрос, и только потом передает его в apache. До тех пор, пока nginx полностью не получит весь файл, apache даже не будет знать, что происходит загрузка, что делает невозможным работу upload progress bar.

Вывод: загрузка файлов должная производится напрямую через apache, а отдача через nginx. В моем случае можно было бы повесить nginx (либо apache) на какой-нибудь другой порт. Но заставлять пользователей, напичканных файрволами, качать с порта отлично от 80 — не комильфо. По этому правильнее было бы повесить nginx на отдельный адрес, например download-0.site.ru (при такой концепции позже можно было бы добавить еще серверов). Но поскольку я не имел возможности использовать 2 адреса, от планетарного варианта файлового хостинга пришлось отказаться.

Однако я по прежнему хотел сохранить все поставленные ранее задачи выполненными.

Нормально. И тут на помощь мне пришел: Rewritemap

Соорудив конструкцию подобно этой:

Rewritemap ipmap txt:/home/anton/iplist.txt
RewriteCond ${ipmap:%{REMOTE_ADDR}} =allow
RewriteRule ^([0-9]+)/download/ /xfiles/$1 [L]
RewriteRule ^([0-9]+)/download/ /$1/ [L,R=302]
RewriteRule ^([0-9]+)/? /view.php?id=$1 [L]

я получил возможность переадресовывать ссылки вида site.ru/100200300/download/22.mp3 на файл /xfiles/100200300 (где реально расположен файл) в случае наличия ip адреса клиента в файл iplist.txt, либо происходила переадресация на страницу site.ru/100200300 с captcha, которая в случае правильного указания кода на картинке занесет ip клиента в файл iplist.txt и переадресует его вновь через Location на
site.ru/100200300/download/22.mp3, но в этот раз произойдет уже реальная отдача файла.

Файл iplist.txt имеет следующий формат:

77.1.1.1 allow # 1207100906

После решетки у меня указан timestamp, который сообщий специальному сервисному скрипту когда следует удалить эту строчку. Сервисный скрипт запускает раз в час через crontab.

В результате я получил достаточно правильную и надежную систему. Пожалуй ее недостатком является неэффективное расходование озу, т.к. каждый процесс apache (с mpm модулем prefork) может одновременно обслуживать только одного клиента, при этом сам процесс потребляет примерно 10 мб памяти. Если предположить, что с сервера начнет одновременно качать 1000 модемщиков в 10 потоков каждый, произойдет коллапс и должно не хватить памяти. Но от этого меня спасет директива из Httpd.conf MaxClients. С nginx такой проблемы быть в принципе не могло. В добавок nginx обладает неплохим функционалом по ограничению пользователей, например, по кол-ву одновременных подключений с одного адреса.

Пути улучшения до планетарного хостинга:
— переход на nginx в качестве frontend
— создание распределенной системы с сервером приема фалов в центе
— отказаться от хранения всех файлов в одной папке /xfiles/, создать еще 100 подпапок внутри xfiles основываясь на первых 2х символах.
— перейти на SAS диски, поскольку в масштабах сети интернет это не обмен единичными тяжелыми файлами, а постоянная загрузка сотен мелких файлов (музыки, фотографий)

Рабочая версия описанного: up.giga.su

P.S. Мой первый хабрапост

web - Как создать простой сайт для размещения файлов?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.

Как создать новый файл

При создании вашего веб-сайта вам часто необходимо создавать дополнительные файлы страниц. Это могут быть файлы отображения, такие как html или php, или текстовые файлы, используемые для справки или настройки. Хотя популярным методом является создание папки на локальном компьютере и загрузка файла в учетную запись хостинга, вы также можете использовать файловый менеджер или FTP-клиент, чтобы войти в учетную запись и создать файл непосредственно на сервере. Ниже приведены инструкции по простому созданию нового файла с помощью файлового менеджера cPanel, FTP-клиента Filezilla и редактора файлов NotePad ++.

Какой вариант выбрать?

Если вы новичок в создании веб-сайтов, возможно, на вашем компьютере нет программного обеспечения Filezilla или Notepad ++, поэтому вам может подойти cPanel. Использование cPanel File Manger не требует дополнительной загрузки или настройки, однако программное обеспечение FTP и Notepad ++ в целом лучше, поскольку вы получаете больше опыта и работаете с более чем одним файлом одновременно.

Использование файлового менеджера cPanel

  1. Войти в cPanel
  2. Нажмите кнопку «Диспетчер файлов», затем перейдите к папке, в которой вы хотите создать файл.
  3. Щелкните значок + File в верхнем левом углу панели инструментов.
  4. После щелчка по значку появится всплывающее окно, в котором можно указать имя файла. В нашем примере мы назовем файл test.html. После присвоения имени файлу нажмите кнопку Create New File .

Использование FTP-клиента Filezilla

  1. Откройте программу Filezilla FTP и подключитесь к своей учетной записи хостинга.
  2. Перейдите в нужную папку на правой панели.Если вы не уверены, в какой папке вам следует находиться, воспользуйтесь этой статьей, чтобы принять решение.
  3. Используя самую нижнюю правую панель, щелкните правой кнопкой мыши в любом месте пробела, и появится всплывающее меню. Выберите опцию Create New File .
  4. Появится всплывающее окно, в котором вам нужно будет назвать файл. После присвоения имени файлу нажмите кнопку OK , чтобы сохранить его на сервере.

Использование редактора файлов NotePad ++

  1. Откройте программу NotePad ++ на рабочем столе.
  2. Подключитесь к серверу с помощью функции FTP.
  3. Щелкните правой кнопкой мыши в пустом месте верхней панели FTP и выберите параметр Create New File .
  4. Вам будет предложено назвать файл во всплывающем окне. Назовите файл и нажмите кнопку OK , чтобы сохранить его.

Поздравляем! Вы только что создали новый файл! Очевидно, эти шаги создали только пустой файл. Вы можете ознакомиться с нашей статьей о том, как отредактировать файл, чтобы добавить контент на свой сайт.

. .

Как мне загрузить файл на мой сервер?

Есть несколько способов загрузить файл на ваш сервер на хостинге InMotion. Способ загрузки файлов будет зависеть от ваших предпочтений и вашей доступности на сервере. В этом руководстве мы объясним, как загрузить файл с помощью диспетчера файлов, FileZilla и Notepad ++. Мы предполагаем, что вы знаете, куда в своей учетной записи вам нужно загрузить файлы. Однако, если вы не уверены, прочтите нашу статью под названием «В какой каталог мне помещать файлы?».

В чем разница между каждым методом?

Есть причины, по которым разработчик мог бы использовать File Manager, FileZilla или Notepad ++. Ниже будет объяснено, почему вы выбрали тот или иной метод.

Файловый менеджер (на основе браузера): Файловый менеджер удобен для использования, когда вы находитесь вдали от компьютера и у вас есть доступ к браузеру. К файловому менеджеру можно получить доступ из любого места. Это избавляет от необходимости устанавливать такую ​​программу, как FileZilla или Notepad ++.

FileZilla (FTP): FileZilla хорошо использовать для загрузки файлов, потому что он работает через порт 21 и может загружать большое количество файлов одновременно.

Notepad ++ (редактор кода): Использование Notepad ++ - это способ загрузки файлов во время создания содержимого для них, notepad ++ похож на DreamWeaver в том, что вы можете редактировать файлы и загружать их через тот же интерфейс. Это избавляет от необходимости одновременно иметь редактор HTML и программу FTP.

Как загрузить файл через файловый менеджер

  1. Войдите в свою cPanel.Нажмите кнопку Диспетчер файлов в разделе Файлы .
  2. Перейдите в каталог , в который вы хотите загрузить файл, и щелкните ссылку Загрузить в верхней части файлового менеджера . Откроется страница загрузки в новой вкладке.
  3. Перетащите файл в окно или щелкните Select File , чтобы найти на компьютере файл, который вы хотите загрузить. Установите флажок «Доступно», если вы хотите перезаписать файлы, которые уже существуют в папке загрузки.
  4. Ваш файл будет загружен. По завершении загрузки вы увидите сообщение «100%».
  5. Щелкните ссылку Вернуться , чтобы вернуться в файловый менеджер .
  6. Обновите файловый менеджер , щелкнув ссылку Reload в верхней средней части файлового менеджера. Теперь вы должны увидеть файл, указанный в диспетчере файлов.

Как загрузить через FTP с помощью FileZilla

FileZilla может загружать файлы с вашего компьютера на ваш сервер вместе с нами.Левая сторона - это « Local Site », а правая - « Remote Site ». « Local Site » - это ваш компьютер, где находятся файлы. « Remote Site » - это расположение файлов на сервере. Ниже описано, как загрузить файл с помощью FileZilla.

  1. Подключитесь к вашему серверу с помощью FileZilla.
  2. Навигация по файлам в третьем окне слева под полем « Local Site: », где написано « Filename ».
  3. Окно справа от него - это каталог « Remote Site ». Перейдите к папке, в которую вы хотите загрузить файл / папку , в окне « Filename » под окном « Remote Site ».

    Перетащите файл, который нужно загрузить на сервер , с « Local Site » на « Remote Site ».

    Файл будет загружен, и вы увидите файл в списке файлов в каталоге, куда вы перетащили файл.

Использование такой программы, как Notepad ++

Notepad ++ - это программа, которая позволяет редактировать ваш сайт, а также загружать и создавать файлы на сервере. Он похож на программы-редакторы HTML, такие как Edit Plus или DreamWeaver . Ниже будет объяснено, как создать файл на вашем сервере с помощью Notepad ++.

  1. Подключитесь к серверу с помощью Notepad ++.
  2. В окне NppFTP в правой части Notepad ++ перейдите к папке , в которую вы хотите загрузить файл. Щелкните папку правой кнопкой мыши и выберите « Загрузить сюда другой файл». . . “.
  3. Найдите на сервере файл , который вы хотите загрузить. Выберите файл и нажмите «Открыть» .

    Теперь вы увидите файл в папке на сервере.

Чтобы увидеть другие статьи о том, как управлять своими файлами, перейдите на страницу Как управлять файлами на сервере ?.

Чтобы узнать, как редактировать файл, см. Нашу статью Как мне редактировать файл на моем сервере ?.

.

Смотрите также

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Одноклассники
Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий