javascript - 如何将包含图像文件的流发送到环回中的远程方法?

标签 javascript node.js loopback

我目前正在尝试使用环回生成一个 API,它允许我发送手写字符的 28x28 图像文件,并让 tensorflow 网络处理图像并返回网络认为字符是什么的预测。

然而,为了做到这一点,我需要能够发送要处理的图像,而不必先将文件保存在服务器上,但我找不到如何做这样的事情。诸如 loopback-component-storage 之类的模块很棒,但我不想使用一个路由发送图像,另一个路由处理该图像,然后第三个路由删除包含该图像文件的容器,使过程需要三个不同的请求。

因此归结为这一点,有没有什么方法可以将图像附加到请求中,这样流就可以被 API 读取和解释,而不必先在服务器上的其他地方保存文件的副本?

提前致谢

最佳答案

我推荐以下解决方案:

首先,将您的服务器中间件配置为解析图像请求主体:

  1. 安装body-parser 依赖项。

    $ npm install --save body-parser
    
  2. 配置 raw通过将以下内容添加到 server/middleware.json 文件的 parse 部分来解析器:

    {
      "body-parser#raw": {
        "limit": "100kb",
        "type": "image/*"
      }
    }
    

    “限制”选项设置允许的最大请求正文大小。您不想允许任意大小以防止恶意客户端因“内存不足”错误而使您的服务器崩溃。

    “type”选项配置应该被这个中间件解析的内容类型。在我上面的示例中,我允许所有图像类型。

接下来,实现一个接受请求正文的远程方法。感谢原始正文解析器,正文流将已经为您转换为 Buffer。在下面的示例中,我有一个使用 base64 编码正文进行响应的简单方法。

module.exports = function(Image) {
  Image.analyze = async function(data) {
    // Reject non-image requests, e.g. JSON
    if (!Buffer.isBuffer(data)) {
      const err = new Error('Unsupported media type'); 
      err.statusCode = 415;
      throw err;
    }

    // data is a Buffer containing the request body
    return data.toString('base64');
  };

  Image.remoteMethod('analyze', {
    accepts: [
      // {source: 'body'} is the important part
      {arg: 'data', type: 'object', http: {source: 'body'}},
    ],
    returns: {root: true, type: 'string'},
    http: {path: '/analyze', verb: 'post'},
  });
};

关于javascript - 如何将包含图像文件的流发送到环回中的远程方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53007753/

相关文章:

javascript - 如何在特定时间间隔后显示 react.js 中的每个数组对象?

javascript - 是否可以编写一个使用 web 套接字进行传输的 javascript SSH 客户端?

javascript - 如何使用 Electron 将文件传输到usb mount

java - 环回连接失败

node.js - 如何在环回 4 mongoDB 中使模型属性唯一?

javascript - Loopback 4 测试前空数据库

javascript - 拒绝执行 JavaScript URL,因为它违反了以下内容安全策略指令 :

javascript - Window.close 在 Google-chrome-frame 中不起作用

javascript - Ruby 到 Javascript => 令人头疼的日期计算

javascript - 是否可以将常规 Javascript 库转换为 NodeJS 库?