Sanity.io API 从 URL 上传图像

问题描述 投票:0回答:2

从 slack#help 频道交叉发布...

我正在为客户创建一个包含博客组件的 Sanity/Nuxt 网站。他的主要营销来源是 Instagram,由于 Instagram 的 API 只允许发布单张图片,所以我尝试以相反的方式进行处理。我正在设置一个 Netlify 函数,客户端将粘贴到 Instagram 帖子的链接,该函数将使用 /?__a=1 技巧通过 URL 获取所有关联图像,以从 Instagram 获取公共数据。我想做的是从所述 Instagram 帖子中获取所有图像,将它们作为资产上传,然后利用所述上传的图像创建博客帖子。我修改了内置的 Netlify 函数来创建一个 Sanity 文档,其中我将图像作为 arrayBuffer 拉取,将其转换为“base64”,然后尝试上传。

当我尝试运行在 https://gist.github.com/jeffpohlmeyer/d9824920fc1eb522ceff6380edb9de80 找到的文件时,出现以下错误:

body: {
       statusCode: 400,
       error: 'Bad Request',
       message: 'Invalid image, could not read metadata',
       details: 'Input buffer contains unsupported image format'
     },

任何人都可以建议我可以做到这一点的方法吗?作为替代方案,我想我可以只链接到 Instagram 上托管的 URL,而不是在 Sanity 中托管图像,但这会让客户很难维护,例如,Instagram 帖子发生变化或者他想要更改封面图片,选择 URL 而不是图像会很困难。

instagram sanity netlify-function
2个回答
0
投票

在我的回复中尝试了相同的操作:

async function uploadImage(){
const image = await axios.get(
    '<<url>>',
    { responseType: 'arraybuffer' }
  )
  const data = Buffer.from(image.data, 'binary');

  client.assets
    .upload('image', data)
    .then(() => {
      console.log('Done!')
    })
    .catch((err) => {
      console.log('err', err)
      return { statusCode: 400 }
    })
}
uploadImage();

只需删除已完成的 base64 转换即可,这应该可以工作


0
投票

假设:

您的图像是您的 Sanity Document 上的数组;

您正在使用 Sanity Javascript 客户端;

import { client } from "@/lib/sanity/client";
import streamifier from 'streamifier';

async function saveImage(postData, imageUrl){
    const imageBuffer = await fetch(imageUrl).then((response) => response.blob()).then((blob) => blob.arrayBuffer()).then((arrayBuffer) => Buffer.from(arrayBuffer))
    const updatedPost = await client.assets
        .upload('image', await streamifier.createReadStream(imageBuffer), {
            filename: postData?._id+'-' + await Date.now()
        })
        .then(async imageAsset => {
            return await client
                .patch(postData?._id)
                .setIfMissing({ images: [] })
                .insert("after", "images[-1]", [
                    {
                        asset: {
                            _type: "reference",
                            _ref: imageAsset._id
                        }
                    },
                ])
                .commit({autoGenerateArrayKeys: true})
                .catch((e) => { console.log(e)})
            })
            .catch((e) => { 
                console.log(e)
                return e
            })
        return (updatedPost)
    }
© www.soinside.com 2019 - 2024. All rights reserved.