joe*_*joe 4 javascript amazon-s3 amazon-web-services node.js reactjs
我在我的服务器上签署 URL 并将其发送回客户端,它工作正常。这是该函数的外观
const aws = require('aws-sdk'),
config = require('config'),
crypto = require('crypto');
module.exports = async function(file_type) {
aws.config.update({accessKeyId: config.AWS_ACCESS_KEY, secretAccessKey: config.AWS_SECRET_KEY})
const s3 = new aws.S3();
try {
if (!file_type === "image/png") {
return ({success: false, error: 'Please provide a valid video format'});
}
let buffer = await crypto.randomBytes(12);
let key = buffer.toString('hex');
let options = {
Bucket: config.AWS_S3_BUCKET,
Key: key,
Expires: 60,
ContentType: file_type,
ACL: 'public-read',
}
let data = await s3.getSignedUrl('putObject', options);
console.log('data was', data)
return ({
success: true,
signed_request: data,
url: ('https://s3.amazonaws.com/' + config.AWS_S3_BUCKET + '/' + key),
key,
});
} catch (error) {
console.log('the error was', error)
return ({
success: false,
error: error.message,
})
}
}
Run Code Online (Sandbox Code Playgroud)
所以这很好用,最终让我得到一个像
然后当我在客户端上得到那个 url 时..我使用 axios 发送一个 PUT 请求,其功能类似于 -
function uploadToS3(file, signedRequest, callback){
var options = {
headers: {
'Content-Type': file.type
}
};
axios.put(signedRequest, file, options)
.then(result =>{
console.log('the result was', result)
callback(result)
})
.catch(err =>{
callback(err)
})
}
Run Code Online (Sandbox Code Playgroud)
我唯一要回来的是 (400) Bad Request
小智 5
我遇到了同样的问题,在搜索了几个小时后,我能够通过将我的存储桶区域添加到服务器端后端来解决它,在那里我使用s3.getSignedUrl()请求签名 URL 。
const s3 = new AWS.S3({
accessKeyId:"your accessKeyId",
secretAccessKey:"your secret access key",
region:"ap-south-1" // could be different in your case
})
const key = `${req.user.id}/${uuid()}.jpeg`
s3.getSignedUrl('putObject',{
Bucket:'your bucket name',
ContentType:'image/jpeg',
Key:key
}, (e,url)=>{
res.send({key,url})
})
Run Code Online (Sandbox Code Playgroud)
获取签名 URL 后,我在客户端使用axios.put()使用 URL 将图像上传到我的 s3 存储桶。
const uploadConf = await axios.get('/api/uploadFile');
await axios.put(uploadConf.data.url,file, {
headers:{
'Content-Type': file.type
}
});
Run Code Online (Sandbox Code Playgroud)
希望这能解决您的问题。
猜测您提供的标头有问题
对我有用
function upload(file, signedRequest, done) {
const xhr = new XMLHttpRequest();
xhr.open('PUT', signedRequest);
xhr.setRequestHeader('x-amz-acl', 'public-read');
xhr.onload = () => {
if (xhr.status === 200) {
done();
}
};
xhr.send(file);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6719 次 |
| 最近记录: |