[axios] Cómo reanudar la descarga de archivos binarios de Excel en axios

Utilice Axios para descargar archivos binarios de Excel e interrumpir y reanudar descargas. Aquí tienes una forma básica de hacerlo:

1. Antes de iniciar la descarga, asegúrese de que se haya utilizado Axios en su proyecto (se puede instalar utilizando npm o hilo).

2. Cree una función para descargar y use axios.get() para iniciar una solicitud de descarga de archivos. Como sigue:

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

// 下载函数
async function downloadExcelFile(url, outputPath, headers = {
     
     }) {
    
    
  const writer = fs.createWriteStream(outputPath, {
    
     flags: 'a' });
  
  const response = await axios.get(url, {
    
    
    responseType: 'stream',
    headers,
  });

  response.data.pipe(writer);

  // 返回一个 Promise,以便在外部处理下载过程
  return new Promise((resolve, reject) => {
    
    
    writer.on('finish', resolve);
    writer.on('error', reject);
  });
}

// 调用下载函数
downloadExcelFile('http://example.com/excel-file.xls', 'output.xls')
  .then(() => {
    
    
    console.log('文件下载完成');
  })
  .catch((error) => {
    
    
    console.error('文件下载失败', error);
  });

3. Agregue soporte para interrumpir y reanudar descargas a la función de descarga existente. Puede usar el encabezado de solicitud de rango para controlar la posición del bloque solicitado. Modifique la función de descarga de la siguiente manera:

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

// 下载函数
async function downloadExcelFile(url, outputPath, headers = {
     
     }) {
    
    
  let startByte = 0;

  if (fs.existsSync(outputPath)) {
    
    
    // 如果已经存在输出文件,则获取已下载的文件大小
    const stats = fs.statSync(outputPath);
    startByte = stats.size;

    // 通过设置 Range 请求头来指定从哪个位置继续下载
    headers['Range'] = `bytes=${
      
      startByte}-`;
  }

  const writer = fs.createWriteStream(outputPath, {
    
     flags: 'a' });

  const response = await axios.get(url, {
    
    
    responseType: 'stream',
    headers,
  });

  response.data.pipe(writer);

  // 返回一个 Promise,以便在外部处理下载过程
  return new Promise((resolve, reject) => {
    
    
    writer.on('finish', resolve);
    writer.on('error', reject);
  });
}

// 调用下载函数
downloadExcelFile('http://example.com/excel-file.xls', 'output.xls')
  .then(() => {
    
    
    console.log('文件下载完成');
  })
  .catch((error) => {
    
    
    console.error('文件下载失败', error);
  });

Con la modificación anterior, la función de descarga verificará si el archivo de salida ya existe. Si existe, use Rangeel encabezado de solicitud para especificar que la descarga continuará a partir del tamaño del archivo descargado, realizando la función de interrumpir y reanudar la descarga.

Tenga en cuenta que el servidor debe admitir y manejar correctamente Rangelos encabezados de solicitud y al mismo tiempo garantizar la transferencia y reanudación correctas del contenido del archivo. Asegúrese de que la información del encabezado de respuesta esté configurada correctamente en el lado del servidor. La descarga del currículum del punto de interrupción del front-end en realidad se basa en protocolos y soporte del lado del servidor.

Supongo que te gusta

Origin blog.csdn.net/hzxOnlineOk/article/details/133087091
Recomendado
Clasificación