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?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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!!