如何通过Curl命令以二进制数据形式向LinkedIn上传媒体?
如何用Curl以二进制数据形式向LinkedIn上传媒体文件
要直接传递二进制数据而非文件路径给Curl,你可以利用Curl从**标准输入(stdin)**读取数据的特性,结合Node.js的子进程来传递二进制流,具体调整如下:
核心思路
Curl的--upload-file(或简写-T)参数支持用-作为输入源,代表从标准输入读取数据。我们需要把原来通过文件路径读取的逻辑,改成直接将媒体的二进制数据通过子进程的stdin传递给Curl。
修改后的代码实现
const { spawn } = require('child_process'); // 构建请求头数组(避免shell转义问题) const headers = []; headers.push(`Authorization: Bearer ${token}`); if (fileType === 'video') { headers.push('Content-Type: application/octet-stream'); } else if (fileType === 'image') { // 图片建议补充对应Content-Type,比如image/jpeg、image/png,根据实际文件类型调整 headers.push(`Content-Type: ${media.mimeType}`); } // 启动curl进程,用-T -指定从stdin读取上传数据 const curlProcess = spawn('curl', [ '-i', '-T', '-', // 关键:从标准输入读取二进制数据 ...headers.map(h => ['-H', h]).flat(), // 展开请求头参数 url ]); // 将媒体二进制数据写入curl的stdin curlProcess.stdin.write(media.buffer); curlProcess.stdin.end(); // 结束输入流 // 处理curl的输出 curlProcess.on('error', (error) => { console.log(`error: ${error.message}`); }); curlProcess.stdout.on('data', (data) => { // 处理响应内容 console.log(data.toString()); }); curlProcess.stderr.on('data', (data) => { // 处理错误输出 console.error(data.toString()); }); curlProcess.on('close', (code) => { console.log(`curl进程退出,码值:${code}`); });
关键调整点
- 用
spawn替代exec:exec会将命令作为shell字符串解析,容易出现转义问题,且不适合处理二进制数据流;spawn直接传递参数数组,更安全可靠。 - 替换上传参数:把
--upload-file ${media.filepath}改成-T -,告诉Curl从标准输入读取要上传的二进制数据。 - 传递二进制数据:通过
curlProcess.stdin.write(media.buffer)直接把媒体的二进制缓冲区数据传给Curl,无需依赖本地文件路径。 - 完善请求头:图片上传建议补充对应的
Content-Type(比如image/jpeg),LinkedIn API对媒体类型的识别更准确。
内容的提问来源于stack exchange,提问作者SANDHYA LATHA
相关产品推荐
相关产品推荐

