> 웹 프론트엔드 > 프런트엔드 Q&A > nodejs에서 파일을 다운로드하는 방법

nodejs에서 파일을 다운로드하는 방법

WBOY
풀어 주다: 2023-05-11 20:29:08
원래의
4377명이 탐색했습니다.

Node.js는 서버 측에서 JavaScript 코드를 실행할 수 있는 JavaScript 런타임 환경에서 실행되는 오픈 소스 크로스 플랫폼 JavaScript 런타임입니다. Node.js는 확장 가능한 고성능 웹 애플리케이션을 개발하는 데 널리 사용됩니다. 그 중 파일 다운로드는 웹사이트의 기본 기능 중 하나이며, Node.js에서도 쉽게 파일 다운로드 기능을 구현할 수 있습니다. 이 문서에서는 Node.js에서 파일을 다운로드하는 방법을 자세히 설명합니다.

1. HTTP 모듈을 사용하여 파일 다운로드

Node.js에서는 HTTP 모듈을 사용하여 파일을 다운로드할 수 있습니다. HTTP 모듈은 Node.js의 핵심 모듈 중 하나이며 HTTP 클라이언트 및 서버를 생성하기 위한 API를 제공합니다.

  1. 파일 다운로드를 위한 기본 단계

파일을 다운로드하려면 다음 기본 단계를 수행해야 합니다.

(1) HTTP 요청을 생성합니다.

(2) HTTP 요청을 보냅니다.

(3) 파일에 응답을 작성합니다.

기본 코드는 다음과 같습니다.

const http = require('http');
const fs = require('fs');

const fileUrl = 'http://example.com/file.pdf';
const filePath = './file.pdf';

const request = http.get(fileUrl, (response) => {
  const fileStream = fs.createWriteStream(filePath);
  response.pipe(fileStream);
});

request.on('error', (err) => {
  console.error(`请求下载文件出错: ${err.message}`);
});

request.end();
로그인 후 복사

위 코드에서는 먼저 HTTP 모듈의 get 메소드를 통해 HTTP 요청을 생성합니다. 요청 콜백 함수에서는 쓰기 가능한 파일 스트림을 생성하고 파이프를 통해 파일 스트림에 응답을 기록하여 파일을 디스크에 기록합니다.

  1. 다운로드 진행 상황 처리

대용량 파일을 다운로드하려면 다운로드 진행 상황을 아는 것이 매우 중요합니다. 내장된 Content-Length 헤더를 사용하여 파일 크기를 얻을 수 있고, 내장된 progress 이벤트를 사용하여 다운로드 진행 상황을 추적할 수 있습니다. 예는 다음과 같습니다. Content-Length头来获得文件的大小,并使用内置的progress事件来跟踪下载的进度。下面是一个例子:

const http = require('http');
const fs = require('fs');

const url = 'http://example.com/file.zip';
const filePath = './file.zip';

http.get(url, (response) => {
  const contentLength = parseInt(response.headers['content-length']);
  let downloadedLength = 0;

  response.pipe(fs.createWriteStream(filePath));

  response.on('data', (chunk) => {
    downloadedLength += chunk.length;
    const percent = downloadedLength / contentLength * 100;
    console.log(`${percent}% downloaded`);
  });

  response.on('end', () => {
    console.log('下载完成');
  });
}).on('error', (err) => {
  console.error(`请求下载文件出错: ${err.message}`);
});
로그인 후 복사

在上面的代码中,我们使用内置的data事件来跟踪下载的进度,并使用Content-Length头来计算下载的百分比。当下载完成时,我们输出“下载完成”的消息。

  1. 处理重定向

有时,文件下载链接可能会被重定向。我们可以检查响应的状态码是否为301或302,并使用Location头来获取重定向的链接。下面是示例代码:

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

function downloadFile(url, filePath) {
  const httpClient = url.startsWith('https') ? https : http;

  httpClient.get(url, (response) => {
    const { statusCode } = response;

    if (statusCode === 301 || statusCode === 302) {
      console.warn(`文件重定向: ${response.headers.location}`);
      downloadFile(response.headers.location, filePath);
      return;
    }

    if (statusCode !== 200) {
      console.error(`请求下载文件出错: 状态码 ${statusCode}`);
      return;
    }

    response.pipe(fs.createWriteStream(filePath)).on('close', () => {
      console.log('下载完成');
    });
  }).on('error', (err) => {
    console.error(`请求下载文件出错: ${err.message}`);
  });
}

const url = 'http://example.com/file.zip';
const filePath = './file.zip';

downloadFile(url, filePath);
로그인 후 복사

在上面的代码中,我们使用httpClient变量来检查协议(http或https),并使用statusCode来检查响应的状态码。如果是301或302,则输出重定向的消息并重新下载文件。如果不是200,则输出错误消息。

二、使用Request模块下载文件

除了HTTP模块之外,Node.js中还有一些流行的第三方模块可以用来下载文件,其中最受欢迎的是Request模块。Request模块是一个简单的、强大的、人性化的HTTP客户端,由Mikeal Rogers创建。

  1. 安装Request模块

要使用Request模块进行文件下载,首先需要安装它。可以在命令行中执行以下命令进行安装:

npm install request --save
로그인 후 복사
  1. 下载文件的基本步骤

使用Request模块下载文件的基本步骤与使用HTTP模块类似。下面是一个简单的例子:

const request = require('request');
const fs = require('fs');

const url = 'http://example.com/file.zip';
const filePath = './file.zip';

request(url)
  .pipe(fs.createWriteStream(filePath))
  .on('finish', () => {
    console.log('下载完成');
  })
  .on('error', (err) => {
    console.error(`请求下载文件出错: ${err.message}`);
  });
로그인 후 복사

在上面的代码中,我们使用request方法来创建HTTP请求,并将响应通过管道的方式写入一个文件流中。当下载完成时,我们输出“下载完成”的消息。

  1. 处理下载进度

要处理下载进度,可以使用request方法返回的请求对象。可以使用内置的Content-Length头来获取文件的大小。此外,Request模块提供了一个内置的progress事件,使我们可以跟踪下载的进度。下面是一个例子:

const request = require('request');
const fs = require('fs');

const url = 'http://example.com/file.zip';
const filePath = './file.zip';

const fileStream = fs.createWriteStream(filePath);
let downloadedLength = 0;

request(url)
  .on('response', (response) => {
    const contentLength = parseInt(response.headers['content-length']);
    console.log(`文件大小: ${(contentLength / 1024 / 1024).toFixed(2)} MB`);

    response.on('data', (data) => {
      downloadedLength += data.length;
      const percent = downloadedLength / contentLength * 100;
      console.log(`${percent.toFixed(2)}% downloaded`);
    });
  })
  .pipe(fileStream)
  .on('finish', () => {
    console.log('下载完成');
  })
  .on('error', (err) => {
    console.error(`请求下载文件出错: ${err.message}`);
  });
로그인 후 복사

在上面的代码中,我们使用response事件来获得文件的大小,并使用内置的data事件来计算和输出下载的百分比。

  1. 处理重定向

与HTTP模块类似,我们也可以使用Request模块来处理文件下载链接重定向的情况。下面是一个例子:

const request = require('request');
const fs = require('fs');

const url = 'http://example.com/file.pdf';
const filePath = './file.pdf';

function downloadFile(url, filePath) {
  request(url)
    .on('response', (response) => {
      const { statusCode } = response;

      if (statusCode === 301 || statusCode === 302) {
        console.warn(`文件重定向: ${response.headers.location}`);
        downloadFile(response.headers.location, filePath);
        return;
      }

      if (statusCode !== 200) {
        console.error(`请求下载文件出错: 状态码 ${statusCode}`);
        return;
      }

      response.pipe(fs.createWriteStream(filePath)).on('finish', () => {
        console.log('下载完成');
      });
    })
    .on('error', (err) => {
      console.error(`请求下载文件出错: ${err.message}`);
    });
}

downloadFile(url, filePath);
로그인 후 복사

在上面的代码中,我们使用statusCoderrreee

위 코드에서는 내장된 data 이벤트를 사용하여 다운로드 진행 상황을 추적하고 Content-Length 헤더를 사용합니다. 다운로드 비율을 계산합니다. 다운로드가 완료되면 "다운로드 완료" 메시지가 출력됩니다.

    리디렉션 처리

    🎜때때로 파일 다운로드 링크가 리디렉션될 수 있습니다. 응답 상태 코드가 301인지 302인지 확인하고 Location 헤더를 사용하여 리디렉션된 링크를 얻을 수 있습니다. 샘플 코드는 다음과 같습니다. 🎜rrreee🎜 위 코드에서는 httpClient 변수를 사용하여 프로토콜(http 또는 https)을 확인하고 statusCode를 사용하여 상태 코드를 확인합니다. 응답 . 301, 302인 경우 리디렉션된 메시지를 출력하고 파일을 다시 다운로드하세요. 200이 아니면 오류 메시지가 출력됩니다. 🎜🎜2. 요청 모듈을 사용하여 파일 다운로드🎜🎜Node.js에는 파일을 다운로드하는 데 사용할 수 있는 인기 있는 타사 모듈이 있으며, 그 중 가장 인기 있는 것은 요청 모듈입니다. . 요청 모듈은 Mikeal Rogers가 만든 간단하고 강력하며 사용자 친화적인 HTTP 클라이언트입니다. 🎜🎜🎜요청 모듈 설치🎜🎜🎜파일 다운로드에 요청 모듈을 사용하려면 먼저 설치해야 합니다. 명령줄에서 다음 명령을 실행하여 설치할 수 있습니다. 🎜rrreee🎜🎜파일 다운로드의 기본 단계🎜🎜🎜요청 모듈을 사용하여 파일을 다운로드하는 기본 단계는 HTTP 모듈을 사용하는 것과 유사합니다. 다음은 간단한 예입니다. 🎜rrreee🎜위 코드에서는 request 메서드를 사용하여 HTTP 요청을 생성하고 파이프를 통해 파일 스트림에 응답을 씁니다. 다운로드가 완료되면 "다운로드 완료" 메시지가 출력됩니다. 🎜
      🎜다운로드 진행 처리🎜🎜🎜다운로드 진행을 처리하려면 요청 메서드에서 반환된 요청 개체를 사용할 수 있습니다. 파일 크기는 내장된 Content-Length 헤더를 사용하여 얻을 수 있습니다. 또한 요청 모듈은 다운로드 진행 상황을 추적할 수 있는 내장 progress 이벤트를 제공합니다. 예는 다음과 같습니다. 🎜rrreee🎜위 코드에서는 response 이벤트를 사용하여 파일 크기를 가져오고 내장된 data 이벤트를 사용하여 계산합니다. 다운로드된 비율을 출력합니다. 🎜
        🎜리디렉션 처리🎜🎜🎜HTTP 모듈과 유사하게 요청 모듈을 사용하여 파일 다운로드 링크 리디렉션을 처리할 수도 있습니다. 예는 다음과 같습니다. 🎜rrreee🎜위 코드에서는 statusCode를 사용하여 응답의 상태 코드를 확인합니다. 301, 302인 경우 리디렉션된 메시지를 출력하고 파일을 다시 다운로드하세요. 200이 아니면 오류 메시지가 출력됩니다. 🎜🎜요약🎜🎜이 글에서는 Node.js에서 HTTP 모듈과 요청 모듈을 사용하여 파일을 다운로드하는 방법을 소개합니다. 여기에는 HTTP 모듈 및 요청 모듈을 사용하여 파일을 다운로드하고, 다운로드 진행률을 처리하고, 파일 다운로드 링크 리디렉션을 처리하는 기본 단계가 포함되어 있습니다. Node.js는 파일 다운로드를 쉽게 구현할 수 있는 매우 편리한 파일 다운로드 기능을 제공합니다. 🎜

위 내용은 nodejs에서 파일을 다운로드하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿