Установить угловой HTTP заголовок с перехватчиком, чтобы соответствовать s3 подписанный URL
Я пытаюсь использовать подписанный URL-адрес S3, полученный с помощью лямбды, для отправки HTTP PUT для сохранения изображения на S3. Поток такой:
http-запрос для подписанного URL-адреса> лямбда-возвращение подписанного URL-адреса>http-запрос для размещения изображения на S3 с подписанным URL-адресом
Но запрос продолжает отправляться с заголовком text/plain. Это мой код перехватчика. Кажется, он устанавливает параметры запроса, а не заголовок.
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private authService: AuthService) {}
intercept (req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return this.authService.getAuthenticatedUser().getSession((err, session) => {
if (err) {
console.log("Error getSession")
return next.handle(req);
}
let authReq = null;
if (req.url.indexOf('X-Amz-Algorithm') === -1) {
authReq = req.clone({
headers: req.headers.set('Authorization', session.getIdToken().getJwtToken())
});
} else {
authReq = req.clone({
setHeaders: {'ContentType': 'image/jpeg'}
});
authReq = req;
}
return next.handle(authReq);
})
}
}
И лямбда, которую я использовал для возврата подписанного URL-адреса:
var AWS = require('aws-sdk');
var s3 = new AWS.S3({
signatureVersion: 'v4',
});
exports.handler = (event, context, callback) => {
const url = s3.getSignedUrl('putObject', {
Bucket: 'bucket_name',
Key: 'image' + '.jpg',
Expires: 20,
//ContentEncoding: 'base64', ??
ContentType: 'image/jpeg',
});
callback(null, url);
};
Не могли бы вы дать мне знать, как правильно установить заголовок запроса, чтобы он не был текстовым, а должен быть image/jpeg?
Кроме того, я отправляю изображение в кодировке base64, поэтому не уверен, нужно ли отправлять ContentEncoding в заголовке. Если я помещу его в лямбду, я получаю сообщение об ошибке: SignatureDoesNotMatch с предварительно заданным URL-адресом. Спасибо за помощь!