Загрузка файлов в корзину Minio с использованием флаттера не удается - PullRequest
0 голосов
/ 21 марта 2020
* 100 *

main.dart 文件 Future _btnClicked () asyn c 1001 * *1002* main.dart 文件 使用 件 uture * {

const _accessKeyId = 'siman';
const _secretKeyId = 'qq123123';
const _region = 'us-east-1';
const _s3Endpoint =
    'http://39.99.189.84:9000';

final file = File(path.join('/path/to/file', '/Users/Mr-Han/Library/Developer/CoreSimulator/Devices/A5F0B71C-D3D7-42D3-9552-7DE1D19B8A48/data/Containers/Data/Application/12573E66-DA90-413A-A879-A0F275080965/tmp/1584374729034-30.jpeg'));
final stream = http.ByteStream(DelegatingStream.typed(file.openRead()));
final length = await file.length();

final uri = Uri.parse(_s3Endpoint);
final req = http.MultipartRequest("POST", uri);
final multipartFile = http.MultipartFile('file', stream, length,
    filename: path.basename(file.path));

final policy = Policy.fromS3PreSignedPost('square-cinnamon.jpg',
    'ceshi', _accessKeyId, 15, length,
    region: _region);
final key =
SigV4.calculateSigningKey(_secretKeyId, 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();
  await for (var value in res.stream.transform(utf8.decoder)) {
    print(value);
  }
} catch (e) {
  print(e.toString());
}

}

policy.dart 文件

Попробуйте загрузить файл в корзину Minio. Просто начал учиться и не знаю много. Продолжайте терпеть неудачу. Пожалуйста, укажите на ошибку!

1 Ответ

0 голосов
/ 21 марта 2020

policy.dart 文件

import 'dart:convert';
import 'package:amazon_cognito_identity_dart/sig_v4.dart';

class Policy {
  String expiration;
  String region;
  String bucket;
  String key;
  String credential;
  String datetime;
  int maxFileSize;

  Policy(this.key, this.bucket, this.datetime, this.expiration, this.credential,this.maxFileSize,
      {this.region});

  factory Policy.fromS3PreSignedPost(
    String key,
    String bucket,
    String accessKeyId,
    int expiryMinutes,
    int maxFileSize, {
    String region,
  }) {
    final datetime = SigV4.generateDatetime();
    final expiration = (DateTime.now())
        .add(Duration(minutes: expiryMinutes))
        .toUtc()
        .toString()
        .split(' ')
        .join('T');
    final cred =
        '$accessKeyId/${SigV4.buildCredentialScope(datetime, region, 's3')}';
    final policy = Policy(key, bucket, datetime, expiration, cred, maxFileSize,
        region: region);
    return policy;
  }

  String encode() {
    final bytes = utf8.encode(toString());
    return base64.encode(bytes);
  }

  @override
  String toString() {
    return '''
      { "expiration": "${this.expiration}",
        "conditions": [
          {"bucket": "${this.bucket}"},
          ["starts-with", "\$key", "${this.key}"],
          {"acl": "public-read"},
          ["content-length-range", 1, ${this.maxFileSize}],
          {"x-amz-credential": "${this.credential}"},
          {"x-amz-algorithm": "AWS4-HMAC-SHA256"},
          {"x-amz-date": "${this.datetime}" }
        ]
      }
    ''';
  }

  static fromS3PresignedPost(String s, String t, String accessKeyId, int i, int length, {String region}) {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...