使用HTTPBuilder和MultipartEntity发布文本和文件

时间:2012-10-15 18:09:52

标签: grails multipartentity

我正在使用groovyx.net.http.HTTPBuilder从Grails发布到PHP脚本。我需要附上几个文本字段和一些文件。

我可以通过这种方式附加一些文本字段并获得巨大成功:

    MultipartEntity mpc = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE)
    mpc.addPart("json", new StringBody(json.toString()))

但是,当我附加这样的文件时,请求中不再出现文本字段:

        passFiles.each() { key, value ->
            mpc.addPart(key, new InputStreamBody(value.stream, value.type, value.filename))
            System.out << value
        }

我认为文件应该可以添加这种方式。以下是我对以上内容的描述:

[filename:icon.png, stream:java.io.ByteArrayInputStream@2747ebcb, type:image/png]

如何让HTTPBuilder按预期进行多部分POST?

2 个答案:

答案 0 :(得分:1)

一些想法:

  1. 您是否记得致电setEntity()将您的请求与MultipartEntity
  2. 联系起来
  3. 根据您正在使用的Grails / Groovy的版本,您可能会遇到HTTPBuilder中的问题,描述为here。那个链接指向一个修补的叉子,我没试过。
  4. 它不如Groovy,但我已经能够从Grails完成类似的任务,其代码与Apache HTTPClient Java API密切相关。

答案 1 :(得分:0)

安德鲁的评论让我更好地了解了HTTPClient Java API。我能够像上面那样使一切工作:

  1. 将流的临时副本保存到文件中。

    def file = new File('web-app/tmpfiles/file.dat').newOutputStream()
    file << stream
    file.close()
    
  2. 不使用InputStreamBody,而是使用FileBody和保存文件的路径。

    mpc.addPart(key, new FileBody(new File('web-app/tmpfiles/file.dat'), filename, type, 'UTF-8'))