1

我正在使用 groovyx.net.http.HTTPBuilder 从 Grails POST 到 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 按预期进行此 Multipart POST?

4

2 回答 2

1

一些想法:

  1. 你记得打电话setEntity()把你的请求和你的联系起来MultipartEntity吗?
  2. 根据您使用的 Grails/Groovy 版本,您可能会在 HTTPBuilder 中遇到问题,请参阅此处。该链接指向一个打补丁的叉子,我没有尝试过。
  3. 它不如 Groovy,但我已经能够使用与 Apache HTTPClient Java API 密切相关的代码从 Grails 完成类似的任务。
于 2012-10-15T20:51:36.460 回答
0

Andrew 的评论使我更好地了解了 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'))
    
于 2012-10-16T13:38:13.830 回答