下面是使用Angular和AWS S3的预签名URL将文件上传到AWS S3的解决方法的代码示例:
npm install aws-sdk
aws.service.ts的服务来处理与AWS S3的交互:import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AwsService {
private s3BucketUrl = 'YOUR_S3_BUCKET_URL'; // 替换为您的S3存储桶URL
constructor(private http: HttpClient) { }
// 获取预签名URL
getPresignedUrl(filename: string): Observable {
return this.http.get(`${this.s3BucketUrl}/presigned-url?filename=${filename}`);
}
// 使用预签名URL将文件上传到S3
uploadFileToS3(file: File, presignedUrl: string): Observable {
const headers = { 'Content-Type': file.type };
return this.http.put(presignedUrl, file, { headers });
}
}
upload.component.ts的组件来处理文件上传:import { Component, OnInit } from '@angular/core';
import { AwsService } from 'path-to-aws.service';
@Component({
selector: 'app-upload',
templateUrl: './upload.component.html',
styleUrls: ['./upload.component.css']
})
export class UploadComponent implements OnInit {
selectedFile: File;
constructor(private awsService: AwsService) { }
ngOnInit(): void {
}
onFileSelected(event: any): void {
this.selectedFile = event.target.files[0];
}
onUpload(): void {
if (this.selectedFile) {
const filename = this.selectedFile.name;
this.awsService.getPresignedUrl(filename).subscribe((res: any) => {
const presignedUrl = res.presignedUrl;
this.awsService.uploadFileToS3(this.selectedFile, presignedUrl).subscribe((response: any) => {
console.log('File uploaded successfully.');
}, error => {
console.error('Error uploading file:', error);
});
}, error => {
console.error('Error getting presigned URL:', error);
});
}
}
}
upload.component.html的HTML模板来处理文件选择和上传按钮:
请记得替换代码中的YOUR_S3_BUCKET_URL为您的S3存储桶URL。同时,您还需要在AWS S3中配置正确的CORS规则以允许跨域请求。