读取文本文件aws-amplify s3从预签名URL读取数据

时间:2018-05-08 15:18:03

标签: reactjs amazon-s3 aws-amplify

如何使用aws-amplify库读取s3中的文本文件? 我能够获得预先签名的URL,但在转到网址时会出错,

import azure-core-cli
azure-core-cli.mycommand(param)

文档中有关于如何获取网址的说明:

<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<Key>
private/xx-xxxx-4:42134231243423142131423/filename.json
</Key>
<RequestId>1242341243</RequestId>
<HostId>
 uudawfeawefhszec/6kM8VawefawefawfawefawefgwegweawgeagweyRk=
</HostId>
</Error>

结果是路径的url,而不是文本。 当我运行http get方法时,端点不存在。

获取数据的最佳做法是什么?我正在使用反应。

如果有一个像Storage.getText(...)这样的方法,那将是最好的情况。

我尝试使用此功能添加授权...

Storage.get('test.txt', {level: 'private'})
  .then(result => console.log(result))
  .catch(err => console.log(err));

400 Bad Request :(

2 个答案:

答案 0 :(得分:4)

查看源代码,S3Image类在Storage.get方法中使用未记录的参数

Storage.get('...', {download: true}) 

是获取对象的正确方法。

该对象需要解码

    Storage.get('modules.json', { download: true })
        .then(result => {
            console.log(Utf8ArrayToStr(result.Body));
        })
        .catch(err => {
            console.log('error axios');
            console.log(err)
        });

function Utf8ArrayToStr(array) {
    var out, i, len, c;
    var char2, char3;

    out = "";
    len = array.length;
    i = 0;
    while (i < len) {
        c = array[i++];
        switch (c >> 4) {
            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                // 0xxxxxxx
                out += String.fromCharCode(c);
                break;
            case 12: case 13:
                // 110x xxxx   10xx xxxx
                char2 = array[i++];
                out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                break;
            case 14:
                // 1110 xxxx  10xx xxxx  10xx xxxx
                char2 = array[i++];
                char3 = array[i++];
                out += String.fromCharCode(((c & 0x0F) << 12) |
                    ((char2 & 0x3F) << 6) |
                    ((char3 & 0x3F) << 0));
                break;
        }
    }

    return out;
}

答案 1 :(得分:0)

Amplify API 的更新现在提供了更简单的方法来实现这一点。

const result = await Storage.get(`filename.txt`, { contentType: 'text/plain', download: true });

// data.Body is a Blob
result.Body.text().then(string => { 
  // handle the String data return String 
  console.log(string);
});

Storage.get - File download option