@gomer1726

Как загрузить сразу все изображения в одно поле в БД?

Чтобы поставить
<input type="file" name="images[]" multiple="true">

И собрать все и впихнуть в одно поле чтобы затем возможно было через explode вытащить.
Я пока думаю вот так собрать весь массив дать имя каждому файлу загрузить на сервер а имя через implode загрузить в одно поле.
Но реализовать все это пока что трудновато что предложите?
  • Вопрос задан
  • 271 просмотр
Пригласить эксперта
Ответы на вопрос 3
S4urp8n
@S4urp8n
WEB-разработчик
1) Вы хотите писать в базу содержимое файлов - Я нерекомендую писать файлы в базу данных, так как это дополнительные расходы (тем более в одно поле). Если это прямо-таки необходимо сделать, то создаете поле типа LONGTEXT, и туда пишете содержимое. (Возможно его надо будет обработать BASE64 функциями и через запятую писать)

2) Вы хотите просто сохранить в базу названия файлов - Тогда я думаю JSON самое-то, тоже LONGTEXT поле, (если Ваш сервер MySQL поддерживает тип поля JSON - то его и следует использовать, https://dev.mysql.com/doc/refman/5.7/en/json.html ).
Из базы/в базу пишете используя json_decode/json_encode, php.net/manual/ru/function.json-decode.php
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
Вы пытаетесь отстрелить себе яйца, причем разрывными патронами((

1. explode - для работы с "прогнозируемыми" строками вполне норм, у вас же файлы, могут быть вообще бинарные, например картинки. В случае попадания на delimiter посреди файла - получите кучу мусора. "explode" в смысле "взрыв" - это очень подходящее слово.

2. В БД хранить файлы - не хорошо, вы будете ушатывать БД просто так. Самое интересное - как вы бэкапы планируете делать)) Объемы будут расти очень быстро.

3. Вариант со строкой еще плох тем, что помимо содержания вам нужно будет где-то хранить и мета информацию о файле: MIME тип, название (хотя бы расширение).

4. Отдача файлов, вот тут тоже веселье: допустим получив мега строку вы разделите ее на куски и вытащите таки свой заветный файл, потом будете отдавать его через echo, это будет на порядок дольше, чем через web сервер на прямую.

5. Память на php: что будет, если ваша мега строка занимает 500мб? PHP с настройками по умолчанию сдохнет, даже не дочитав его.

В общем: для хранения файлов используйте БД специально спроектированную для хранения файлов. Это файловая система. Если очень хочется шардирования для снижения нагрузки - можете посмотреть в сторону решений на базе mogilefs.
В MySQL при этом стоит хранить только нужную дополнительную информацию о файле, например: путь, md5, некий идентификатор,...
Сам файл лучше при сохранении приводить к такому виду:
1. Берем md5 хэш от файла md5_file, допустим он у нас получился 01230000000000000000000000000000
2. Перемещаем его в каталог: {UPLOAD_ROOT}/01/23/0000000000000000000000000000. Тут смысл в том, что при большом количестве файлов в одном каталоге будут проблемы с файловой системой по части производительности. В принципе можно оставить оригинальное расширение, тогда шаг 4 не нужен.
3. В БД храним md5 хэш, путь к файлу и MIME-тип, можно еще и оригинальное имя.
4. При запросе на вашу страницу - отдаем через x-accel-redirect, или x-sendfile
Ответ написан
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
Может стоит просто при выборе файла ajax-ом сохранять в во временную папку. Потом при отправке переименовывать ее в id поста например и вообще в базе не хранить. И не нужен explode, нужно только прочитать содержимое папки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы