Serverless 应用中使用 OSS 下载文件失败解决方法

一、背景

随着 Serverless 架构的流行,越来越多的应用开始使用无服务器架构搭建,其中又以阿里云的 Serverless 应用最为常见,因此本文将以阿里云 Serverless 应用为例。

在 Serverless 应用中,经常需要使用对象存储(OSS)来存储和下载文件。但是,在实际应用中,我们可能会遇到使用 OSS 下载文件失败的情况。本文将探讨这个问题,并提供一些解决方法和注意点。

二、问题描述

在 Serverless 应用中使用 OSS 下载文件时,可能会出现以下错误:

Error: do not support download object with redirect

三、原因分析

这个错误的原因是因为 OSS 不支持带重定向的下载,而默认情况下,阿里云的 OSS Node.js SDK 会在下载时自动添加 followRedirects 选项,并将其设为 true,因此会出现以上错误。

四、解决方法

  1. 关闭重定向

第一种解决方法是在下载文件时,手动将 followRedirects 选项设为 false。示例代码如下:

const OSS = require('ali-oss');
const ossClient = new OSS({
  accessKeyId: 'accessKeyId',
  accessKeySecret: 'accessKeySecret',
  endpoint: 'endpoint',
  bucket: 'bucket',
});

exports.handler = async (event, context, callback) => {
  const fileKey = 'example.jpg';
  const returnUrl = 'returnUrl';

  try {
    const result = await ossClient.get(fileKey, {
      followRedirects: false,
      headers: {
        'Referer': returnUrl,
      },
    });
    console.log(result);
    // 在这里可以对返回的文件进行处理
  } catch (e) {
    console.log(e);
    return e;
  }
};
  1. 添加 Referer 请求头

如果文件下载链接中带有重定向,那么在下载前,我们需要添加一个请求头,指定下载链接的来源地址。可以添加 Referer 请求头来解决这个问题。示例代码如下:

const OSS = require('ali-oss');
const ossClient = new OSS({
  accessKeyId: 'accessKeyId',
  accessKeySecret: 'accessKeySecret',
  endpoint: 'endpoint',
  bucket: 'bucket',
});

exports.handler = async (event, context, callback) => {
  const fileKey = 'example.jpg';
  const returnUrl = 'returnUrl';

  try {
    const result = await ossClient.get(fileKey, {
      headers: {
        'Referer': returnUrl,
      },
    });
    console.log(result);
    // 在这里可以对返回的文件进行处理
  } catch (e) {
    console.log(e);
    return e;
  }
};

五、注意点

  1. 如果下载的文件中包含重定向,那么需要手动设置 followRedirects 选项为 false;
  2. 如果下载的文件是前端页面,需要添加 Referer 请求头指定来源地址。

六、总结

对于 Serverless 应用中使用 OSS 下载文件失败的问题,我们可以通过手动设置 followRedirects 选项为 false 或添加 Referer 请求头的方式来解决。同时,我们也需要注意在下载前,先了解文件下载链接中是否包含重定向,以及下载的文件是否需要来源地址。

希望本文对大家有所帮助,并可以在实际项目中得到应用。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659e10b2add4f0e0ff72982b


纠错反馈