2017-09-12 2 views
0

나는 이것에 대해 꽤 많은 검색을 해왔다.스트림 압축 파일, 압축 해제 파이프, 파이프 출력?

현재 ftp (promise-ftp 사용)에서 파일을 스트리밍 한 다음 s3 (s3-streams 사용)으로 파이프하는 람다 함수가 있습니다. 이것은 잘 작동합니다.

파일을 압축하는 문제가 발생했습니다. 압축 파일을 s3에 업로드하기 전에 압축을 풀고 싶습니다. 나는 로컬 파일로 작업 할 수있는 unzip 유틸리티 (실제로는 노드 - 압축 해제)를 0 행운을 얻었습니다. 나는 압축을 풀기 위해 모든 것을 처리하는 데 더 나쁜 행운을 겪었습니다 (테스트 중에는 내 로컬 컴퓨터에서 같은 이름의 디렉터리에 파일을 반복적으로 저장하도록했습니다).

내가 해봤 관련 코드는 다음과 같습니다

stream.pipe(unzip.Extract({path: '/tmp/'}).pipe(toS3Stream)

나에게 ENOENT을 제공합니다. unzip.Parse()와 동일한 것은 나에게 '읽을 수없는'오류를줍니다. 링크 해제 권한 오류가 발생했습니다. 나는 잃어 버렸어 ...

나는 람다에게 물건을 일시적으로 저장할 의향이 있지만, 나는 일하게하는 것조차 보이지 않는다.

편집 : 또한 매우 명확합니다. 이들은 .zip 개의 .gz가 아닌 파일이므로 zlib는 작동하지 않습니다.

답변

1

분명히 node-unzip의 if/else 블록 예제가 내 문제였습니다. 다음 작품 (30 + 파일을 로컬 및 람다 테스트) :

ftp.connect({ host: ftpHost, user: ftpUser, password: ftpPassword }) 
 
       .then(serverMessage => { 
 
        return ftp.get('/directory/' + fileName); 
 
       }) 
 
       .then(stream => { 
 
        return new Promise((res, rej) => { 
 
         logger.info('Streaming file from FTP') 
 
         stream.once('error', rej); 
 
         stream.once('close', res); 
 
         stream.pipe(FS.createWriteStream('/tmp/'+fileName)); 
 
        }); 
 
       }).then(() => { 
 
        logger.info('Closing FTP connection') 
 
        // Unzip the file and pipe it to S3 
 
        FS.createReadStream('/tmp/'+fileName).pipe(UNZIP.Parse()) 
 
        .on('entry', obj => obj.pipe(toS3Stream)) 
 
        .on('close',() => { 
 
         resolve('File unzipped and written to S3.') 
 
        }) 
 
        resolve('FTP closed'); 
 
        return ftp.end(); 
 
       })