Nessa parte de enviar arquivos via stream no NodeJS, é possível também enviar múltiplos arquivos? e também enviar informações sobre eles no request?
Nessa parte de enviar arquivos via stream no NodeJS, é possível também enviar múltiplos arquivos? e também enviar informações sobre eles no request?
Oi Thadeu. Blz?
É possível enviar múltiplos arquivos sim, mas é mais recomendável que você envie um por request mesmo, pois fica mais fácil de tratar o recebimento.
Ou se essa não for uma possibilidade, uma outra opção seria enviar os arquivos compactados em um só. E você pode disponibilizar no seu front end uma tela que mostra a opção de selecionar vários arquivos pro usuário e a sua app do front junta todos em um arquivo compactado antes de enviar a requisição.
O que vai mudar do lado da API no momento de ler o arquivo é que aí você vai precisar descompactá-lo antes. Você pode fazer isso usando o módulo zlib
que é do próprio core do Node.
Veja um exemplo fazendo a leitura via Stream:
var fs = require('fs');
var zlib = require('zlib');
module.exports = function(app) {
app.post("/upload/gzip",function(req, res) {
var arquivo = req.headers.filename;
console.log('arquivo recebido: ' + arquivo);
console.log('escrevendo arquivo');
fs.writeFile('b.tst', req.body);
console.log('arquivo escrito');
req.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream("files/" + arquivo))
.on('finish', function(){
res.writeHead(201, {'Content-type': 'text/plain'});
res.end('ok');
console.log('arquivo salvo: files/' + arquivo);
});
});
}
A zlib
também tem implementação via Buffer, caso você prefira.
Para enviar as informações sobre os arquivos, a melhor maneira é criar headers específicos para cada informação que você quer enviar, assim como fizemos com o Header filename
, por exemplo.
Exemplo:
curl -X POST http://localhost:3000/upload/imagem -v
-H "filename: <nome_do_arquivo>"
-H "tamanho_do_arquivo: 100kb"
-H "data_de_criacao: 20161012"
-H "Content-Type: application/octet-stream"
--data-binary @imagem.jpg
E aí você lê cada Header na API, uma vez que já está esperando por eles.
Espero que tenha ajudado. Se ainda tiver ficado alguma dúvida, comenta aqui que a gente vai conversando até chegar na solução. =)
Abraço.
Muito obrigado Julio.
Estou fazendo uns testes aqui com o upload junto com o AngularJS e assim que tiver um retorno eu posto aqui (sendo positivo ou não).
Abraço
Julio, boa tarde,
Desculpe a demora.
Consegui realizar com um componente do angular.js para realizar o upload por stream.
Muito obrigado pela ajuda!!