Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Upload de múltiplos arquivos

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?

3 respostas
solução

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!!