如何将文件上传到 AWS 中的预签名 URL?
Posted
技术标签:
【中文标题】如何将文件上传到 AWS 中的预签名 URL?【英文标题】:How do I upload a file to a pre-signed URL in AWS? 【发布时间】:2019-01-11 19:10:41 【问题描述】:问题
我有一个来自 AWS 的预签名 URL。我需要上传一个文件给它。我该怎么做?
(我必须使用预签名的 URL。我正在调用 createUpload
API for Device Farm,它返回一个。)
AWS Documentation gives examples on how to do this in Java, .NET and Ruby。缺少 javascript。
尝试 1
我改编了这个例子here。
const axios = require('axios');
const FormData = require('form-data');
function uploadFile(url, file)
if (typeof url !== 'string')
throw new TypeError(`Expected a string, got $typeof url`);
const formData = new FormData();
formData.append(file,file)
const config =
headers:
'content-type': 'multipart/form-data'
return axios.post(url, formData,config)
但是我得到了这个错误:
我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
尝试 2
我让它与 cURL 一起工作。但是,我不想依赖 cURL。
const Promise = require('bluebird');
const cmd = require('node-cmd');
const getAsync = Promise.promisify(cmd.get, multiArgs: true, context: cmd );
async function uploadFile(url, fileName)
await throwIfCurlNotInstalled();
console.log('uploadFile: Uploading file',
fileName
);
const command = `curl -T $fileName "$url"`;
try
let result = await getAsync(command);
result.forEach(line => console.log(line));
console.log('uploadFile: File uploaded',
fileName,
);
catch (e)
console.error('uploadFile: Error uploading file',
fileName
);
console.error(e);
async function throwIfCurlNotInstalled()
try
await getAsync(`curl -V`);
catch (e)
throw 'curl is not installed';
【问题讨论】:
【参考方案1】:解决方案非常简单:
const rp = require('request-promise');
const fs = require('fs');
async function uploadFile(url, fileName)
let options =
method: 'PUT',
uri: url,
body: fs.readFileSync(fileName),
;
return rp(options);
【讨论】:
以上是关于如何将文件上传到 AWS 中的预签名 URL?的主要内容,如果未能解决你的问题,请参考以下文章
[AWS-S3] POST 上的预签名 URL 被 CORS 阻止,尽管 CORS 配置启用它
通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问
通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问
ap-south-1区域的AWS SignatureDoesNotMatch错误