You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:25:18