Управление файлами

ArbNet
На сайте с 27.10.2019
Offline
140
405

Как я обычно делал?

Создавал директорию для пользовательских файлов и таблицу в базе данных с полями: id, user, type, name

При загрузки файла добавлял в базу строку 

id - автоматический инкремент,

user - логин пользователя добавившего файл,

type - расширение файла,

name - оригинальное наименование файла

А сам файл сохранялся в директории пользовательских файлов под id без расширения для безопасности.

Раньше использовал обычно только MySql, сейчас столкнулся с тем, что пользователь может использовать другие базы данных, то есть для управления файлами нужно будет под каждую писать некий класс для работы с пользовательскими файлами. Или может это оставить на усмотрение самого пользователя пусть он сам пишет как ему нужно.

Но опять же, я делаю инструмент чтобы пользователи не умеющие программировать легко создавали разные сайты и не тратили время на изобретение своего подхода управления пользовательских файлов.

А как вы делаете управление файлами?

E
На сайте с 01.10.2017
Offline
115
#1
ArbNet :
я делаю инструмент чтобы пользователи не умеющие программировать легко создавали разные сайты

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

ArbNet :
А как вы делаете управление файлами?

Слишком абстрактный вопрос. Давайте конкретнее.

Домены на продажу: https://p20.ru/collection/domains-for-sale
E
На сайте с 01.10.2017
Offline
115
#2
ArbNet :
А сам файл сохранялся в директории пользовательских файлов под id без расширения для безопасности.

Да, переименование - это в общем случае хорошо, чтобы минимизировать в именах кириллицу и т.п., но полагаться только на id, особенно если они числовые, все-таки плохо.

А как без расширения будет определяться Content-Type? Или вы свой файловый сервер написали, который "подтягивает" метаданные из базы данных? 😃 Проще запретить чему-либо выполняться там, где хранятся загружаемые файлы.

ArbNet
На сайте с 27.10.2019
Offline
140
#3
estic #:
А как без расширения будет определяться Content-Type? Или вы свой файловый сервер написали, который "подтягивает" метаданные из базы данных?

Все запросы у меня обрабатываются через роутер - который передаёт управление в зависимости от расширения. Без расширения передаётся движку на генерацию страницы. Какие то файлы могут на прямую отдаваться CSS, JS, картинки например, какие то генерироваться, те же картинки для изменения размера, капча , json по API и тд. Ну и пользовательские тоже, получить оригинальное имя и расширение файла из базы, в хедер кинуть нужные заголовки и отдать сам файл. Вот и всё.

ЗЫ. Пока я ещё не реализовал управление файлами, рассматриваю ещё варианты.

ArbNet
На сайте с 27.10.2019
Offline
140
#4
estic #:
Слишком абстрактный вопрос. Давайте конкретнее.

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

ЗЫ. Может для каждого пользователя делать поддиректорию? По моему не особо хорошая идея..

E
На сайте с 01.10.2017
Offline
115
#5
ArbNet #:
Все запросы у меня обрабатываются через роутер - который передаёт управление в зависимости от расширения.

Это медленно. Даже если использовать обратный прокси с короткими ответами (без содержимого) от фонового обработчика, все равно сложно получается. Можно кэшировать в файловой системе под теми же "адресами", чтобы Web-сервер сам выводил кэш.


ArbNet #:
Может для каждого пользователя делать поддиректорию?

Может. В некоторых системах я использую такой подход. Имя каталога как раз совпадает с идентификатором пользователя.

Все зависит от конкретной системы. Что у вас, я так и не понял.

ArbNet
На сайте с 27.10.2019
Offline
140
#6
estic #:
Это медленно

Это вам так кажется. Всё очень быстро работает, к тому же гибкость, при необходимости можно подправить и настроить под определённую задачу. Есть возможность отдавать файлы как напрямую так и с изменениями.

S3
На сайте с 29.03.2012
Offline
349
#7
ArbNet :
Раньше использовал обычно только MySql, сейчас столкнулся с тем, что пользователь может использовать другие базы данных, то есть для управления файлами нужно будет под каждую писать некий класс для работы с пользовательскими файлами. Или может это оставить на усмотрение самого пользователя пусть он сам пишет как ему нужно.

Интересно, какие это ты собираешься использовать БД, что тебе нужно отдельные классы писать?)))
Проблема в том что у тебя нет разделения логики и ты не очень понимаешь вообще что это такое. Советовать почитать "Основы алгоритмов " не стану, бесполезно. Помню, спрашивал я у тебя сто такое СОЛИД, ответа ты не знал тогда и не знаешь сейчас, раз не можешь решить такую задачу. 

Во-первых, связь с БД должна выть вынесена в адаптер, тогда не придется переписывать все под каждый тип. Нормальные люди используют ОРМ, но это не твой путь. А для получения файлов - отдельный класс, реализация которого не зависит от типа бд.

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

И про какие файлы ты говоришь, которые пользователь должен загружать?

Александр Воробьев
На сайте с 03.02.2020
Offline
47
#8
ArbNet :
Раньше использовал обычно только MySql, сейчас столкнулся с тем, что пользователь может использовать другие базы данных, то есть для управления файлами нужно будет под каждую писать некий класс для работы с пользовательскими файлами

Это не правильный подход. При этом есть рабочее и хорошее решение, которое применяется в подобных ситуациях. Посмотрите на ОС - там же с испокон веков есть понятие драйвера. Так же и здесь - при грамотном подходе классу работающему с файлами должно быть пофиг как хранится информация. Вы же изучали другие решение - там это реализовано сплошь и рядом.

ArbNet :
сам файл сохранялся в директории пользовательских файлов под id без расширения для безопасности.

В целом правильное направление. Но я в подобных ситуациях сторонник применения UUID (некоторые СУБД, кстати, даже тип поля для этого имеют специальный). При этом подбираю версию UUID подходящую конкретике задачи. Это позволяет например, в случае построение некой распределенной системы обеспечить уникальность. 

Про директории. Как то мне встречалось исследование, если в одной директории накапливается много файлов то файлы отдаются дольше чем из директории с малым количеством файлов  при прочих равных условиях. Деталей уже не помню - какая то особенность файловой системы. По этому применяют так же дополнительный подход для разбиения по более мелким каталогам. Например берется хеш от имени файла и первые 3-4 символа хеша берутся в качестве имени поддиректории.

ArbNet #:
Это вам так кажется. Всё очень быстро работает, к тому же гибкость, при необходимости можно подправить и настроить под определённую задачу. Есть возможность отдавать файлы как напрямую так и с изменениями

Нет это реалии. Вот как раз у меня недавно был пик нагрузки по одному проекту, по данным статистики хостинга 2500rps было в пике.  Мы каждый год ведем подготовку к этому пику и гоняем 100500 тестов, проверяя 100500 гипотез.  Уверяю вас, что ваше решение будет гарантировано ложиться только из-за такого хранения, даже при значительно меньшем rps. js, css - хранить в таком "формате" это бесполезная трата ресурсов. Т.е. хранить так файлы разумно только в тех случаях, когда есть необходимость ограничивать доступ к файлам.

Но, на сайтах с низкой посещаемостью, позволительно.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий