从勤杂工到请求帖子的管道流

2024-03-05

I have multipart/form-data我要发布到快速端点/data/upload,形成以下标记:

form(enctype="multipart/form-data", action="/data/upload", method="post")
  input(type="file", name="data")

我在用着busboy读取文件流,工作正常。从那里,我想再次发送流multipart/form-data到第二个 Java 后端,使用requestnpm 模块。 JS客户端/Java服务器代码如下:

  req.busboy.on('file', function (fieldName, fileStream, fileName, encoding, mimeType) {

    var reqBody = {
      url: server.baseURL + 'api/data',
      headers: {
        'Connection': 'keep-alive',
        'Content-Type': 'multipart/form-data'
      },
      formData: {
        file: fileStream
      }
    };

    request.post(reqBody, function (err, r, body) {
      // Do rendering stuff, handle callback
    });
 });

Java 端点(api/数据)

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void addData(FormDataMultiPart formDataMultiPart) {
  // Handle multipart data here      
}

我认为我没有正确发送文件multipart/form-data在这里......但我很难弄清楚如何从本质上通过管道传输流busboy直接到request无需从客户端的临时文件中读取/写入。有任何想法吗?

Java 堆栈跟踪:

Apr 27, 2016 5:07:12 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 3 * Server has received a request on thread qtp1631904921-24
3 > POST http://localhost:8080/api/data
3 > Connection: keep-alive
3 > Content-Length: 199
3 > Content-Type: multipart/form-data; boundary=--------------------------331473417509479560313628
3 > Host: localhost:8080

Apr 27, 2016 5:07:12 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 3 * Server responded with a response on thread qtp1631904921-24
3 < 400

17:07:13.003 [qtp1631904921-24] WARN  org.eclipse.jetty.http.HttpParser parseNext - bad HTTP parsed: 400 No URI for HttpChannelOverHttp@425137da{r=1,c=false,a=IDLE,uri=null}

拉哈特建议的改变:

 31     var reqBody = {
 32       url: server.baseURL + 'data',
 33       headers: {
 34         'Connection': 'keep-alive',
 35         'Content-Type': 'multipart/form-data'
 36       }
 37     };
 38 
 39     req.pipe(req.busboy.pipe(request.post(reqBody)));

抛出错误:

Error: Cannot pipe. Not readable.
   at Busboy.Writable.pipe (_stream_writable.js:154:22)

这里的问题是您需要手动为分段上传提供“Content-Length”,因为request https://github.com/request/request(以及底层的form-data https://github.com/form-data/form-data)自己无法弄清楚。 因此请求发送无效的 Content-Length: 199 (对于任何传入文件大小都相同),这会破坏 java 多部分解析器。

有多种解决方法:

1) 使用传入请求“Content-Length”

request.post({
  url: server.baseURL + 'api/data',
  formData: {
    file: {
      value: fileStream,
      options: {
        knownLength: req.headers['content-length']
      }
    }
  }
}, function (err, r, body) {
  // Do rendering stuff, handle callback
})

但这会产生一个有点不正确的请求,因为传入的长度包括其他上传字段和边界,但 Busboy 能够解析它而没有任何抱怨

2)等待文件被节点应用程序完全缓冲,然后将其发送到java

var concat = require('concat-stream')
req.busboy.on('file', function (fieldName, fileStream, fileName, encoding, mimeType) {
  fileStream.pipe(concat(function (fileBuffer) {
    request.post({
      url: server.baseURL + 'api/data',
      formData: {
        file: fileBuffer
      }
    }, function (err, r, body) {
      // Do rendering stuff, handle callback
    })
  }))
})

这会增加应用程序的内存消耗,因此您需要小心并考虑使用勤杂工限制 https://github.com/mscdex/busboy#busboy-methods

3)上传前将文件缓冲到磁盘(仅供参考)

  • express https://github.com/expressjs/express + multer https://github.com/expressjs/multer- 我建议对网络服务器使用express,它使事情更易于管理,并且multer基于busboy
  • 强大 https://github.com/felixge/node-formidable
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从勤杂工到请求帖子的管道流 的相关文章

随机推荐

  • 如何在 mariadb 中使用 -> 运算符查询 JSON 列

    我正在尝试获取时间表 将 json 列数据与 Laravel 项目中的以下代码进行比较 schedules Schedule where schedule with gt company person contact company per
  • Cassandra 3.10 debug.log 频繁包含“FailureDetector.java:457 - 忽略间隔时间...”

    我们的 Cassandra 3 10 集群之一的 debug log 文件经常出现类似于 FailureDetector java 457 忽略 的间隔时间 的消息 即使集群处于空闲状态 也会显示这些消息 我在这个 6 节点集群 两个数据中
  • 使用 Ruby 读取文件的上一行

    如何读取文件的前一行 与 IO gets 相反 我最初想将 IO lineno 设置为我想要读取的行号 但这并没有按预期工作 您实际上如何阅读前一行 一个简单的方法是记住您读过的上一行 prev nil File foreach vimrc
  • 如何获取未知 JSON 层次结构的总深度?

    我一直在努力寻找 构建一个递归函数来解析这个 JSON 文件并获取其子文件的总深度 该文件看起来像这样 var input name positive children name product service children name
  • 从点云到 Mat 的转换

    假设我初始化了一个点云 我想将其 RGB 通道存储在 opencv 的 Mat 数据类型中 我怎样才能做到这一点 pcl PointCloud
  • Chartjs 示例无法重现

    我希望从 Chartjs 文档中重现此示例的结果 https www chartjs org docs latest samples scales time line html https www chartjs org docs late
  • R 3.0.x 中的 RExcel

    兰德之友 http rcom univie ac at download html RAndFriends 其中包括运行所需的所有项目RExcel 仅包括R 2 15 2 我目前使用的是最新版本R but rcom 2 3 1 and rs
  • Android StaggeredGridLayoutManager 偏移错误

    当你清除你的adapter并打电话notifyDataSetChanged 交错网格布局管理器经理还有mCachedStart End in Span 实例 因此 当您向适配器添加新项目时 布局管理器会使用以下命令绘制项目offset 这是
  • 修改可变对象的方法?

    鉴于函数式编程在尽可能坚持不可变变量时是最好的 并且 Ramda 总是进行浅拷贝 那么对象如何must在大多数纯功能框架中处理可变的问题 例如 考虑 PIXI Sprite 在 pixi js 中 显示系统具有链接在一起的固有层次结构 并且
  • 在堆积条形图中添加组之间的间距

    假设我有一个带有分组条形的条形图 酒吧有一个大团体和多个非常小的团体 组标签位于组上 为了增加可读性 我想在组之间引入一定的间距 我使用以下代码和图像编辑器创建了一个示例图像 library ggplot2 g lt ggplot mpg
  • 指示函数使用“参数”对象的最清晰方法是什么?

    指示函数使用 参数 对象的最佳方式是什么 这显然是基于意见的 但是有任何约定吗 什么时候使用参数数组更好 一些例子 Function takes n arguments and makes them pretty function many
  • 如何将 JWT 令牌存储在仅 HTTP 的 cookie 中?

    我创建了一个应用程序 它仅使用服务器根据正确的登录凭据发送的 JWT 并对任何内容进行授权 api我的后端 Express js 服务器上的路由 另一方面 AngularJS 获取此令牌 将其存储在会话存储中 并每次都使用身份验证拦截器将令
  • 组件未显示在 Vue DevTools 中

    有人遇到过这个问题吗 我正在使用 Vue Devtools 但无法检查任何组件 因为没有显示任何组件 没有根组件或任何东西 几乎只是一个空白的开发工具 我是 Vue 新手 所以我确信我错过了一些明显的东西 我正在使用 webpack cli
  • Nestjs Config 访问引导级别的配置

    根据这个文档 https www npmjs com package nestjs config您在 AppModule 中导入您的配置 我正在尝试访问 main ts 文件中引导级别的配置 像这样的事情 const app await N
  • 可以从桌面应用程序调用 EJB 吗?

    我是 Java EJB 3 0 的新手 是否可以从桌面应用程序客户端调用部署在 JBoss 上的 会话 bean 提前致谢 是的你可以 这里有一些细节 参考 EJB2 但当涉及到远程客户端时 EJB3 也是如此 http www these
  • 将 Bing 地图引用添加到 Windows Phone 8.1 项目

    我想在 Windows Phone 8 1 C 项目中添加对 Bing 地图的引用 我已经安装了这个包http visualstudiogallery msdn microsoft com 224eb93a ebc4 46ba 9be7 9
  • 如何在 WP8 上打开 Facebook 应用程序以共享链接?

    我想知道如何打开官方 Facebook 应用程序以从 Windows Phone 上的 C 代码共享 URI 常见的 Uri Scheme 如下 fb 可以打开应用程序 但似乎没有参数起作用 我有这样的想法 但它对我不起作用 LaunchU
  • 如何引用类中最终静态字段的值?

    使用 JavaDoc 如何引用类中最终静态字段的值 我想要 在此示例中替换为字段的值STATIC FIELD This is a simple class with only one static field with the value
  • 我的安装程序如何有选择地删除一些最初并非创建的文件?

    我将所有程序的设置存储在 appdata 目录 appdata MyProgram 中 当出现问题而用户必须重新安装时 我想询问是否删除该目录中的数据 我正在使用 Inno Setup 并添加了一个自定义页面来提示用户 if DirExis
  • 从勤杂工到请求帖子的管道流

    I have multipart form data我要发布到快速端点 data upload 形成以下标记 form enctype multipart form data action data upload method post i