在Next.js中从Amazon S3下载文件时出现网络错误求助
从Amazon S3下载文件时遭遇网络错误
我尝试从Amazon S3下载文件,已经按要求配置了AWS配置文件,但调用相关方法时出现网络错误。以下是我的代码:
export const AWSDownload = (link = '') => { const s3 = new AWS.S3({endpoint: 's3Url',region: 'us-east-1',accessKeyId: AWS_Config.AWS_ACCESS_KEY_ID, secretAccessKey:AWS_Config.AWS_SECRET_ACCESS_KEY}) const params = { Bucket: AWS_Config.AWS_BUCKET, Key: `${link}` } const handleDownload = () => { return new Promise<string>((resolve, reject) => { console.log('Handling download called') s3.getObject(params, (err, data:any) => { console.log(data, 'response') if (err) { console.log(err, err.stack) reject(err) } else { if (data.Body) { let binary = '' const bytes:any = new Uint8Array(data.Body) const len:any = bytes.byteLength for (let i = 0; i < len; i++) { binary += String.fromCharCode(bytes[i]) } const b64encoded = `data:${data.ContentType};base64,${btoa(binary)}` resolve(b64encoded) } else { reject('Empty body') } } }) }) } return { downloadImage: handleDownload } } export const AWS_Config = { FILESYSTEM_DRIVER: 's3', AWS_ACCESS_KEY_ID: 'KeyID', AWS_SECRET_ACCESS_KEY: 'Secret Access Key', AWS_DEFAULT_REGION: 'us-east-1', AWS_BUCKET: 'Bucket' }
调用后出现网络失败错误,无法完成文件下载。
解决建议
- 修正Endpoint配置:代码里
endpoint设为了s3Url占位符,必须替换为实际的S3 endpoint。标准us-east-1区域可以省略该参数,或者填写https://s3.amazonaws.com;如果是其他区域或自定义存储服务,要填写对应区域的官方endpoint地址。 - 验证凭证与权限:确认你的AWS密钥对(
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY)拥有s3:GetObject权限,检查IAM策略是否允许访问目标Bucket及对应文件Key。 - 核对Bucket和Key信息:检查
AWS_BUCKET是否是正确的Bucket名称,link参数对应的文件Key在S3中确实存在,路径格式要正确(避免多余斜杠或拼写错误)。 - 排查网络与跨域限制:如果是浏览器环境,检查S3 Bucket的CORS配置是否允许当前域名发起请求;如果是服务器端,确认防火墙、代理没有阻止对S3的网络请求。
- 优化下载实现方式:当前手动转base64的方式效率较低,浏览器场景更推荐生成预签名URL直接下载,示例代码如下:
const handleDownload = () => { return new Promise<string>((resolve, reject) => { s3.getSignedUrl('getObject', params, (err, url) => { if (err) reject(err); resolve(url); // 前端可直接用此URL触发下载 }); }); }
内容的提问来源于stack exchange,提问作者NAJAF SIKANDER
相关产品推荐
相关产品推荐

