我正在尝试使用GitHub Releases API通过NodeJS脚本将文件(.exe安装程序)上传到GitHub版本。该文档说我的文件必须在POST请求的正文中以原始二进制形式发送。我的安装程序超过30 MB,因此我假设我必须将其流式传输。
我无法使用外部NPM依赖项,例如Express或Request ,所以我尝试仅使用内置的HTTPS模块执行此操作。我正在努力让它发挥作用。
这是我正在尝试的内容:
// (URL below has proper values in my code)
var fullUploadUrl = url.parse("https://uploads.github.com/repos/[org]/[repo]/releases/[release id]/assets?name=myFile.exe&access_token=[GitHub access token]");
var uploadRequest = https.request({
headers: { "Content-Type": "application/octet-stream" },
method: "POST",
protocol: "https:",
hostname: fullUploadUrl.hostname,
path: fullUploadUrl.path
}, (res) => {
if (res.statusCode !== 201) {
// Error
} else {
// Success
}
});
var readStream = fs.createReadStream(uploadAssetPath);
// readStream.on("end", () => { // I have also tried with this uncommented
// uploadRequest.end();
// });
readStream.pipe(uploadRequest);
这会立即产生400状态代码。
将二进制数据传输到HTTPS POST请求的正确方法是什么?有没有人有一个例子,说明如何在没有外部NPM依赖关系的情况下以编程方式将大型资产上传到NodeJS环境中的GitHub版本?
编辑:我们最终使用了外部request
模块,因此请注意,接受的答案并不反映原始问题。
答案 0 :(得分:0)
我认为:
导致protocol: "https:"
中的400 [错误请求] http响应。
答案 1 :(得分:0)
我认为使用外部模块会很好。我使用request将数据流式传输到另一台服务器。看看这个片段:
var r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...})
var form = r.form();
form.append('my_field', 'my_value');
form.append('my_buffer', new Buffer([1, 2, 3]));
form.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'});