【发布时间】:2021-07-22 17:33:02
【问题描述】:
我正在使用我在 Github 上找到的 Flutters 的 aws_s3_upload 插件。我能够将图像上传到我的 AWS s3 存储桶。但是,这些图像缺少所需的“image/jpeg”mime/类型,因此我可以在浏览器窗口中将它们作为图像查看。
在单击 URL 时,图像会下载而不是出现在我的浏览器中。我可以更新此代码以将其作为图像上传到我的 S3 存储桶吗?
library aws_s3_upload;
import 'dart:io';
import 'package:amazon_cognito_identity_dart_2/sig_v4.dart';
import 'package:http/http.dart' as http;
import 'package:path/path.dart' as path;
import './src/policy.dart';
class AwsS3 {
static Future<String> uploadFile(
{
String accessKey,
String secretKey,
String bucket,
String destDir,
String region = 'us-east-2',
File file,
String filename}) async {
final endpoint = 'https://$bucket.s3-$region.amazonaws.com';
final uploadDest = '$destDir/${filename ?? path.basename(file.path)}';
final stream = http.ByteStream(Stream.castFrom(file.openRead()));
final length = await file.length();
final uri = Uri.parse(endpoint);
final req = http.MultipartRequest("POST", uri);
final multipartFile = http.MultipartFile('file', stream, length, filename: path.basename(file.path));
final policy = Policy.fromS3PresignedPost(uploadDest, bucket, accessKey, 15, length, region: region);
final key = SigV4.calculateSigningKey(secretKey, policy.datetime, region, 's3');
final signature = SigV4.calculateSignature(key, policy.encode());
req.files.add(multipartFile);
req.fields['key'] = policy.key;
req.fields['acl'] = 'public-read';
req.fields['X-Amz-Credential'] = policy.credential;
req.fields['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256';
req.fields['X-Amz-Date'] = policy.datetime;
req.fields['Policy'] = policy.encode();
req.fields['X-Amz-Signature'] = signature;
try {
final res = await req.send();
if (res.statusCode == 204) return '$endpoint/$uploadDest';
} catch (e) {
print(e.toString());
}
}
}
【问题讨论】:
-
我对同一个包有同样的问题 XD 我接受它,因为这是你之前的问题,你在另一个问题中使用 minio。
-
我刚刚发布了如何使用 Minio。
标签: amazon-web-services flutter dart amazon-s3 mime-types