>웹 프론트엔드 >JS 튜토리얼 >노드 일괄 파일을 로컬로 다운로드하는 방법 소개(코드 포함)

노드 일괄 파일을 로컬로 다운로드하는 방법 소개(코드 포함)

不言
不言앞으로
2019-03-16 10:51:014546검색

이 글은 Node에서 파일을 로컬로 일괄 다운로드하는 방법(코드 포함)을 소개합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

여러 파일을 개별적으로 처리

파일 수를 제어할 수 있고 다운로드한 파일 형식에 대한 요구 사항이 없는 경우 가장 간단한 방법을 사용하여 파일을 직접 탐색하고 각 파일에 대해 단일 파일 다운로드 또는 iframe을 만들 수 있습니다. 다운로드 링크.

Zip 패키지 일괄 다운로드

모든 파일을 순회한 다음 개별 파일을 일괄 다운로드하는 것이 가능하지만 결국 이 경험은 그다지 좋지 않습니다.

첫 번째 구현 아이디어는 프록시 서비스에서 먼저 모든 파일을 탐색하여 파일 데이터를 요청한 다음 이를 zip 패키지로 압축한 다음 zip 패키지를 클라이언트에 반환하는 것입니다.

다운로드 볼륨 데이터가 상대적으로 작으면 괜찮지만 배치 파일이 매우 크고 큰 경우 사용자는 백엔드가 모든 데이터를 요청하고 이를 프런트엔드가 제공할 수 있기 전에 압축된 패키지로 패키징할 때까지 기다려야 합니다. 피드백 시간이 오래 걸리고 사용자 경험이 좋지 않을 수 있습니다.

동료들의 예비 연구 중에 여기에 스트리밍 압축 및 다운로드 기능이 있을 수 있다고 합니다. 일반적인 아이디어는 패키지를 분할하고 스트리밍 압축을 추가하는 것입니다.

......

let fileCounter = 0;
const zippedFilename = encodeURIComponent(downloadData.name);
const list = downloadData.list || [];
const header = {
  'Content-Type': 'application/x-zip',
  'Pragma': 'public',
  'Expires': '0',
  'Cache-Control': 'private, must-revalidate, post-check=0, pre-check=0',
  'Content-disposition': 'attachment; filename="' + zippedFilename + '"',
  'Transfer-Encoding': 'chunked',
  'Content-Transfer-Encoding': 'binary'
};
res.writeHead(200, header);
archive.store = true;
archive.pipe(res);
list.map(item => {
  fileCounter++;
  let inStream = request.get(item.downLoadUrl);
  let name = item.fileName;
  let length = 0;
  inStream.on('response', function(awsData) {
    archive.append(inStream, {
      name: name
    });
  }).on('data', function(data) {
    length += data.length;
  }).on('error', function(e) {
    console.error(name + '-error', e);
  }).on('end', function(endData) {
    fileCounter--;
    if (fileCounter < 1) {
      archive.finalize();
    }
  });
});
archive.on('error', function(err) {
  throw err;
});
archive.on('finish', function(err) {
  return res.end();
});

......

물론 중국어 파일 이름 문제, 다운로드한 파일의 전체 크기를 제한해야 하는지 여부, 파일이 존재하지 않는지 등과 같이 아직 처리해야 할 세부 사항이 있습니다.

위 내용은 노드 일괄 파일을 로컬로 다운로드하는 방법 소개(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제