我正在尝试通过multipart/form-data向www.example.com的API发送一个PDF文件Box.com。PDF数据是用Base64编码的。由于我的模块是通过GraalVM运行的,而GraalVM的设置方式是阻止node的内置模块,因此我必须从头开始创建表单数据有效负载。
主要的问题,我有是,PDF一直被存储为文本,而不是被解码回一个二进制文件。
下面是我的代码:
const testFile = file.load(321321654)
const boundary = 'ikjbhciuydgwyigdchbwikcbjlikwudhqcviudgwvcihblh'
const header = {
'Content-Type': 'multipart/form-data; boundary=' + boundary,
'Authorization': 'Bearer XXXXXXXXXXXXXXXXXXXXXXXXXX'
}
const body = []
body.push('--' + boundary)
body.push('Content-Disposition: form-data; name="attributes"');
body.push('')
body.push(JSON.stringify({name: testFile.name, parent: { id: 12216548 }}))
body.push('--' + boundary)
body.push('Content-Disposition: form-data; name="testfile"' + '; filename="' + testFile.name + '"')
body.push('content-type: application/pdf;charset=UTF-8')
body.push('Content-Transfer-Encoding: BASE64')
body.push('')
body.push(testFile.getContents())
body.push('--' + boundary + '--')
body.push('')
const result = https.post({
url: 'https://upload.box.com/api/2.0/files/content',
headers: header,
body: body.join('\r\n')
})
body.join的结果是:
--ikjbhciuydgwyigdchbwikcbjlikwudhqcviudgwvcihblh
Content-Disposition: form-data; name="attributes"
{\"name\":\"Get Started with Box.pdf\",\"parent\":{\"id\":207753393458}}
--ikjbhciuydgwyigdchbwikcbjlikwudhqcviudgwvcihblh
Content-Disposition: form-data; name="file"; filename="Get Started with Box.pdf"
content-type: application/pdf;charset=UTF-8
Content-Transfer-Encoding: BASE64
JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDw (actual payload string shortened)
--ikjbhciuydgwyigdchbwikcbjlikwudhqcviudgwvcihblh--
不幸的是,该文件被加载到框中,但要解码回PDF二进制文件。它只是一个Base64字符串的文本文件。
我在自己创建的本地express服务器上尝试过,在使用Multer包处理multipart/form-data上传时也遇到了类似的问题。奇怪的是,当我切换到Formidable包时,它与我上面的代码一起工作得很好。
我已经看过了表单数据规范,我正在构建的有效负载对我来说是正确的。在box.com论坛上也有其他人问我类似的问题,但没有人提供答案。谷歌搜索和堆栈溢出搜索都没有出现类似的问题。
有没有人对可能发生的事情有任何建议?
1条答案
按热度按时间3df52oht1#
看起来你可能已经从这里的代码开始了
请注意,content-transfer-encoding是
base64
而不是BASE64
。头名应该是大小写不敏感的,但我在过去遇到过编码名称大小写敏感的问题。这也可以解释为什么你的代码在一个目标上工作而不是另一个。