fs.writeFile поврежден, используется строка base64 - PullRequest
0 голосов
/ 15 января 2019

Файл пишет нормально, но Фото говорит, что это неподдерживаемый формат. Файл также кажется намного меньше, чем я ожидаю (16 КБ).

router.post('/image/upload/gamethumb',
(req, res) => {
    const destination = keys.imageLocation + "cards/";
    console.log(req.body.image);
    fs.writeFile(destination + req.query.title + ".png", req.body.image, 'base64',
    () => {res.json({image: 'Uploaded'});
}
    )
});

начало req.body.image:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA ...

и хорошо отображается, если я вставлю его в хром.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

req.body.image строка не является реальным изображением.

Позвольте удалить заголовок, затем сохраните строку изображения в файл как изображение

let base64Image = base64String.split(';base64,').pop();
fs.writeFile(req.query.title + ".png", base64Image, {encoding: 'base64'}, (err) => {
    if (err) {
        console.log(err);
        return;
    }
    console.log('File created');
});
0 голосов
/ 15 января 2019

Проблема в том, что req.body.image содержит URL данных , который представляет собой нечто большее, чем просто тело изображения. Данные изображения base64 начинаются после запятой. Ваш текущий код случайно кодирует заголовок URL-адреса данных (data:image/png и т. Д.), Как если бы он был частью изображения, а это не так.

Простое исправление:

const base64Data = req.body.image.split('base64,')[1];
fs.writeFile(destination + req.query.title + ".png", base64Data, 'base64', ...);

(Этот код предполагает, что входящее изображение всегда корректно; вы можете добавить дополнительную логику, чтобы убедиться, что префикс действительно равен data:image/png;base64, и т. Д., Если хотите.)

...