Ich habe diese Cloud-Funktion, die ich geschrieben habe, um die Datei in Google Cloud Storage hochzuladen:
%Vor% Ich habe formidable
verwendet, um die hochgeladene Datei zu analysieren, und ich habe versucht, die Eigenschaften der hochgeladenen Datei zu protokollieren, und es scheint in Ordnung zu sein; Es wird in ein temporäres Verzeichnis '/tmp/upload_2866bbe4fdcc5beb30c06ae6c3f6b1aa/
hochgeladen, aber wenn ich versuche, die Datei auf den gcs hochzuladen, bekomme ich diesen Fehler:
Ich verwende dieses HTML-Formular, um die Datei hochzuladen:
%Vor%Ich habe eine Lösung vom Firebase Support Team
erhaltenErstens enthält der Code ein kleines Missverständnis der "beeindruckenden" Bibliothek. Die Linie:
%Vor%zeigt an, dass wir erwarten, dass "formidable" unsere Datei mit ihrem ursprünglichen Namen hochlädt und sie in einem temporären Verzeichnis mit einem zufälligen Namen speichert. Was wirklich "beeindruckend" ist, ist, die Datei auf einen zufälligen Pfad hochzuladen, der in "file.path" gespeichert ist, und den ursprünglichen Dateinamen überhaupt nicht mehr verwendet. Wenn wir wollen, können wir herausfinden, was der ursprüngliche Dateiname war, indem wir 'file.name' lesen.
Die Schnellkorrektur für den Code ist daher zu ändern:
%Vor%Um gerecht zu sein:
%Vor%Zweitens gibt es noch ein weiteres Problem, das diesen Code-Fehler verursachen kann: Die Funktion wird beendet, bevor die in 'form.parse (...)' durchgeführte asynchrone Arbeit abgeschlossen ist. Das bedeutet, dass der eigentliche Datei-Upload wahrscheinlich stattfindet, wenn die Funktion bereits gesagt hat, dass sie fertig ist, also keine CPU oder Speicher mehr reserviert hat - der Upload wird sehr langsam oder vielleicht sogar fehlschlagen.
Das Problem besteht darin, das form.parse(...)
in ein Versprechen zu packen:
Schließlich sollten Sie in Erwägung ziehen, Cloud Storage für Firebase beim Hochladen Ihrer Datei anstelle von Cloud-Funktionen zu verwenden. Cloud Storage für Firebase ermöglicht das direkte Hochladen von Dateien und würde viel besser funktionieren:
Es hat Zutrittskontrolle
Es hat fortsetzbare Uploads / Downloads (gut für schlechte Konnektivität)
Es kann Dateien beliebiger Größe ohne Timeout-Probleme akzeptieren
Wenn eine Cloud-Funktion als Reaktion auf einen Datei-Upload ausgeführt werden soll, können Sie dies und vieles mehr tun
Ich habe das geschafft, indem ich die Datei heruntergeladen habe in die tmp
stattdessen.
Sie benötigen:
%Vor% Dann in onChange
. Ich habe tempLocalDir
so erstellt:
Dann benutze ich mkdirp, um das temporäre Verzeichnis zu erstellen
%Vor%Ich denke, dass mein Code das erreicht, was Sie erreichen wollten. Ich hoffe das hilft; Ich kann bei Bedarf mehr Code anbieten.
Tags und Links javascript firebase google-cloud-storage google-cloud-functions