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

如何将OpenAI/DALL·E生成的图片保存至S3存储桶

将DALL·E生成的图片保存到AWS S3存储桶

我已经实现了从OpenAI/DALL·E获取图片URL并转换为Buffer的功能,相关代码如下:

const configuration = new Configuration({
  apiKey: procEnvVars.OPENAI_API_KEY,
});
export const openai = new OpenAIApi(configuration);

const defaultImageParams: CreateImageRequest = {
  n: 1,
  prompt: "a bad request message",
};

interface InputParams extends CreateImageRequest {
  prompt: string; // 强制要求传入prompt参数
}

// 将OpenAI返回的图片URL转换为Buffer
export async function getBufferFromUrl(openAiUrl: string) {
  const axiosResponse = await axios({
    url: openAiUrl,
    method: "GET",
    responseType: "arraybuffer",
  });
  const data = axiosResponse.data;
  if (!(data instanceof Buffer))
    throw new Error("Axios响应数据应为Buffer类型");

  return data;
}

// 从OpenAI获取生成的图片URL列表
export async function getUrlFromOpenAi(inputParams: InputParams) {
  const ImageResponse = await openai.createImage({
    ...defaultImageParams,
    ...inputParams,
  });

  const dataArray = ImageResponse.data.data;
  if (!dataArray || dataArray.length === 0) {
    console.error({
      error: "createOpenAiImage()未返回图片数据",
      data: ImageResponse.data,
      datadata: ImageResponse.data.data,
    });
  }
  return dataArray;
}

后续实现:将Buffer上传到S3存储桶

步骤1:安装AWS SDK依赖

推荐使用AWS SDK v3,执行以下命令安装:

npm install @aws-sdk/client-s3

步骤2:配置S3客户端

从环境变量读取凭证和区域,创建S3客户端实例:

import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";

const s3Client = new S3Client({
  region: process.env.AWS_REGION,
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  },
});

步骤3:编写S3上传函数

实现将Buffer上传到指定S3桶的逻辑:

export async function uploadBufferToS3(buffer: Buffer, bucketName: string, key: string, contentType: string = 'image/png') {
  const params = {
    Bucket: bucketName,
    Key: key, // S3存储路径,例如`generated-images/${Date.now()}.png`
    Body: buffer,
    ContentType: contentType,
  };

  try {
    const command = new PutObjectCommand(params);
    await s3Client.send(command);
    console.log(`图片已上传至S3:s3://${bucketName}/${key}`);
    return { success: true, key };
  } catch (error) {
    console.error('S3上传失败:', error);
    throw new Error(`上传S3出错:${(error as Error).message}`);
  }
}

步骤4:整合完整流程

将生成图片、转Buffer、上传S3的逻辑串联:

export async function generateAndSaveImageToS3(inputParams: InputParams, bucketName: string) {
  // 获取图片URL列表
  const imageDataList = await getUrlFromOpenAi(inputParams);
  if (!imageDataList || imageDataList.length === 0) {
    throw new Error('未获取到DALL·E生成的图片URL');
  }

  // 处理第一张图片(若n>1可循环遍历所有图片)
  const firstImage = imageDataList[0];
  if (!firstImage.url) {
    throw new Error('图片URL不存在');
  }

  // 转换为Buffer
  const imageBuffer = await getBufferFromUrl(firstImage.url);

  // 生成唯一S3存储键名
  const s3Key = `dalle-generated/${Date.now()}-${Math.random().toString(36).slice(2, 10)}.png`;

  // 上传至S3
  return await uploadBufferToS3(imageBuffer, bucketName, s3Key);
}

注意事项

  • 确保环境变量配置好OPENAI_API_KEY、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION
  • DALL·E默认生成PNG格式图片,若需处理其他格式,需调整contentType参数
  • S3存储桶需配置对应权限,确保上传账号拥有s3:PutObject权限

内容的提问来源于stack exchange,提问作者JimmyTheCode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:35:20