Aktualisierung:
Wie in der Antwort von Jacob unten beschrieben, ist eine Einschränkung oder Korrektur des Verhaltens von FileReference.save nicht möglich. Kann jemand eine Alternative vorschlagen (Server ist Apache / PHP), die alle meine Kriterien von diesem Beitrag erfüllt und die Fallstricke vermeidet, die ich mit Jacob diskutierte?
Bearbeiten beenden
Ich speichere ein Bild von meiner AS3-Anwendung mit FileReference.save (). Dies ist der Code, der gut funktioniert:
%Vor%Dies öffnet den Dialog zum Speichern der Datei wie erwartet. Ich benutze dies, anstatt die byteData an PHP zu senden, weil ich möchte, dass der Benutzer ein vertrautes Dialogfeld hat, in dem er seinen eigenen Dateinamen festlegen kann.
Das Problem tritt auf, wenn Benutzer ihr Betriebssystem so konfiguriert haben, dass sie Dateierweiterungen anzeigen, wie ich es tue. Das bedeutet, dass der Dateiname im Speichern-Dialog die Erweiterung enthält, wie in der Abbildung unten zu sehen ist, und es dem Benutzer sehr leicht fällt, diese Erweiterung zu löschen, wenn sie die Datei umbenennt. Da der Standarddateityp für dieses Feld 'Alle Dateien' ist, wird die Datei ohne Typ gespeichert, wenn die Erweiterung gelöscht wird.
Ich kenne keine Möglichkeit, einen Dateityp im Speicherdialog zu erzwingen (wenn es einen gibt, der meine bevorzugte Route sein würde), so kann jemand einen sicheren Weg für mich vorschlagen, dies zu tun, was immer noch erlaubt Benutzer, um den Dateinamen selbst unter Verwendung eines Standarddialogs für ihr OS zu setzen?
Ich habe versucht, FileReference.browse () vor dem save () aufzurufen, wie in dieses Tutorial , aber das wirft einen Fehler auf, weil Sie nur einen FileReference-Aufruf gleichzeitig ausführen können.
Entschuldigung, das ist ein bekannter großer Flash-Player-Bug ohne wirkliche Abhilfe.
Stimmen Sie hier ab: Ссылка
(Obwohl Adobe dies aus irgendeinem Grund als Feature-Anfrage bezeichnet.)
Bearbeiten Sie 2:
Behoben für FP 11.8 für Chrome, sowohl unter Mac OS als auch unter Windows.
Bearbeiten: Hinzufügen von navigateTo Informationen zur Problemumgehung
Es gibt die PHP-Option, eine navigateTo()
zu machen: die Datei auf eine PHP-Seite mit einem MIME-Type von image/jpeg
hochladen Wenn Sie die richtigen Header angeben, können Sie den Browser dazu bringen, den nativen Browser aufzurufen Speichern Sie den Dialog, der Erweiterungen verwaltet. Es gibt jedoch andere Nachteile dieser Methode:
Nach langen Diskussionen und angesichts unserer Benutzerbasis ist unsere Lösung:
Wir haben festgestellt, dass der Benutzer den Namen meistens nicht geändert hat, so dass wir selten auf die zweite Methode zurückgreifen müssen, was weniger wünschenswert ist.
Beachten Sie, dass wir, um die zuvor erwähnten navigatorURL () - Browser-Inkonsistenzprobleme zu verringern, es nützlich fanden, "Content-disposition: attachment" in dem vom Server zurückgegebenen Header anzugeben.
Schade, dass dies nicht verfügbar ist. Ich kann verstehen, dass Benutzer die Möglichkeit haben, die Dateien so zu speichern, wie sie es wollen. Was aber, wenn Sie vergessen, die Erweiterung hinzuzufügen? Nach meiner Erfahrung speichert Flex dann die Datei als eine normale Datei ohne eine Erweiterung. Dadurch wissen einige Benutzer möglicherweise nicht, was sie mit der Datei tun sollen, die sie gespeichert haben. Da nicht jeder Benutzer weiß, was die verschiedenen Erweiterungen bedeuten / sind und hoffe, Dateien mit falschen Erweiterungen zu öffnen. Ich habe es oft ruhig gesehen, dass Leute hoffen, eine spezifische Datei mit einer seltsamen Erweiterung oder keiner Erweiterung zu öffnen.
Ich verstehe teilweise, warum Adobe es eher als Feature-Anfrage denn als Bug ansieht. Aber wenn Sie sehen, wie es den Prozess der Dinge durcheinander bringt, möchten Sie es vielleicht eher als einen Fehler betrachten. Wie ich schon sagte, nicht jeder Benutzer wird wissen, wie man die Datei "myfile" anstelle von "myfile.jpg" öffnet. Und wie viele Benutzer, die verstehen, wie man sie öffnet, haben ".cow" als eine Erweiterung festgelegt, die vom Imageviewer geöffnet werden soll, und wie wird das Betriebssystem auf diese seltsame Erweiterung reagieren? Nun, vielleicht ist ".cow" ein schlechtes Beispiel, aber ich schätze, Sie verstehen das.
Ein Workaround dafür könnte sein, die Funktion selbst zu erstellen. Das heißt, Sie geben dem Benutzer ein Popup-Fenster (oder wie Sie es bevorzugen) mit der Option, den Dateinamen anzugeben, den Speicherort der Datei zu erhalten und dann die Schaltfläche Speichern / Abbrechen. Sie können dann überprüfen, ob sie eine Erweiterung hinzugefügt, einen Dateinamen eingegeben und eine Dateiposition angegeben haben (das ist sogar richtig). Dies kombiniert mit der FileStream-Funktion sollte (falls ich mich nicht irre) eine Lösung sein, um eine ähnliche Funktion wie die Speicherdialogoption zu erstellen.
Eduard stellte eine Problemumgehung in Adobes Feature-Request-Tracker für dieses Problem zur Verfügung: Verdoppelung der Dateierweiterung, z. B. "image.jpg.jpg". Das werden wir tun, denn für unsere Benutzer, die Erweiterungen ausblenden, werden die Erweiterungen gelöscht, unabhängig davon, ob sie den Dateinamen ändern oder nicht.
Die Antwort ist ... du nicht. Das ist nicht nur ein Teil von FileReference (oder File, das ist Adobe Air), es ist auch nicht unser Anliegen. Wenn ein Benutzer alle Dateien als .cow speichern möchte, lass ihn! Vielleicht hat er seine Maschine so konfiguriert, dass .cow als JPEG geöffnet wird.
Ehrlich gesagt stört es mich als Benutzer wirklich, wenn jemand glaubt, dass er das Recht hat, mir zu sagen, was ich auf meinem Rechner Dateien nennen werde.
Es gibt keine echte Arbeitsumgebung für diese Lösung, da sie sich auf eine Standardeinstellung in Windows bezieht. Microsoft entschied, dass Personen die Erweiterungsnamen nicht kennen müssen und erstellte daher eine Einstellung, die Dateierweiterungstypen bekannter Dateitypen verbirgt. Um dies zu beheben, muss der Benutzer diese Einstellung bereinigen, indem er die hier gezeigten Schritte ausführt.
Tags und Links save flash actionscript-3 file-type filereference