node.js - AWS S3 Heroku nodejs
问题描述
我正在运行一个托管在 heroku 上的 nodejs 应用程序,我希望能够将选定的照片上传到 AWS S3。我遵循了heroku给出的所有步骤,但发现了这个错误:“MissingRequiredParameter: Missing required key 'Bucket' in params”
这是我的代码:
index.js
app.get('/sign-s3', (req, res) => {
const s3 = new aws.S3();
const fileName = req.query['file-name'];
const fileType = req.query['file-type'];
console.log(fileName, fileType)
const s3Params = {
Bucket: S3_BUCKET,
Key: fileName,
Expires: 60,
ContentType: fileType,
ACL: 'public-read'
};
s3.getSignedUrl('putObject', s3Params, (err, data) => {
if (err) {
console.log(err);
return res.end();
}
const returnData = {
signedRequest: data,
url: `https://${S3_BUCKET}.s3.amazonaws.com/${fileName}`
};
res.write(JSON.stringify(returnData));
res.end();
});
});
app.post('/save-details', (req, res) => {
res.send(req.body.username)
console.log(req.body.username)
});
这是我的前端脚本
测试.ejs
<input type="file" id="file-input">
<p id="status">Please select a file</p>
<img style="border:1px solid gray;width:300px;" id="preview" src="/images/default.png">
<h2>Your information</h2>
<form method="POST" action="/save-details">
<input type="hidden" id="avatar-url" name="avatar-url" value="/images/default.png">
<input type="text" name="username" placeholder="Username"><br>
<input type="text" name="full-name" placeholder="Full name"><br><br>
<hr>
<h2>Save changes</h2>
<input type="submit" value="Update profile">
</form>
<script>
/*
Function to carry out the actual PUT request to S3 using the signed request from the app.
*/
function uploadFile(file, signedRequest, url){
const xhr = new XMLHttpRequest();
xhr.open('PUT', signedRequest);
xhr.onreadystatechange = () => {
if(xhr.readyState === 4){
if(xhr.status === 200){
document.getElementById('preview').src = url;
document.getElementById('avatar-url').value = url;
}
else{
alert('Could not upload file.');
}
}
};
xhr.send(file);
}
/*
Function to get the temporary signed request from the app.
If request successful, continue to upload the file using this signed
request.
*/
function getSignedRequest(file){
const xhr = new XMLHttpRequest();
xhr.open('GET', `/sign-s3?file-name=${file.name}&file-type=${file.type}`);
xhr.onreadystatechange = () => {
if(xhr.readyState === 4){
if(xhr.status === 200){
const response = JSON.parse(xhr.responseText);
uploadFile(file, response.signedRequest, response.url);
}
else{
alert('Could not get signed URL.');
}
}
};
xhr.send();
}
/*
Function called when file input updated. If there is a file selected, then
start upload procedure by asking for a signed request from the app.
*/
function initUpload(){
const files = document.getElementById('file-input').files;
const file = files[0];
if(file == null){
return alert('No file selected.');
}
getSignedRequest(file);
}
/*
Bind listeners when the page loads.
*/
(() => {
document.getElementById('file-input').onchange = initUpload;
})();
</script>
希望这会有所帮助,并在此先感谢。
解决方案
推荐阅读
- swift - 没有这样的模块'InputBarAccessoryView'
- google-apps-script - 谷歌脚本表“单元格超出范围”
- android-studio - 带有Android的Website2APK
- python - 如何在 jinja 中显示列表的所有结果?
- swift - 如何禁用 NSTextField 并使其不可编辑?[isEditable 属性不起作用]
- aws-lambda - 如何抑制 aws lambda cli 输出
- python - 如何使用 C++ 编译 Cython 以获取共享对象 (*.so) 文件
- nosql - 用于多个同时连接的 NoSQL
- networking - 如何在 hazelcast 中创建共享数据结构的异步备份?
- javascript - 为什么这个简单的switch语句总是运行默认