一、背景
随着 Serverless 架构的流行,越来越多的应用开始使用无服务器架构搭建,其中又以阿里云的 Serverless 应用最为常见,因此本文将以阿里云 Serverless 应用为例。
在 Serverless 应用中,经常需要使用对象存储(OSS)来存储和下载文件。但是,在实际应用中,我们可能会遇到使用 OSS 下载文件失败的情况。本文将探讨这个问题,并提供一些解决方法和注意点。
二、问题描述
在 Serverless 应用中使用 OSS 下载文件时,可能会出现以下错误:
Error: do not support download object with redirect
三、原因分析
这个错误的原因是因为 OSS 不支持带重定向的下载,而默认情况下,阿里云的 OSS Node.js SDK 会在下载时自动添加 followRedirects
选项,并将其设为 true,因此会出现以上错误。
四、解决方法
- 关闭重定向
第一种解决方法是在下载文件时,手动将 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; } };
- 添加 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; } };
五、注意点
- 如果下载的文件中包含重定向,那么需要手动设置
followRedirects
选项为 false; - 如果下载的文件是前端页面,需要添加
Referer
请求头指定来源地址。
六、总结
对于 Serverless 应用中使用 OSS 下载文件失败的问题,我们可以通过手动设置 followRedirects
选项为 false 或添加 Referer
请求头的方式来解决。同时,我们也需要注意在下载前,先了解文件下载链接中是否包含重定向,以及下载的文件是否需要来源地址。
希望本文对大家有所帮助,并可以在实际项目中得到应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659e10b2add4f0e0ff72982b