使用 httr 提取二进制附件

问题描述 投票:0回答:1

我到处寻找这个问题的答案,但一无所获。我向 API 发出 POST 请求,它返回一个

Content-Type: application/xop+xml
的对象。

响应如下所示:

Response [https://...]
  Date: 2023-08-14 18:18
  Status: 200
  Content-Type: multipart/related; type="application/xop+xml"; boundary="uuid:0ca94e9c-b817-4e87-9628-656cdd58be68"; start="<[email protected]>"; start-info="text/xml"
  Size: 18.3 MB
<BINARY BODY>

本例中的附件应该是 .zip 文件,但我不知道如何提取它。我尝试使用

writeBin
将响应内容保存到文件,但无法打开生成的文件。

我能够在这里获得有关内容的更多信息:

"Content-Type: application/octet-stream"                                                                                                                                                                                                                                                                                                                                                                                                                    
"Content-Transfer-Encoding: binary"                                                                                                                                                                                                                                                                                                                                                                                                                         
"Content-ID: <[email protected]>"                                                                                                                                                                                                                                                                                                                                                                                      
"Content-Disposition: attachment;name=\"tmp12345.zip\"" 

我无法提供可重现的示例,因为 API 需要身份验证,但我希望有人能给我一个提示,告诉我如何成功提取此 zip 文件。

r httr rcurl
1个回答
0
投票

我想出了解决这个问题的方法,尽管它可能不是最好的。在上面@MrFlick 的评论之后,我开始研究搜索/解析原始数据的向量。我发现了 grepRaw 函数,它被证明非常有用。就我而言,API 提供的“边界”并不是很有帮助,因为即使在该边界内,仍然有标头需要处理(也许有一种更优雅的方法)。我的解决方案基本上是这样的:

v = content(response)
si = grepRaw(".zip", v) + 9
ei = grepRaw("--uuid", v, all = T)[3] - 1   #uuid appears three times
bytes = raw[si:ei]
writeBin(bytes, file_name)

对于寻找答案的其他人,我建议您做类似的事情,通过反复试验(与 rawToChar 一起),您可以将响应的哪些部分包含感兴趣的二进制数据归零。不漂亮,但有效。

如果有人想出更优雅的解决方案,请随时在这里分享。

© www.soinside.com 2019 - 2024. All rights reserved.