Node.js로 파일을 다운로드하는 방법

Node.js로 파일을 다운로드하는 방법

파일을 클라우드 저장소에 보관하지 않고 로컬 저장소에 다운로드하면 몇 가지 이점이 있습니다. 여기에는 더 쉬운 액세스, 인터넷 연결 없이 액세스 및 데이터의 완전한 소유권이 포함됩니다.

내장된 Node.js 모듈을 사용하여 단일 및 다중 파일을 다운로드할 수 있습니다. 대신 타사 라이브러리를 사용하여 동일한 결과를 얻을 수도 있습니다.

타사 라이브러리 없이 파일 다운로드

타사 패키지의 도움 없이 Node.js를 사용하여 파일을 다운로드하려면 세 가지 핵심 Node.js 모듈( fs , httpspath )이 필요합니다 .

fs 모듈 은 읽기, 생성, 업데이트, 제거 및 이름 바꾸기를 포함한 많은 파일 작업을 지원합니다. https 모듈 은 요청을 처리하고 응답을 전달하기 위해 웹 서버를 생성합니다. 경로 모듈은 디렉터리 및 파일 경로와 상호 작용하는 방법을 제공합니다 .

이러한 모듈을 사용하여 HTTP GET 요청을 보내 웹 서버에서 파일 리소스에 액세스한 다음 로컬 시스템에서 리소스의 복사본을 만들 수 있습니다.

시작하려면 필요한 모듈을 가져옵니다.

const https = require('https');
const fs = require('fs');
const path = require('path');

URL의 파일 이름을 좋은 기본 이름으로 사용하여 저장해야 합니다. 경로 모듈의 .basename() 메서드를 사용하여 URL에서 파일 이름을 얻을 수 있습니다. 이 메서드는 경로 인수를 사용하고 경로의 마지막 부분을 반환합니다.

예를 들어:

const filename = path.basename(url);

그런 다음 https.get() 메서드 를 호출하여 서버에서 파일을 요청합니다 . 이 메서드는 URL을 첫 번째 인수로 사용하고 응답에 대한 콜백 함수를 두 번째 인수로 사용합니다.

url 변수를 첫 번째 인수로 전달한 다음 이 메서드가 응답 스트림을 수신할 때 처리할 콜백 함수를 전달합니다 .

https.get(url, (res) => {
})

콜백 함수에서 fs.createWriteStream() 메서드를 사용하여 파일 이름 변수를 인수로 전달하여 쓰기 가능한 새 스트림을 만들 수 있습니다 .

예를 들어:

const fileStream = fs.createWriteStream(filename);
res.pipe(fileStream);

createWriteStream() 메서드 는 특히 대량의 데이터를 처리할 때 데이터를 파일에 쓰는 프로세스를 용이하게 합니다.

그런 다음 pipe() 메서드는 GET 응답 데이터 스트림을 fileStream 개체로 보냅니다.

스크립트가 파일 다운로드를 완료한 후 콘솔에 메시지를 기록하려면 .on () 이벤트 이미터를 fileStream 변수에 연결합니다.

fileStream.on('finish', () => {
  fileStream.close();
  console.log('Download finished');
});

fileStream 개체 는 모든 데이터를 파일에 썼을 때 완료 이벤트를 내보냅니다. .on () 메서드를 통해 이를 포착하고 콜백 함수를 제공하여 fileStream 을 닫고 콘솔에 메시지를 기록합니다.

더 나은 실행과 효율적인 스크립트 재사용성을 위해 URL을 인수로 사용하는 함수에 이 코드를 래핑합니다.

function downloadFile(url) {
    const filename = path.basename(url);

    https.get(url, (res) => {
        const fileStream = fs.createWriteStream(filename);
        res.pipe(fileStream);


        fileStream.on('finish', () => {
            fileStream.close();
            console.log('Download finished')
        });
    })
}

함수를 실행하려면 함수를 호출하고 다운로드하려는 파일의 URL을 전달합니다.

downloadFile([file url]);

스크립트를 실행하려면 터미널을 열고 node 뒤에 JavaScript 파일 이름을 입력하십시오.

node [script name]

이 스크립트는 downloadFile() 함수에 전달한 파일 URL을 다운로드하고 작업 디렉토리에 저장합니다.

파일 다운로드 시 오류 처리

Node.js에서 파일을 다운로드할 때 스트림에 쓰기, 서비스 연결 불량 또는 파일 자체 문제와 같은 특정 오류가 발생할 수 있습니다. 이러한 오류가 발생하면 문제를 해결할 수 있도록 오류 메시지를 기록하는 것이 중요합니다.

트라이/캐치 블록

try-catch 블록은 코드에서 잠재적 오류 및 예외를 처리할 수 있는 프로그래밍 구조입니다.

try-and-catch 블록은 try…catch 블록을 구성합니다. try 블록의 코드가 먼저 실행되고 try 블록이 예외를 throw하면 catch 블록의 코드가 실행됩니다.

try {
    downloadFile([file url]);
} catch (error) {
    console.log(error);
}

다운로드 관련 오류를 잡을 수 있도록 try/catch 블록을 사용하십시오. 그런 다음 콘솔에 기록하거나 다운로드를 다시 시도하는 등 필요에 따라 오류를 처리할 수 있습니다.

HTTP 응답 상태 코드

HTTP 응답의 상태 코드는 특정 HTTP 요청이 성공적으로 수행되었는지 여부를 보여줍니다.

예를 들어:

https.get(url, (res) => {
    const code = res.statusCode();
    console.log(code)
    const fileStream = fs.createWriteStream(filename);
});

요청이 성공 범위( 200-299 ) 를 벗어난 상태 코드를 반환하면 요청 에 문제가 있는 것입니다. HTTP 상태 코드를 확인한 다음 상태 코드의 의미를 찾아 필요에 따라 오류를 처리합니다.

여러 파일 다운로드

node [스크립트 이름] 실행 시 파일 URL을 인수로 전달하여 여러 파일을 동시에 다운로드할 수 있습니다 . 이 작업을 수행하려면 스크립트의 특정 부분을 수정해야 합니다.

JavaScript에서 node 명령과 함께 전달되는 인수는 전역 Node.js 개체의 속성인 process.argv에서 사용할 수 있습니다. 이 속성은 명령줄 인수의 배열을 반환합니다. 이 배열의 첫 번째 요소는 실행하는 실제 명령인 node 여야 합니다. 두 번째는 스크립트 파일 이름이고 다음 각 인수는 URL이어야 합니다.

한 번에 여러 파일을 모두 다운로드하려면 process.argv 의 배열을 변수에 저장하십시오. 그런 다음 slice() 메서드를 실행하여 URL이 아닌 처음 두 요소를 제거합니다.

const args = process.argv;
const urls = args.slice(2);

slice() 메서드 는 배열에서 선택한 요소에서 새 배열을 만듭니다. 이 메서드는 지정된 시작부터 지정된(비포괄적) 끝까지 선택합니다.

이 경우 값 2를 전달하면 노드 명령 이름과 스크립트 파일 이름 이 제거 됩니다.

마지막으로 JavaScript의 map 메서드를 사용하여 urls 배열의 각 요소를 downloadFile() 에 전달합니다 .

urls.map(url =>{
    downloadFile(url)
});

코드를 실행하려면 JavaScript 파일의 이름 및 다운로드하려는 URL과 함께 node 명령을 입력하십시오.

node [script name] url1 url2 url3

타사 라이브러리 사용

npm 다운로드 패키지 와 같은 타사 라이브러리를 사용하여 파일을 다운로드할 수도 있습니다 .

스크립트 디렉터리 내에서 다음 npm 명령을 실행하여 다운로드 패키지를 설치합니다.

npm install download

스크립트에서 다운로드한 패키지를 요구한 다음 배열에 명령줄 인수를 저장합니다.

const download = require('download');
const args = process.argv;
const urls = args.slice(2);

이제 다운로드 라이브러리를 사용하여 파일을 다운로드할 수 있습니다. 특정 목표에 따라 여러 가지 방법으로 이 작업을 수행할 수 있습니다.

예를 들어:

async function downloadFile(urls){
await Promise.all(urls.map((url) => download(url, "files")))
};

downloadFile(urls);

downloadFile 함수를 async 로 선언하고 await 키워드 를 사용하여 특정 작업이 완료될 때까지 기다리 겠다는 Promise 를 만듭니다 . urls 배열을 다운로드 함수에 매핑하고 파일을 저장할 로컬 폴더 이름( 이 경우 files )을 전달합니다.

로컬 파일 시스템에 파일 다운로드

fs 및 https와 같은 Node의 내장 기능을 사용하면 파일 다운로더를 쉽게 작성할 수 있습니다. 더 쉽게 하기 위해 다운로드와 같은 타사 모듈을 사용할 수 있습니다.

두 방법 모두 원격 서버에서 파일을 다운로드하고 로컬 파일 시스템에 저장할 수 있습니다. 필요에 가장 적합한 방법을 선택하고 다음 Node.js 애플리케이션에서 사용해야 합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다