如何将文件上传到 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错误

AWS S3 生成签名 URL ''AccessDenied''

大型 pdf 文件未在具有 aws 签名 url 的浏览器中打开