我的应用程序允许管理员用户使用FineUploader直接上传到S3来构建图库。此过程还将文档存储在我的本地MongoDB数据库中,引用上传的图像,如...
{
"filename": "user_supplied_image (thumb).jpg",
"caption": "User supplied caption of image",
"title": "User supplied title of image",
"URL_thumb": "http://exnihilodev.s3-us-west-2.amazonaws.com/images/risingcrane/d73dbd42-8593-430e-a0f3-bb8512035863.jpg",
"URL_full": "http://exnihilodev.s3-us-west-2.amazonaws.com/images/risingcrane/abf38056-f9f2-4ecb-9f66-c71ca59b3e6f.jpg"
}
这一切都很好。我允许站点管理员从库中删除任何向我的服务器发出DELETE请求的图像,其中运行以下代码...
// Handler for DELETE /gallery-admin photo delete
app.delete('/gallery-admin', function(req, res) {
var photo = req.body;
rcProv.deletePhoto(photo, function(error, docs) {
if(error) {
res.send(error);
console.re.log(error);
}
else{
//1st delete both of the S3 images files associated with this photo
var key1 = docs.URL_thumb.slice(docs.URL_thumb.indexOf('images/'));
deleteFile(expectedBucket, key1, function(err) {
if (err) {
console.re.log("Problem deleting file: %s - %s",key1, err);
res.status(500);
}
res.end();
});
var key2 = docs.URL_full.slice(docs.URL_full.indexOf('images/'));;
deleteFile(expectedBucket, key2, function(err) {
if (err) {
console.re.log("Problem deleting file: %s - %s",key2, err);
res.status(500);
}
res.end();
});
//last, delete the photo record from the db
photo.remove = true;
rcProv.deletePhoto(photo, function(error, docs){
console.re.log('deleted photo successfully: %s',docs);
res.send({"status":"success"});
});
}
});
});
/ gallery-admin的我的DELETE路由调用我的内部函数'deletePhoto()',传入照片的MongoDb id,该照片检索文档并将其返回到回调的docs
var中。然后解析它以获取上载到S3的缩略图和完整图像文件的文件名。这些文件名用于构建密钥,然后传递给FineUploader函数deleteFile()的两个后续调用。
FineUploader deleteFile()函数有两个参数bucket
和key
,其中bucket
由以下代码行var expectedBucket = process.env.S3_BUCKET;
提供(相同的全局变量为在上传过程中使用的其他FineUploader函数中使用)并且key
提供以下代码行...
var key1 = docs.URL_thumb.slice(docs.URL_thumb.indexOf('images/'));
...它提供了最初上传文件时传递给FineUploader signPolicy()函数的确切键值,基本上是'folder / UUID。[文件扩展名]'的模式。我假设这是deleteFile()正在寻找的“关键”。这可能是我的问题。
我从S3服务器返回的响应是..
{
"message": "The request signature we calculated does not match the signature you provided. Check your key and signing method.",
"code": "SignatureDoesNotMatch",
"time": "2016-06-16T12:11:47.191Z",
"statusCode": 403,
"retryable": false,
"_willRetry": false
}
我已经检查了我的CORS配置并确认我允许使用DELETE方法。
我尝试将key
值更改为原始文件网址的各种排列,从完整的“http:// ...”更改为UUID。[文件扩展名],但没有更改结果
用于上传文件的AWS密钥与用于尝试删除相同文件的密钥相同。
我很欣赏有人可能提供的这个问题的任何见解。
提前致谢。