我尝试在Next.js应用程序中裁剪图像,将其发送到应用程序中的API路径,最后发送到应用程序外部的API端点。如果我绕过API路径,它可以正常工作,但通过它时就不行了。图像数据不再正确,无法处理。
客户端(Next.js)--〉API路由(Next.js)--〉API端点(外部)
客户端(Next.js)-通过POST
使用FormData
async function handleSave(image: Blob) {
const file = new File([image], 'avatar.png', { type: 'image/png' })
const data = new FormData()
data.append('imageFile', file)
const response = await fetch(`/api/users/${userId}/media/avatar`,
{
body: data,
method: 'POST',
}
)
// const response = await fetch (`https://localhost:1337/user/${userId}/media/avatar`, {
// method: 'POST',
// headers: {
// "Authorization": `Bearer <JWT token>`,
// },
// body: data
// })
if (response.ok) {
// handle
}
}
注解掉的提取是我测试直接调用外部API端点的地方,这工作正常。
API Route(Next.js)-从客户端获取请求并将其转发到外部API端点。
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
await cors(req, res)
const { userId } = req.query;
const { accessToken } = await getToken({ req, secret });
const response = await fetch(`${process.env.API_HOST}/user/${userId}/media/avatar`, {
method: 'POST',
headers: {
"Authorization": `Bearer ${accessToken}`,
"Content-Type": req.headers["content-type"]
},
body: req.body
})
try {
const json = await response.json();
console.log(json)
}
finally { }
res.end()
}
API端点(外部)
- ASP.Net核心Web应用编程接口
- 请求应为
multipart/form-data
- 请求应包含
imageFile
中的图像并Map到IFormFile
一旦请求通过API路由传递并发送到外部API,图像流就不再有效。我可以看到IFormFile
对象已经选择了imageFile
OK并获得了相关数据。
当我绕过Next.js API路由时,上传工作正常,而且我注意到IFormFile
对象的长度要小得多。
通过Next.js API路由是很重要的,因为它处理将访问令牌传递到外部API的过程,而不是公开该API。
我已经看过Create upload files api in next.js,但我不确定formidable
是否适合这种情况?
4条答案
按热度按时间5lhxktic1#
经过大量的挖掘和经历了许多不同的方法,我终于找到了一个工作。
multipart/form-data
文件。formidable
读取文件,首先将其保存到磁盘,然后使用fs
读取该文件,最后在FormData
中使用该文件。cclgggtu2#
我遇到了同样的问题,最后我找到了一个很优雅的方法来解决它。
解决方案来源:https://github.com/vercel/next.js/discussions/15727#discussioncomment-1094126
为了以防万一,我从源代码中复制代码:
文件上载组件
/api/上载.ts:
kcugc4gi3#
我也遇到了同样的问题。我使用nextjs api作为另一个api服务器的代理,在我的例子中,我只是传递了整个请求而不是主体,指定nextjs不解析请求。我唯一需要包含的是原始请求的头部。
h43kikqp4#
在当前时间内此代码将工作
在/pages/api/upload.ts中找到###
/pages/index.tsx中的###文件夹