如何使用 StreamingResponse 将多个图像从 FastAPI 后端发送到 JavaScript 前端?

2023-12-31

我有一个 FastAPI 端点/image/ocr接受、处理并返回多个图像作为StreamingResponse:

async def streamer(images):
    for image in images:
        # Bytes
        image_bytes = await image.read()

        # PIL PNG
        image_data = Image.open(BytesIO(image_bytes))

        # Process
        # image_processed = ...
    
        # Convert from PIL PNG to JPEG Bytes
        image_ocr = BytesIO()

        image_ocr.save(image_processed, format='JPEG')

        yield image_ocr.getvalue()

@router.post('/ocr', summary='Process images')
async def ocr(images: List[UploadFile]):
    return StreamingResponse(
        streamer(images),
        status_code=status.HTTP_200_OK,
        media_type='image/jpeg'
    )

在我的 React 应用程序中,我将多个图像发送到/image/ocr使用 Axios 配置的端点arraybuffer,并将返回的图像转换为Base64 using btoa, String.fromCharCode and Unit8Array:

const imageSubmit = async data => {
    const formData = new FormData()
    
    // A `useRef` that stores the uploaded images
    data?.current?.files?.successful.map(image =>
        formData.append('images', image.data)
    )

    try {
        const response = await request.post(
            '/image/ocr',
            formData,
            {responseType: 'arraybuffer'}
        )

        const base64String = btoa(
            String.fromCharCode(
                ...new Uint8Array(response.data)
            )
        )

        const contentType = response.headers['content-type']

        const fullBase64String = `data:${contentType};base64,${base64String}`

        return fullBase64String
    } catch (error) {
        // Error log
    }
}

问题是我要发送多张图像,例如,这个图片 https://i.stack.imgur.com/hRD1f.png and 这个图片 https://i.stack.imgur.com/n3ozM.png,正在被端点接受、处理并返回/image/ocr,但是当我转换response.data使用最后一个代码片段中的方法我只得到一个Base64 image.

我看了一眼原始的response看看我是否可以迭代ArrayBuffer我通过了response.data:

数组缓冲区对象 https://i.stack.imgur.com/f0qBs.png

但它不起作用for(const image of response.data) {}。我看到了ArrayBuffer has a slice方法,但我不确定这是否意味着这两个图像都在ArrayBuffer我需要切片然后转换,这很奇怪,因为至少一张图像被转换为Base64截至目前,或将其转换为另一种类型,因为我看到它可以通过一些不同的方式完成here https://stackoverflow.com/questions/71313129/how-to-render-streamable-image-on-react-coming-from-fastapi-server, here https://nono.ma/fetch-multiple-images-or-files-at-once-with-promises-in-typescript and here https://javascript.info/blob.

If the slice选项是正确的,我不确定如何选择开始和结束,因为ArrayBuffer只是随机数和符号。

关于如何获取这两个图像的任何想法Base64在我的 React 应用程序上?


经过几个小时的研究,我放弃了 Axios文档 https://axios-http.com/docs/intro说它“从浏览器生成 XMLHttpRequests”,这意味着它不支持流。

阅读更多有关流API https://developer.mozilla.org/en-US/docs/Web/API/Streams_API并观看 Google 的系列节目Youtube https://www.youtube.com/watch?v=G9PpImUEeUA,我开始使用获取API https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API,因为它支持写入 (16:26) 和读取 (6:24) 流式传输。

通过更换try用这个来阻止我的问题:

const response = await fetch('http://localhost:4000/image/ocr', {
    method: 'POST',
    headers: {
        Authorization: ''
    },
    body: formData
})

const reader = response.body.getReader()

while (true) {
    const { value, done } = await reader.read()

    // Base64
    const base64 = `data:${response.headers['content-type']};base64,${btoa(String.fromCharCode(...new Uint8Array(value)))}`

    console.log(base64)

    if (done) break
}

我可以将异步生成器与StreamingResponse并在我的 React 应用程序中获取多个图像。

值得深入研究流 API,因为它也可以作为 Websocket 工作,而无需编写处理套接字的特定后端

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 StreamingResponse 将多个图像从 FastAPI 后端发送到 JavaScript 前端? 的相关文章

  • 不明白为什么 Chrome/Safari 无法在此处获取 ScrollHeight

    我只是问了一个问题 为什么某些 js 代码不能 100 在 Chrome 和 Safari 中工作 但经过更多故障排除后 我想我发现这是我应该发布的问题 我有一个页面 其中有一个表单 该表单的目标是同一页面上的 iframe iframe
  • Keras 中的条件批量归一化

    我正在尝试在 Keras 中实现条件批量标准化 我假设我必须创建一个自定义层 因此 我从正常化 https github com keras team keras blob master keras layers normalization
  • 群组名称不能以数字开头?

    看来我不能使用像这样的正则表达式 P lt 74xxx gt 0 9 重新打包会引发错误 sre constants error bad character in group name u 74xxx 我似乎无法使用以数字开头的组名称 为什
  • 在 pandas eval 中调用 round()、ceiling()、floor()、min()、max()

    正如标题所说 有没有办法在 pandas eval 中支持 round ceiling min max floor 函数 数据框 import pandas as pd import numexpr as ne op d ID 1 2 3
  • sqlalchemy,使用反向包含(不在)子列值列表中进行选择

    我在flask sqlalchemy 中有一个典型的帖子 标签 与一篇帖子相关的许多标签 关系 并且我想选择我提供的列表中未标记任何标签的帖子 首先 我建立的模型 class Post db Model id db Column db In
  • PyGTK TreeView 中的自动换行

    如何在 PyGTK TreeView 中自动换行文本 gtk TreeView 中的文本是使用 gtk CellRendererText 渲染的 文本换行归结为在单元格渲染器上设置正确的属性 为了让文本换行 您需要设置wrap width单
  • JavaScript 中的自定义“确认”对话框?

    我一直在开发一个使用自定义 模式对话框 的 ASP net 项目 我在这里使用吓人引号 因为我知道 模式对话框 只是我的 html 文档中的一个 div 它被设置为出现在文档其余部分的 顶部 而不是真正意义上的模式对话框 在网站的许多部分
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • 需要了解Javascript函数提升示例

    我阅读了 Javascript 提升的概念 它非常令人困惑 但我看到了一些示例并了解了提升的实际作用 所以基本上 提升是 JavaScript 的默认行为 即将所有声明移动到当前作用域的顶部 当前脚本或当前函数的顶部 但我无法理解以下实现
  • 如何在 django 中发出 post 请求后获取表单的名称?

  • ModuleNotFoundError:没有名为“googleapiclient”的模块

    如果这是一个愚蠢的问题 我深表歉意 我在 stackoverflow 上搜索过 但没有找到解决办法 我正在致力于从 Python 2 7 迁移到 Python 3 8 我收到一个程序的以下错误 请帮我 Traceback most rece
  • Google Apps 脚本:如何水平对齐 inlineImage

    我有以下代码 它是一个更大程序的一部分 我正在尝试将图像从我的 Google 驱动器插入到 Google 文档中 并调整其大小并居中 到目前为止 我能够让程序插入图像并调整其大小 但我不知道如何使 inlineImage 居中 我是使用谷歌
  • Jest 使用 window.require 测试 Electron/React 组件

    我目前正在创建一个使用 React 来创建界面的 Electron 应用程序 为了访问 fs 我一直在使用 const fs window require fs 在电子窗口中效果很好 问题是 当我为使用 window require fs
  • 已安装 cypress npm 软件包,但缺少 Cypress 二进制文件

    大家好 我是 azure devops CI 的新手 我正在尝试通过在作业之间缓存 node modules 来减少管道构建时间 但我遇到了无法解决的错误 我正在使用 cypress 进行测试 这是我的天蓝色管道 Node js Build
  • 如何使用 BeautifulSoup 只抓取可见的网页文本?

    基本上 我想用BeautifulSoup严格抓住可见文字在网页上 例如 这个网页 http www nytimes com 2009 12 21 us 21storm html是我的测试用例 我主要想获取正文 文章 甚至可能到处都有一些选项
  • Django populate() 不可重入

    当我尝试在生产环境中加载 Django 应用程序时 我不断收到此消息 我尝试了所有的 stackoverflow 答案 但没有任何解决办法 任何其他想法 我使用的是 Django 1 5 2 和 Apache Traceback most
  • 连接 Flask Socket.IO Server 和 Flutter

    基本上 我有一个套接字 io 烧瓶代码 import cv2 import numpy as np from flask import Flask render template from flask socketio import Soc
  • Rails 6 webpack 抛出“未捕获的引用错误:$未定义”

    大家好 我最近开始使用 ruby 2 6 5 开发 Rails 6 由于 Rails 6 引入了 webpack 所以我尝试使用 webpack 加载我的 js 文件 尽管我已经在 appliation js 中需要了 jquery 但我仍
  • 错误:Javascript 上的 [object Object]

    当我在 Firebug 中运行下面的 javascript 时 我不断收到错误 我已经尝试更改多项内容 但它仍然输出错误 我正在使用 api 从 XML 检索信息 然后将其输出到屏幕上 但我不断收到对象错误 有人能看出为什么吗 任何帮助表示
  • 使用自定义层运行 Keras 模型时出现问题

    我目前正在攻读学士学位论文FIIT STU https www fiit stuba sk en html page id 749 其主要目标是尝试复制和验证以下结果study http arxiv org abs 2006 00885 这

随机推荐