Загрузите разделенный файл изображения
Я использую директиву ng-file-upload для отправки изображения на сервер из моего углового приложения. Вот мой код:
Upload.upload({
url: 'http://localhost:5000/upload',
data: { file: blobFile },
resumeChunkSize: 10000,
}).then(function (resp) { //upload function returns a promise
console.log('resp: ', resp);
});
Изображение передается кусками. Но сейчас я поражен здесь. Я не знаю, как получить эти куски и объединить, чтобы создать полный образ. Мой код сервера выглядит следующим образом:
handler: function (req, res) {
var size = 0;
req.on('data', function (data) {
size += data.length;
console.log('Got chunk: ' + data.length + ' total: ' + size);
});
req.on('end', function () {
console.log("total size = " + size);
res.send("response");
});
req.on('error', function (e) {
console.log("ERROR ERROR: " + e.message);
});
}
Каждый раз, когда я получаю запрос чанка, req.on('end', ...)
триггеры. Я новичок, так запутался здесь.
1 ответ
Да... фрагмент изображения не так просто загрузить...
Вот решение, которое я использую:
var request = require('request');
var fs = require('fs');
function uploadChunkedImage(url, callback){
// request options
var options = {
url: url, // the url of the image
method: 'GET'
};
// array of chunks
var chunks = [];
// request
request(options, function (err, res, body) {
console.log('END')
// body is corrupted, you can't use it for images... :-(
// so, we will callback the concactened buffer of it instead
// concact chunk buffers
chunks = Buffer.concat(chunks); // image buffer that you can use
// callback the result
callback(err, res, chunks);
}).on('response', function (response) {
response.on('data', function (chunk) {
// collect chunk buffer
chunks.push(chunk);
});
});
}
uploadChunkedImage('http://localhost:5000/upload', function(err, res, buffer){
if(!err){
// save
fs.writeFile('./myDirPath/image.jpg', buffer);
}else{
console.log(err);
}
});
Не забудьте установить request
а также fs
в вашем проекте с npm, Buffer
родной
npm install request --save
npm install fs --save
для получения дополнительной информации:
Вы можете сделать то же самое с ng-file-upload, здесь есть хороший пример, иначе я предлагаю попробовать что-то вроде ниже (не проверено):
handler: function (req, res) {
// array of chunks
var chunks= [];
req.on('data', function (data) {
// collect
chunks.push(data);
console.log('Got chunk: ' + data.length);
});
req.on('end', function () {
// concact
chunks = Buffer.concat(chunks);
console.log("Total size = " + chunks.length);
// res.send() is deprecated, use res.write instead
res.write(chunks,'binary');
res.end(null, 'binary');
});
req.on('error', function (e) {
console.log("ERROR ERROR: " + e.message);
});
}
Надеюсь, что это поможет