2014-05-03 9 views
5

Ho voluto creare un file zip e caricarlo senza scrivere un file temporaneo su disco in questo modo:possibile utilizzare gulp per creare un file zip e caricare senza utilizzare il file temporaneo?

gulp.task('zip-upload', function() { 
    return gulp.src('**/*', { cwd: 'out/', cwdbase: true }) 
    .pipe(zip('file.zip')) 
    .pipe(request.put('https://myurl.com')); 
}); 

Ma getta un errore:

http.js:853 
    throw new TypeError('first argument must be a string or Buffer'); 

TypeError: first argument must be a string or Buffer 
    at ClientRequest.OutgoingMessage.write (http.js:853:11) 
    at Request.write (.../node_modules/request/request.js:1315:25) 

ho finito per risolverlo utilizzando due compiti, ma questo non è l'ideale:

gulp.task('zip', function() { 
    return gulp.src('**/*', { cwd: 'out/', cwdbase: true }) 
    .pipe(zip('file.zip')) 
    .pipe(gulp.dest('./')); 
}); 

gulp.task('upload', [ 'zip' ], function() { 
    fs.createReadStream('file.zip').pipe(request.put('https://myurl.com')); 
}); 

È possibile utilizzare qualcosa come il primo approccio con gulp?

Dipendenze:

npm install gulp-zip request 

Grazie.

risposta

1

Sembra gulp-buffer dovrebbe essere in grado di risolvere il problema:

Installare gulp-buffer e aggiungerlo al tuo gulpfile, dopo che inserire il cuscinetto tra la chiamata zip e la richiesta.

gulp.task('zip-upload', function() { 
    return gulp.src('**/*', { cwd: 'out/', cwdbase: true }) 
    .pipe(zip('file.zip')) 
    .pipe(buffer()) 
    .pipe(request.put('https://myurl.com')); 
}); 
+0

Im semplicemente curiosi di scoprire questa soluzione: è davvero questo di evitare l'IO su disco e fare tutto in memoria (Chunked o no) o è solo ri-streaming dei dati conferiti a disco? –

+0

@JairoAndresVelascoRomero puoi controllare la fonte su https://github.com/jeromew/gulp-buffer/blob/master/index.js - raccoglie tutti i blocchi e crea un buffer con quel contenuto. Non vedo nulla che indichi l'accesso al file system. –