【问题标题】:Parsing multipart/form-data using Apache Commons File Upload使用 Apache Commons File Upload 解析 multipart/form-data
【发布时间】:2015-08-03 22:33:03
【问题描述】:

Apache Commons File Upload 包是否提供通用接口来通过InputStream、附加Array<Byte> 或通过任何其他通用流接口流解析multipart/form-data 块?

我知道他们有一个流式 API,但该示例仅向您展示如何通过 ServletFileUpload 执行此操作,我认为它必须特定于 Servlet

如果没有,JVM 中是否还有其他替代框架可以让您做到这一点?可悲的是,我使用的框架 Spray.io 似乎没有提供这样做的方法。

【问题讨论】:

  • 你有什么样的InputStream?或者你怎么得到它? Apache Commons File Upload 有一个FileUploadBase.getItemIterator(RequestContext),您可以使用
  • 你看过 spray.io 库中的这个例子吗? github.com/spray/spray/blob/master/examples/spray-can/…
  • 我将以 Array 块的形式接收输入,因此最理想的情况是我希望将这些字节提供给流解析器。但是,您提到的函数需要一个 RequestContext,其子类只有 ServletRequestContext 和 PortletRequestContext。对我来说不够笼统。
  • 是的,我做了,发现它并没有提取实际数据,即,结果输出仍将包含在边界和标题中。
  • @ThusithaThilinaDayaratne 我改用这个:github.com/DanielN/multipart-handler

标签: java scala jvm multipartform-data apache-commons-fileupload


【解决方案1】:

bayou.io 有一个通用的MultipartParser

您可能需要一些适配器才能使用它,因为它有自己的 AsyncByteSource 接口。

下面的例子展示了如何与InputStream同步使用解析器

    String msg = ""
        //+ "preamble\r\n"
        +"--boundary\r\n"
        +"Head1: Value1\r\n"
        +"Head2: Value2\r\n"
        +"\r\n"
        +"body.body.body.body."

        +"\r\n--boundary\r\n"
        +"Head1: Value1\r\n"
        +"Head2: Value2\r\n"
        +"\r\n"
        +"body.body.body.body."

        +"\r\n--boundary--"
        + "epilogue";

    InputStream is = new ByteArrayInputStream(msg.getBytes("ISO-8859-1"));
    ByteSource byteSource = new InputStream2ByteSource(is, 1024);
    MultipartParser parser = new MultipartParser(byteSource, "boundary");
    while(true)
    {
        try
        {
            MultipartPart part = parser.getNextPart().sync();   // async -> sync
            System.out.println("== part ==");
            System.out.println(part.headers());
            ByteSource body = part.body();
            InputStream stream = new ByteSource2InputStream(body, Duration.ofSeconds(1));
            drain(stream);
        }
        catch (End end) // control exception from getNextPart()
        {
            System.out.println("== end of parts ==");
            break;
        }
    }

【讨论】:

  • 如果您有任何问题,请给我发电子邮件。
猜你喜欢
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2020-10-26
  • 1970-01-01
  • 2012-04-04
相关资源
最近更新 更多