0
firebaseを搭載したアンギュラー4プロジェクトで作業する。FirebaseストレージのダウンロードURLをFirebaseデータベースに送信する前に参照
次の手順を実行する前に、Observableから結果が返されたことを保証する方法を検討するのは苦労しています。
Observableでそのことを保証することはできませんが、全体のポイントはデータストリームなので、私のジレンマです。
firebaseデータベースに画像をアップロードしようとしていますが、のファイルをダウンロードする前に、そのダウンロードURL を取得しています。
アドバイスをいただければ幸いです。
登録ユーザーサービス
$key: string;
downloadUrl: string;
currentUser: any;
loginId: string;
constructor(
private db: AngularFireDatabase,
private firebaseUploadService: FirebaseUploadService,
private authService: AuthService) {
this.firebaseUploadService.currentUrl.subscribe(url => this.downloadUrl = url);
}
registerUser(firebaseRef: string, user: UserModel): Observable<any> {
// Create a separate object for file upload with the file passed via the entity
const file = Object.assign(<UploadModel>{}, user.imagePath);
user.$key = this.authService.currentUserId;
return this.firebaseUploadService.pushUpload(user.$key, file).switchMap(upload => {
console.log('upload returned from service: ', upload)
user.imagePath = this.downloadUrl;
return Observable.fromPromise(this.db.object(firebaseRef + '/' + user.$key).update(user));
});
}
Firebaseアップロードサービス
currentUser: any;
uploads: FirebaseListObservable<UploadModel[]>;
private urlSource = new BehaviorSubject('http://saveabandonedbabies.org/wp-content/uploads/2015/08/default.png');
currentUrl = this.urlSource.asObservable();
constructor() {
}
pushUpload(firebaseRef: string, upload: UploadModel): any {
const storageRef = firebase.storage().ref();
const uploadTask = storageRef.child(`${firebaseRef}/${upload.file.name}`).put(upload.file);
uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED,
(snapshot) => {
// upload in progress
upload.progress = (snapshot.bytesTransferred/snapshot.totalBytes) * 100
},
(error) => {
// upload failed
console.log(error)
},
() => {
// upload success
upload.url = uploadTask.snapshot.downloadURL
this.urlSource.next(upload.url)
upload.name = upload.file.name
}
);
return this.urlSource;
}