#cordova #ionic2 #firebase-storage
#кордова #ionic2 #firebase-хранилище
Вопрос:
Я продолжаю получать 404 неизвестных FirebaseError каждый раз, когда я пытаюсь загрузить большой двоичный файл аудиоданных в хранилище firebase. но когда я нажимаю на ссылку, сгенерированную с помощью .put (большой двоичный объект), я вижу сгенерированный JSON. я не получаю эту ошибку при загрузке imagedata из плагина camera.
Ошибка: Не удалось загрузить ресурс: сервер ответил со статусом 404 (не найден)
{«код»: «хранилище / неизвестно», «сообщение»: «Хранилище Firebase: произошла неизвестная ошибка, пожалуйста, проверьте полезную нагрузку ошибки для ответа сервера».,»ServerResponse»:»»,»name»: «FirebaseError»}
———————————
Системная информация:
Cordova CLI: 6.3.1
Версия Ionic Framework: 2.0.0-rc.0-201610131811
Версия Ionic CLI: 2.1.1
Версия Ionic App Lib: 2.1.1
Версия Ionic App Scripts: 0.0.36
ОС:
Версия узла: v4.6.0
Код: index.html
<ion-app></ion-app>
<!--fire base data services-->
<script src="js/firebase.js"></script>
<!--<script src="https://www.gstatic.com/firebasejs/3.5.0/firebase.js"></script>-->
<script>
// Initialize Firebase
var config = {
apiKey: "key",
authDomain: "domain",
databaseURL: "url",
storageBucket: "storage",
messagingSenderId: "id"
};
firebase.initializeApp(config);
</script>
страница записи.ts
import { Injectable } from '@angular/core';
import { MediaPlugin } from 'ionic-native';
import {FireBaseData} from './firebase.service';
import { File } from 'ionic-native';
declare var cordova: any;
// firebase
declare var firebase: any;
export enum AudioRecorderState {
Ready,
Recording,
Recorded,
Playing
}
@Injectable()
export class AudioRecorder {
mediaPlugin: MediaPlugin = null;
state: AudioRecorderState = AudioRecorderState.Ready;
mdeastr: string;
fbd: any;
progress: string;
file: any;
constructor() {
this.fbd = new FireBaseData();
}
get MediaPlugin(): MediaPlugin {
if (this.mediaPlugin == null) {
this.mediaPlugin = new MediaPlugin("copoutrecording.mp3", null);
}
return this.mediaPlugin;
}
upload() {
var test = JSON.stringify(this.MediaPlugin);
this.file = { name: "copoutrecording.mp3" };
File.readAsDataURL(cordova.file.externalRootDirectory, this.file.name).then((data: any) => {
if (data) {
var blob = new Blob([data], { type: "audio/mp3" });
this.fbd.uploadrecording(blob);
}
});
}
firebase.service.ts
import { Injectable } from '@angular/core';
import { Platform } from 'ionic-angular';
import { File } from 'ionic-native';
declare var firebase: any;
declare var cordova: any;
@Injectable()
export class FireBaseData {
file: any;
recordstorage: any;
constructor() {
var rec = firebase.storage();
var recref = rec.ref();
this.recordstorage = recref.child("record");
}
public uploadrecording(blob: any) {
var uploadTask = this.recordstorage.child('copoutrecording.mp3').put(blob);
// Listen for state changes, errors, and completion of the upload.
uploadTask.on(firebase.storage.TaskEvent.STATE_CHANGED, // or 'state_changed'
function (snapshot) {
// Get task progress, including the number of bytes uploaded and the total number of bytes to be uploaded
var progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
console.log('Upload is ' progress '% done' ": " snapshot.bytesTransferred " / " snapshot.totalBytes);
switch (snapshot.state) {
case firebase.storage.TaskState.PAUSED: // or 'paused'
console.log('Upload is paused');
break;
case firebase.storage.TaskState.RUNNING: // or 'running'
console.log('Upload is running');
// alert("media uploading to firebase");
break;
}
}, function (error) {
switch (error.code) {
case 'storage/unauthorized':
// User doesn't have permission to access the object
console.log(JSON.stringify(error));
break;
case 'storage/canceled':
console.log(JSON.stringify(error));
// alert("cancelled: " error.serverResponse);
// User canceled the upload
break;
case 'storage/unknown':
console.log(JSON.stringify(error));
// alert("error: " error.message);
// alert("error: " JSON.stringify(error));
// Unknown error occurred, inspect error.serverResponse
break;
}
}, function () {
// Upload completed successfully, now we can get the download URL
var downloadURL = uploadTask.snapshot.downloadURL;
alert("made it to firebase" downloadURL);
});
}
}
Комментарии:
1. Не имеет смысла, что мы возвращаем 404 при загрузке — если файл не существует, мы его создадим. Мы можем получить несколько других ошибок, и в ответе сервера должно быть указано это. Действительно ли сообщение об ошибке отображает то, что отображается? Черт возьми, ваша ссылка, похоже, работает (скручивание допустимо).
2. Это то, что меня смущает. На самом деле мне пришлось скачать и ссылаться на firebase.js файл, потому что я продолжал получать 404 и там. будут ли проблемы с подключением при запуске на устройстве?
3. Проблема заключалась в добавлении <разрешить навигацию href=»*» /> и установке cordova-plugin-whitelist. это позволило моему приложению получить доступ к Интернету, и я был в восторге.