【问题标题】:Retrieving binary file from post request从发布请求中检索二进制文件
【发布时间】:2017-10-05 03:03:36
【问题描述】:

发送 POST 请求(Apache httpclient,这里是 Kotlin 源代码):

val httpPost = HttpPost("http://localhost:8000")
val builder = MultipartEntityBuilder.create()
builder.addBinaryBody("file", File("testFile.zip"),
        ContentType.APPLICATION_OCTET_STREAM, "file.ext")
val multipart = builder.build()
httpPost.entity = multipart
val r = httpClient.execute(httpPost)
r.close()

我通过 spark-java 请求对象在我的 post 处理程序中收到请求。如何从发布请求中检索原始文件(加上文件名作为奖励)? request.bodyAsBytes() 方法似乎添加了一些字节,因为正文比原始文件大。

谢谢,约尔格

【问题讨论】:

    标签: apache-httpclient-4.x spark-java httpentity


    【解决方案1】:

    在 Spark 文档页面的底部附近有一个部分 "Examples and FAQ"。第一个例子是“我如何上传东西?”。 从那里,它进一步链接到example on GitHub

    简而言之:

    post("/yourUploadPath", (request, response) -> {
        request.attribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement("/temp"));
        try (InputStream is = request.raw().getPart("file").getInputStream()) {
            // Use the input stream to create a file
        }
        return "File uploaded";
    });
    

    要访问原始文件名:

    request.raw().getPart("file").getSubmittedFileName()
    

    为了处理多个文件或部分,我通常有类似于以下的代码(假设在多部分编码上传中只包含文件):

    for (Part part : req.raw().getParts()) {
      try (InputStream stream = part.getInputStream()) {
        String filename = part.getSubmittedFileName();
        // save the input stream to the filesystem, and the filename to a database
      }
    }
    

    【讨论】:

    • 感谢您的回复,但遗憾的是该示例不起作用,因为 req.raw().getParts() 或 req.raw().getPart("file") 只是结束了帖子的执行处理程序。我跟踪了调用,在 spark-java 深处的某个地方,POST 请求被标记为已处理。处理程序仍处于活动状态,但不会在 getParts() 或 getPart() 之后执行。我是 Kotlin 的新手,因此我不确定这是否是 spark-java Kotlin 端口的问题。
    • 如果执行突然停止,很可能是异常。使用Spark.exception(Exception.class, (e, request, response) -> { e.printStackTrace(); }); 作为附加路径,以确保您看到异常(抱歉,Java 代码再次出现,不了解 Kotlin)。
    • 再次感谢您的回复。 JetBrains IDE 将代码转换为Spark.exception(Exception::class.java, { e, request, response -> e.printStackTrace() }),我发现了一个错误(没有多部分消息)。现在代码归结为(编辑的)代码,给了我一个java.lang.NullPointerException,因为getParts() 返回一个空列表,因此getPart("file") 例外。 POST 请求的内容类型为multipart/form-data; boundary=Z2Dl0386ZA0OMWccx1VRo6h7emmRriXNz
    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多