blob: 7ec79c2db9ed48a0bd6c322df13b7f344a923e69 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
part of firebase_storage;
abstract class StorageUploadTask {
final FirebaseStorage _firebaseStorage;
final String _path;
final StorageMetadata _metadata;
StorageUploadTask._(this._firebaseStorage, this._path, this._metadata);
Future<void> _start();
Completer<UploadTaskSnapshot> _completer =
new Completer<UploadTaskSnapshot>();
Future<UploadTaskSnapshot> get future => _completer.future;
}
class StorageFileUploadTask extends StorageUploadTask {
final File _file;
StorageFileUploadTask._(this._file, FirebaseStorage firebaseStorage,
String path, StorageMetadata metadata)
: super._(firebaseStorage, path, metadata);
@override
Future<void> _start() async {
final String downloadUrl = await FirebaseStorage.channel.invokeMethod(
'StorageReference#putFile',
<String, dynamic>{
'app': _firebaseStorage.app?.name,
'bucket': _firebaseStorage.storageBucket,
'filename': _file.absolute.path,
'path': _path,
'metadata':
_metadata == null ? null : _buildMetadataUploadMap(_metadata),
},
);
_completer
.complete(new UploadTaskSnapshot(downloadUrl: Uri.parse(downloadUrl)));
}
}
class StorageDataUploadTask extends StorageUploadTask {
final Uint8List _bytes;
StorageDataUploadTask._(this._bytes, FirebaseStorage firebaseStorage,
String path, StorageMetadata metadata)
: super._(firebaseStorage, path, metadata);
@override
Future<void> _start() async {
final String downloadUrl = await FirebaseStorage.channel.invokeMethod(
'StorageReference#putData',
<String, dynamic>{
'app': _firebaseStorage.app?.name,
'bucket': _firebaseStorage.storageBucket,
'data': _bytes,
'path': _path,
'metadata':
_metadata == null ? null : _buildMetadataUploadMap(_metadata),
},
);
_completer
.complete(new UploadTaskSnapshot(downloadUrl: Uri.parse(downloadUrl)));
}
}
Map<String, dynamic> _buildMetadataUploadMap(StorageMetadata metadata) {
return <String, dynamic>{
'cacheControl': metadata.cacheControl,
'contentDisposition': metadata.contentDisposition,
'contentLanguage': metadata.contentLanguage,
'contentType': metadata.contentType,
'contentEncoding': metadata.contentEncoding,
};
}
class UploadTaskSnapshot {
UploadTaskSnapshot({this.downloadUrl});
final Uri downloadUrl;
}