如何将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
相关产品推荐
相关产品推荐

