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

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(使用前将#替换为@)

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

  • 如何在 jQgrid 中隐藏列但在添加/编辑面板中显示此列

    我想要一种我使用的控制形式 但字段数量太高了 如何显示网格 但只有表单添加 编辑弹出面板中的某些字段显示所有字段 以下是您可以执行此操作的方法 colModel name email label E mail editable true h
  • 如何按日期升序对对象进行排序?

    如果我有一个对象列表 var objectList LIST OF OBJECT each object列表中包含三个属性 name date gender 如何按 对列表中的对象进行排序date 属性升序 the date 属性包含字符串
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • 如何查明在 Chrome 控制台中按下按钮时会调用哪些函数?

    我正在尝试自学 Google Closure javascript 库 我正在检查 TreeControl UI 小部件 如何使用Chrome控制台分析当我点击下面演示中的 剪切 按钮时运行了哪些功能 例如 我可以为此设置一个断点吗 我尝试
  • 如何在 d3.js 中填充 svg 圆圈内的图像

    这是我在 svg 中填充圆圈的代码 var svgContainer d3 select body append svg attr width 1000 attr height 1000 var circles svgContainer s
  • 在 Hibernate 的 XML 配置文件中指定默认值

    我通过映射配置文件配置 Hibernate
  • Java中如何将Object[]转换为String[]?

    我有一个关于 Java 的问题 我有一个Object Java默认的 不是用户定义的 我想将它转换为String 谁能帮我 谢谢 这是转换 for int i 0 i lt objectArr length i try strArr i o
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • 使用Doctype让scrollTop返回0,为什么?

    当我将此 Doctype 放入我的文档中时document body scrollTop返回零 这是为什么 当您使用该 Doctype 时 您会将每个当前浏览器放入所谓的几乎标准模式 http hsivonen iki fi doctype
  • LINQ SingleOrDefault() 等效项

    在 Typescript 中 我经常使用这种模式 class Vegetable constructor public id number public name string var vegetable array new Array
  • 使用 System.js 导入 Typescript 编译的模块时出错

    我最近正在学习使用 system js 导入由 Typescript 编译的模块 这些模块之前是为 require js 编译的 并且工作正常 但是合并到system js时 应用时无法导入模块系统生产 js 控制台说 Uncaught i
  • 如何预先填充 JFileChooser 将“文件名”?

    我打算用数据库中的名称填充 JFileChooser 但使用标准 JFileChooser 对话框进行加载 删除 保存和另存为 我想给用户留下这样的印象 他们正在处理文件系统 而在后端使用数据库来保存更改 用户不应该能够浏览到不同的目录进行
  • 为什么找不到 getservletcontext?

    我正在尝试使用getServletContext getRealPath 但我不断收到此错误 cannot find symbol symbol method getServletContext location interface jav
  • Java无损保存原始JPEG

    如下所示 我有第一张图像是原始 JPEG 图像 第二张图像用于缓冲图像 然后使用保存http www lac inpe br JIPCookbook 6040 howto compressimages jsp http www lac in
  • 原子整数的compareandexchange()与compareandset()

    在研究 AtomicInteger 时 我发现这个 API 提供了两种方法 比较和交换 如果当前值被引用 则自动将该值设置为 newValue to 作为见证值 预期值 记忆效应为 由指定VarHandle compareAndExchan
  • 如何使 CSS 动画/过渡以固定速度而不是固定持续时间播放? [复制]

    这个问题在这里已经有答案了 我有一个 CSS 动画 可以使元素沿直线移动未定义的距离 据我所知 动画具有固定的持续时间 因此无论元素必须移动多远 动画始终需要相同的时间来运行 我该如何制作才能使动画没有固定的duration 但有固定的运动
  • 为什么 Node.js 0.12.0 版本中的 V8 需要 SSE2 CPU 指令?

    尝试将 Node js 从 0 10 x 升级到 0 12 0 首先注意到的是 我收到一条错误消息 指出我的 CPU 不支持 SSE2 指令 实际上并不支持 尝试从源代码编译 Node js 但由于同样的原因失败了 在deps v8 src
  • SWT StyledText 有高度限制吗?

    我正在尝试创建一个应用程序 其中包含在 ScrolledComposite 中显示的 StyledText 框 我在 StyledText 框中显示大量行时遇到困难 超过 2 550 行似乎会导致问题 StyledText 框本身不能有滚动
  • 如何将元素添加到通用集合

    我想知道如何将专用对象添加到通用集合中 我正在使用以下代码 Collection
  • 使用 Javascript 删除字符串的最后一个字符

    我有一个DIV与一些字符 如何在每次单击时删除文本中的最后一个字符DIV itself 删除第一个字符 div on click function this text function index text return text repl

随机推荐

  • 如何在 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