Ограничения файлов Base64 буфера NodeJS

Пытался загрузить изображение с помощью Base64, но если строка длинная, нижняя часть сохраненного изображения пустая белая.

загрузить.js

var uuid = require('node-uuid');
var fs = require('fs');

exports.uploadImage = function(base64Str, callback) {
    var filename = uuid.v1()+'.png';
    var bitmap = new Buffer(base64Str, 'base64');
    fs.writeFileSync(filename, bitmap);
    callback(filename);
};

сервер.js

var fs = require('fs');
var restify = require('restify');  
var server = restify.createServer();
server.use(restify.bodyParser());

var upload = require('./modules/upload');

server.post('/images', function(req, res) {
    upload.uploadImage(req.params.myImage, function(filename) {
        console.log('processing image');
        res.send(filename);
        res.end();
    });
});

server.listen(3000);

Он работает для строки длиной 499016 байт, но не для строки длиной 847508 байт. Существует ли задокументированное ограничение размера и, если нет, как я могу загружать и декодировать более длинные строки?


person Mark Tyers    schedule 01.05.2015    source источник
comment
если изображение исходит из браузера, я бы подозревал его больше, чем node...   -  person dandavis    schedule 01.05.2015
comment
Я конвертирую изображение с помощью онлайн-кодировщика, а затем передаю его на узел с помощью Chrome Postman. Я подозревал, что это онлайн-инструмент кодировщика, поэтому использовал второй, но получил тот же результат.   -  person Mark Tyers    schedule 01.05.2015
comment
убедитесь, что вы пишете как двоичный файл, возможно, некоторые изображения обманывают детектор кодирования, и вы не указываете двоичный код...   -  person dandavis    schedule 01.05.2015
comment
Маленькие изображения отлично декодируются, а большие изображения решают частично, но запоминают общий размер изображения. Есть ли проблема тайм-аута с NodeJS?   -  person Mark Tyers    schedule 01.05.2015
comment
не должно быть, но вы все равно должны использовать асинхронность. возможно, ОС сообщает о завершении записи до того, как жесткий диск фактически заархивирует ее. помогает ли отсрочка поворота?   -  person dandavis    schedule 01.05.2015


Ответы (1)


Возможно, вы достигли предела размера запроса. Одним из вариантов может быть загрузка вашего изображения как multipart/form-data. Вы можете сделать это с помощью параметров mapFiles в restify.bodyParser, и вы можете проверить это, выбрав файл вместо текста в данных формы Postman.

Отредактировано: fs.rename может иметь больше смысла здесь для целей тестирования. В практическом приложении вы можете сохранить загруженные файлы в другом месте, например, на s3.

var fs = require('fs');
var restify = require('restify');
var server = restify.createServer();
server.use(restify.bodyParser({
    mapFiles: true
}));

var uuid = require('node-uuid');
var fs = require('fs');

var uploadImage = function(path, callback) {
    var filename = uuid.v1() + '.png';
    fs.rename(path, filename, function(err) {
        if (err) {
            throw err;
        }
        callback(filename);
    });
};

server.post('/images', function(req, res) {
    uploadImage(req.files.myImage.path, function(filename) {
        res.send(filename);
        res.end();
    });
});

server.listen(3000);
person Andrew Lavers    schedule 01.05.2015
comment
Поскольку мой временный каталог находился в другом разделе, я получил ошибку EXDEV. Было два возможных изменения вышеизложенного: либо переместить мой временный каталог http://stackoverflow.com/questions/21071303/node-js-exdev-rename-error, либо заменить модуль npm mv на fs.rename. Я выбрал последнее, и все работает хорошо. - person Mark Tyers; 03.05.2015
comment
Хотя ответ работает хорошо, я все же хотел бы понять, как загрузить большое изображение в кодировке base64. Я попытался установить bodyParser, надеясь, что это исправит ситуацию. У кого-нибудь есть идеи? - person Mark Tyers; 04.05.2015