在JS中使用@google/generative-ai直接上传内存Base64图片的方案咨询
直接从内存上传Base64图片到Gemini的替代方案
核心思路
官方SDK的GoogleAIFileManager.uploadFile仅支持本地文件路径,但我们可以直接调用谷歌文件上传REST API,将Base64解码后的二进制数据直接作为请求体上传,跳过本地存储的冗余步骤。
实现步骤
- 解码Base64字符串为二进制Buffer(Node.js环境)或Blob(浏览器环境)
- 构造符合要求的
multipart/form-data请求,包含文件元信息和二进制数据 - 发送POST请求到谷歌的文件上传端点,携带API Key
- 解析响应获取文件对象,该对象与SDK返回的结构一致,可直接用于后续Gemini模型调用
Node.js环境代码示例
async function uploadBase64ToGemini(base64Data, mimeType, displayName, apiKey) { // 移除Base64前缀(如果存在)并解码为Buffer const cleanBase64 = base64Data.replace(/^data:image\/\w+;base64,/, ''); const fileBuffer = Buffer.from(cleanBase64, 'base64'); // 构造multipart/form-data表单 const formData = new FormData(); // 添加元数据字段(JSON格式) formData.append('metadata', JSON.stringify({ mimeType: mimeType, displayName: displayName }), { contentType: 'application/json' }); // 添加文件二进制数据 formData.append('file', fileBuffer, { filename: displayName, contentType: mimeType }); // 发送上传请求 const response = await fetch(`https://generativelanguage.googleapis.com/v1/files/upload?key=${apiKey}`, { method: 'POST', body: formData }); if (!response.ok) { throw new Error(`上传失败: ${await response.text()}`); } const uploadedFile = await response.json(); console.log(`上传文件 ${uploadedFile.displayName} 成功,文件ID: ${uploadedFile.name}`); return uploadedFile; } // 使用示例 const yourBase64Image = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAAAAAAAD..."; // 替换为你的Base64图片数据 const yourApiKey = "YOUR_GEMINI_API_KEY"; // 替换为你的Gemini API Key async function processImage() { try { const file = await uploadBase64ToGemini(yourBase64Image, "image/jpeg", "memory-uploaded-image.jpg", yourApiKey); // 后续调用Gemini模型示例 const genAI = new GoogleGenerativeAI(yourApiKey); const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" }); const result = await model.generateContent([file, "请描述这张图片的内容"]); console.log(result.response.text()); } catch (error) { console.error('处理出错:', error); } } processImage();
说明
- 该方法基于谷歌官方公开的REST API实现,与SDK的上传逻辑完全等价
- 无需本地文件读写,直接在内存中完成Base64解码和上传流程
- 返回的
uploadedFile对象结构与GoogleAIFileManager.uploadFile返回的一致,可无缝对接后续的Gemini模型调用
内容的提问来源于stack exchange,提问作者iso53
相关产品推荐
相关产品推荐

