我正在尝试将视频上传到s3并拥有预先签名的PUT网址。以下是执行此操作的代码。
import {Component} from '@angular/core';
import {NavController} from 'ionic-angular';
import {MediaCapture} from 'ionic-native';
import {Http} from '@angular/http';
import { Transfer } from 'ionic-native';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage {
public base64Image: string;
constructor(private navController: NavController, public http: Http) {
this.base64Image = "https://placehold.it/150x150";
}
public takeVideo() {
MediaCapture.captureVideo({limit:2}).then(function(videoData){
var link = "https://mysamplebucket.s3.amazonaws.com/non-tp/esx.mov?AWSAccessKeyId=TEMP_KEYY&Expires=1482290587&Signature=JUIHHI%2FcnLkqSVg%3D&x-amz-security-token=FQoDYXDGRfTXk6hma0Rxew6yraAX%2FlYGaQmYLwkvsuuB3%2F%2FtPvGDVs3dIQG0Ty3MeMjn0p%%26djt5xhAMk73pndJbZP0tCYYlvPvlUAyL8x7O%%2B3AwEa%%2B9b43yarIuPLCvujmKLTDyi%%3D%3Di";
var options: any;
options = {
fileKey: 'file',
fileName: 'esx.mov',
httpMethod: 'PUT',
chunkedMode: false,
mimeType: 'video/quicktime',
encodeURI: false,
headers: {
'Content-Type': 'video/quicktime'
}
};
var ft = new Transfer();
ft.upload(videoData[0].fullPath, link, options, false)
.then((result: any) => {
this.success(result);
}).catch((error: any) => {
this.failed(error);
});
}, function(err){
alert(err);
});
}
}
以下是生成预签名PUT网址的代码。
var params = {Bucket: s3_bucket, Key: filename, Expires: 900000};
var url = {
'url' : s3.getSignedUrl('putObject', params)
};
我得到了,SignatureDoesNotMatch
错误。消息说,The request signature we calculated does not match the signature you provided. Check your key and signing method.
我不确定我在这里做错了什么 - 我看了一些其他的SO和Ionic问题,并尝试了他们推荐的无济于事。关于我和做错的任何想法?
答案 0 :(得分:4)
您的上传PUT
请求将包含Content-Type: video/quicktime
标头。
当请求中存在Content-Type
标头(而不是响应)时,其值是Signature V2规范请求中的非可选组件...这意味着您必须将其传递给代码生成签名。
var params = {Bucket: s3_bucket, Key: filename, Expires: 900000};
还需要将此字符串(在这种情况下为video/quicktime
)作为ContentType: ...
请求传递给PUT
(但不是GET
请求,因为它描述了您发送的内容,而GET
请求通常不会发送实际内容。
SDK documentation似乎没有具体提到这一点,但S3绝对是必需的。
答案 1 :(得分:0)
如果其他人正在查看并且情况与我类似,则当我的s3存储桶的CORS配置不包含<AllowedHeader>*</AllowedHeader>
时,我也会遇到类似的SignatureDoesNotMatchError
从一个存储桶移动到另一个存储桶时,我遇到了这个问题,复制了除CORS配置以外的所有设置。