探索大小限制:API 响应 Base64 可查看,最大 1 MB,呈现挑战

Exploring Size Limitations: API Response Base64 Viewable Up to 1 MB, Rendering Challenges

提问人:ullas kunder 提问时间:11/17/2023 最后编辑:ullas kunder 更新时间:11/17/2023 访问量:30

问:

我目前在尝试上传较大图像(大于 1 MB)时在 Next.js 应用程序中面临挑战。虽然该应用程序在处理较小图像时运行流畅,但引入较大图像会带来困难。

以前,该问题会导致浏览器控制台错误,特别是 GET net:ERR_INVALID_URL 错误。更新后,该错误已得到解决,但出现了一个新的挑战——无法预览大尺寸的 base64 图像。

我在代码中实现了一个基本的工作流程:

  1. 上传图像 => POST 到 api/ 端点 => 接收图像响应 => 在前端显示响应作为预览。

环境:

  • 节点:18.16.1
  • 下一步: 14.0.2
  • 反应:18.2.0
  • 反应多元:18.2.0

虽然可以使用其他图像服务或 multer 等替代方案,但我目前的重点是了解为什么会出现此问题。

CodeSandbox:沙盒链接

主要目标:

  • 从 Next.js API 成功进行映像 POST [已检查]
  • 从 API 接收图像作为前端的响应,而不会出现错误 [已选中]
  • 探索从 Next.js API POST 响应渲染图像或预览的改进方法。

更新: 我已经对其中的函数进行了调整,以避免GET错误:getImageBufferapi/upload/route.ts

async function getImageBuffer(base64String: string): Promise<Buffer> {
  // Decode the base64 string
  return Buffer.from(base64String.split(",")[1], "base64");
}

但是,另一个观察结果是,虽然 API 响应 base64 在最大 1 MB 内可见,但超过此限制,字符串大小会变得太大,从而阻碍完整的图像渲染。

进一步查询: 我也对优化图像预览感兴趣。从 API 获取 base64 图像响应以在前端显示后,有没有办法在不影响质量的情况下呈现较小尺寸的预览(小于 1 MB)以加快加载速度?

JavaScript reactjs next.js base64

评论

0赞 traktor 11/17/2023
您能否澄清在“上传图像 => POST api/ 端点 => 在 FE 中返回图像响应 => 作为预览”场景中发生 HTTP GET 操作的位置和方式?我本来以为(预览)图像会被发送回 FE 以响应用于上传请求的 POST。请使用您希望提供的任何详细信息来编辑问题,而不是在评论中提供它们
0赞 ullas kunder 11/17/2023
在“上传图像 => POST api/ 端点 => 在 FE show response as a preview 中返回图像响应 =>”场景中,没有明确提及 HTTP GET 操作。图像应发送回前端,以响应用于上传的 POST 请求。该问题似乎与处理前端的响应有关,尤其是在处理较大的图像(大于 1 MB)时,导致偶尔出现 net:ERR_INVALID_URL 错误。重点是理解和解决此响应处理问题,而不是显式 GET 操作。

答:

0赞 cbreezier 11/17/2023 #1

您将图像作为 base64 编码的图像数据 url 返回。

这意味着当您上传 1MB 的图像时,您将返回一个带有...其中大约有 130 万个字符。

虽然规范中没有对最大 URL 长度的技术限制,但浏览器通常有硬性限制。

几年前,常见的建议是将 URL 中的字符保持在 2k 个字符以下。老实说,我很惊讶 Chrome 在告诉您 URL 无效之前获得了接近 100 万个字符。

评论

0赞 ullas kunder 11/17/2023
我知道它的负载太大了,我没有找到任何解决方案或替代的最佳方法来完成这项任务,如果可能的话,从头开始
1赞 cbreezier 11/18/2023
您需要返回包含(或您正在使用的任何图像类型)的响应,而不是 base64 编码的字符串。使用实际图像进行响应将使用更少的带宽(base64 使用 4 个字节来表示 3 个字节的原始数据),并为您省去很多麻烦。Content-Type: image/png
1赞 cbreezier 11/18/2023
对于图像大小调整,请查看无服务器解决方案的 aws.amazon.com/solutions/implementations/...,或者如果您想自己调整图像大小,请仅使用底层开源库。sharp