Добрый вечер, Булчане!
Возникла проблема, причём на довольно ровном месте. В своём чатике я решил добавить передачу фоточек и картиночек всяких. Собственно, в этом проблемы не возникло - влоб передаю данные картинки через socket.io или из браузера, или из мобилки. На сервере из сохраняю как то вот так:
fs.writeFile( __dirname + "/uploads/images/"+filename, msgParsed.text, 'binary', function(err) {
...
});
Filename - имя файла (я его сам генерирую, сразу оговорка - расширения файл не имеет), msgParsed - это распарсеный json с клиента, msgParsed.text - собственно содержимое картинки. Потом на клиенте просто запрашиваю данные этой картинки и вставляю в нужные места (в <img src/> или в UIImage на яблофоне).
В общем? конкретно с этим - проблем нет, всё сохраняется и отображается как надо. Проблема в другом - я решил делать ресайз принимаемых картинок, ибо во первых - нефиг их в мегаразрешениях хранить, во вторых - надо делать превьюшки картинок, чтоб не грузить канал мегаданными.
Ну, думаю, всё фигня, 5 минут и вопрос решён - гугл в руки и вперёд.
apt-get install Imagemagick
npm install easyimage
Далее берём простейший код и вроде как радуемся данным изображения (baseText - имя файла):
var easyimage = require('easyimage');
easyimage.info(__dirname + '/uploads/images/'+baseText).then(
function(file) {
console.log(file);
}, function (err) {
console.log(err);
}
);
И, казалось бы, вот оно - счастье. Но хрен тут был, имеем ошибку:
[Error: identify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.]
Пол дня рылся, не понял в чём проблема. Ну, думаю, ладно, припишу расширение (файл был png, потому приписал, соответственно, ".png"). Запускаю запрос файла заново - имею ошибку номер 2:
[Error: identify: improper image header `.../uploads/images/image_8b7cea9f-a80a-4069-a326-273b6ecc8c65.png' @ error/png.c/ReadPNGImage/3930.
И вот тут я понял, что вообще не понял. Файл сохранял по всем канонам гугла - всеми возможными способами. И, если файл сохранить убрав 'binary', и потом проверить, то внутри всё будет вроде как нормально:
data:image/png;base64,...
Причём эта сохранённая картинка не открывается ни одним просмотрщиком, а в тот единственный раз, когда мне каким-то чудом удалось таки добиться до её данных из ноды (через модуль file-type и какой-то из вариантов сохранения изображения использовал), то мне написало что mime у неё "text/plane". Что я делаю не так? И почему оно отображается в браузере и в UIImage нормально (причём в обеих вариантах - при сохранении как 'binary' и как обычный файл)?