Как передать картинку на nodejs?

Помогите, как передать ajax через input[type='file'] данные в nodejs. То что приходить, весить больше чем нужно и не открывается как картинка.
'use strict'

var fs = require('fs');
var express = require('express');
var cors = require('cors');
var app = express();

app.use(cors());

app.post('/', function (req, res) {
    var data = '';

    req.on('data', function (chank) {
        data += chank;
    }).on('end', function () {
        fs.writeFile('file1.jpg', data, function (err) {
            if (err) console.log(err.message);
        });
    });
});

app.listen(8001);
<!doctype html>
<title>API Testing</title>

<input type="file" name="file">
<img src="" alt="photo one">

<script>
    'use strick'

    var file_input = document.querySelector('input');
    var img_url = document.querySelector('img');
    var xhr = new XMLHttpRequest();

    xhr.open('post', 'http://localhost:8001/', true);

    xhr.addEventListener('load', function () {

        console.log(xhr.responseText);
        img_url.src = xhr.responseText;
    });

    file_input.addEventListener('change', function () {
        xhr.setRequestHeader('Content-Type', 'multipart/form-data');
        xhr.send(file_input.files[0]);
    });

</script>
  • Вопрос задан
  • 2533 просмотра
Решения вопроса 1
@Abcdefgk
AJAX отправляет поток, принимать надо - как поток.

var stream = fs.createWriteStream('... тут абсолютный путь/file.jpg');
req.pipe(stream);

stream.on('end', () => res.end());
stream.on('error', (err) => {...});


Если только картинка - кодировать не надо.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Если размер тела запроса большой, воспользуйтесь пакетом body-parser
const bodyParser = require('body-parser')
. . .
app.use(bodyParser.urlencoded({
    extended: true,
    limit: '5mb' // лимит
}))
. . .
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Не надо приобразовывать бинарные данные в строку, мультибайтные кодировки с этим не дружат
Вариант 1 - складывать чанки в массив и объеденять через Buffer.concat
Вариант 2 - открыть write stream в файл и сделать req.pipe в него
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы