К примеру, есть форма с текстовым полем и загрузкой файла. Какой вариант наиболее оптимальный для загрузки и сохранения файла?.
Для загрузки исполью multer, но проблема в том, что я не могу получить доступ к req.body не загрузив файл. В этом и проблема, например, мне нужно проверить корректность полученных данных, проверить это поле на уникальность и только потом загрузить файл. Сейчас же, приходится загрузить файл, потом все проверить, а если проверка не пройдена, то файл удалять.
Можно еще загружать файлы в temp папку, а потом, при успешном сохранении данных в базу - переносить файл в основную, но суть не меняется, все равно приходится сохранить->проверить->удалить/перенести
Вы знаете... очевидно, что для каждой задачи нужно свое решение. Я пользую сервер для двига, для хранения файлов - Amazon S3, который сам на лету проверяет целостность загружаемого файла, и если ему что-то не понравится - он просто не даст на него прямую ссылку в результате загрузки. По месту и трафику выходят копейки, даже если файлов несколько Тб. Потому-что будем честны, хостинг (или свой сервер, не важно что) не предназначен для хранилища файлов, это просто сервер для запуска виртуальной машины (если у Вас не хостинг за 20 рублей в месяц, конечно), для всего свои инструменты. Да и стоимость места на HDD в этом случае оказывается просто неоправданно высока.
lemme: ну если Вам есть смысл платить за 2-3 Гб хостеру - то пожалуйста... В этом случае к сожалению на сервер файл загрузить нужно в любом случае. Просто если на пальцах, то сервер может выполнять любые операции только с уже загруженными на него файлами, однако если файл не загружен на него - очевидно, что он находится на жестком диске компа юзера, к которому он (сервер) доступа не имеет. Но к сожалению этот этап переноса с венча на сервер не перехватить. Возможно можно какой-то программный перехватчик написать для этого действия, но это уже выйдет за рамки PHP...
Антон Тихомиров: тут не пхп, и не про обработку файла, я говорю про обработку "остальных данных" (текстовых полей), и если с ними все ок, то потом уже обрабатывать файл, но, как я писал в вопросе, multer не позваляет этого делать, ибо нет возможности поставить глобальный middleware, который даст вомзожность обрабатывать multipart/form-data везде (где пришел такой тип), а потом уже сказать, ок, в данном поле у нас файл, раз req.file.save() и только тут начинается обработка файла.
Вот что я хочу.
const somecontroller = (req, res, next) {
// req.file - undefined
// req.body - undefined
// но как только запрос попадает сюда, файл уже загружен
// и только тогда появляется возможность обрабатывать полученные данный
upload(req, res, (err) => {
// req.file - { file }
// req.body - [ fields ]
// только тут начинаются проверки заполнения полей, и.т.д
// и в случае ошибки, нужно удалять файл.
});
}
lemme: а) Вам предварительно значит надо) Ну если JS так принципиально, то я бы аяксом проверил бы его наличие на сервере (и им же целостность), и в случае если аякс возвращает, например, true, то уже и проверять нужные поля и прочее. Это в теории, могу накидать реализацию, если вдруг захотите так реализовать... Просто какая-то серверная прокладка в любом случае нужна (запуск простенького скрипта на PHP, просто JS вообще не работает с файлами, это совсем иной уровень абстракции, это просто обвертка над сервером). Поэтому возможно и решений никаких никто еще не предложил...
WapSter, я вроде бы об этом и написал что действительно думал о другом, разве нет? Так что в глаза тут долбишься тут только ты, что этих комментов даже не увидел. У кого что болит, это я уже давно заметил...
Антон Тихомиров, я о том, ты хотя бы вопрос прочти. Я видел твои извинения. Но вот я столкнулся с почти такой же проблемой и ничего не увидел, кроме ответа не по теме.