【问题标题】:Is it possible to read the a http post value using an inputstream?是否可以使用输入流读取 http post 值?
【发布时间】:2012-02-05 02:29:27
【问题描述】:

我正在 http 将一个 xml 文件发布到一个 servlet,目前正在这样做:

String xmlString = request.getParameter("xml");

然后我在 xml 的 SAX 解析期间将 xml 字符串变量转换为 StringReader 和 InputSource。

parser.parse(new InputSource(new StringReader(xmlString)));

我很好奇我是否能以某种方式获得作为 InputSource 的值?

性能很重要,如果我能避免它,无缘无故地来回转换似乎毫无意义。

【问题讨论】:

  • 您将 xml 内容作为参数而不是正文的一部分传递的任何充分理由?
  • @havexz 你是什么意思? xml 正在通过客户端的 http post 发布。
  • 这就是我要说的,为什么客户端将其作为参数发布,而不是作为 http 正文的一部分(在参数下方)传递。像基于肥皂的帖子请求。

标签: java xml sax xerces


【解决方案1】:

如果你的 xml 是一个参数,你就无能为力了。而且,正如 JB Nizet 和 skaffman 所指出的,您不必担心。你的记忆中只有一次,而且你只执行一次阅读。

但如果 xml 是帖子本身,那么你可以阅读它:

parser.parse(new InputSource(new InputStreamReader(request.getInputStream(), "UTF-8")));

【讨论】:

  • 当心文件编码,这里假定总是 UTF-8 ......这是不正确的。此外,使用request.getInputStream() 依赖于文件在请求有效负载中单独存在的事实,但情况可能并非如此。
  • 1.是的,但是很明显要改变什么(而不是依赖于平台编码) 2. 这就是我所说的;)
  • 1.没问题,我确信你知道,这只是因为这是一个常见的错误,并且不想让@Blankman 这样做。 2.我没有这样得到你的答案^^。 3. 仍然缺少的是,我的答案中添加的是上传文件的多部分方式,这对我来说至少是管理文件的更好方式。 4. 谢谢回答
【解决方案2】:

你没有在这里转换任何东西。只需使用阅读器从原始字符串中读取,然后使用适配器将阅读器视为 InputSource。与 IO 相比,这些操作完全没有成本。

【讨论】:

  • 但这不是在内存中创建相同数据的 2 个副本吗? 100K 的 xml 文件现在以两种格式存储在内存中的 200K 不是吗?
  • 没有。 StringReader 只是对字符串有一个reference,并从中读取。 InputSource 只存储一个 reference 给阅读器。如果您的意思是您同时拥有 XML 字符串和内存中的解析结果,那么是的,您是对的。那么请看博卓的回答。
【解决方案3】:

实际上,使用 HTTP 发布文件的推荐方法是使用multipart/form-data(请查看RFC-1867)。

使用它,您甚至可以发布多个文件,指定它们的 mime 类型和编码——大多数答案都使用 UTF-8...但是假设 new StringReader(xmlString) 几乎是等价的但在错误更多,因为不提供任何编码都会使 jvm 回退到“服务器”默认编码。

要处理这种不带框架开销的文件上传(如Struts2...,如果您愿意)是使用FileUpload apache 库。

他们建议使用经典 API (rfc),但他们提供了另一个智能功能,可以直接使用 stream...

现在谈论解析,我的 POV 是使用 结合 的阅读器和上传文件的 mime 类型(由 FileUpload 给出)。因此,通过 FileUpload,您将可以访问具有 item.getContentType()FileItem 帮助您使用此 constructor 创建一个 InputStreamReader

编辑

如果你想使用框架,甚至比 Struts 2 更进一步。这是我推荐阅读的内容,这是关于如何使用 Spring 3 处理文件上传的非常明确的教程> updload proglyupload w/ Html

【讨论】:

    【解决方案4】:

    您如何发送您的 XML?是否可以将 xml 作为 HTTP 数据而不是 HTTP 参数发送?然后您应该能够将 HttpInputStream 重定向到 InputSource 而无需将其从字符串中转换。

    但我认为从字符串中读取会很快。只有当您的 xmldata 非常大时,您可能会遇到性能问题,因为需要完全读取数据才能构造 String。

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 2017-04-24
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2010-10-26
      • 2019-05-05
      相关资源
      最近更新 更多