Eine Falle und Lösung bei der Verwendung von fileReader

Eine Falle und Lösung bei der Verwendung von fileReader

Eine Falle bei fileReader

Wenn Sie fileReader zum Durchsuchen von Bildern verwenden,

Verwenden des Base64-Formats

var Datei = this.$refs.resource.files[0]
var reader = neuer FileReader();
// Lesen Sie die Datei als DataURL:
reader.readAsDataURL(Datei);
//Der Rückruf-JS nach dem Lesen ist ein Multithread-Reader.onloadend=(e)=>{
}

Javascript selbst ist Single-Threaded und hat keine asynchronen Funktionen. Da in Browsern JavaScript verwendet wird und der Browser selbst ein typischer GUI-Arbeitsthread ist, werden GUI-Arbeitsthreads in den meisten Systemen als Ereignisverarbeitung implementiert, um blockierende Interaktionen zu vermeiden, wodurch das asynchrone Gen von JavaScript entsteht. Alles, was danach geschah, hatte hier seinen Ursprung.

Das stimmt: Netzwerk, Dateien. . . . Alle sind auf Basis von Browser-Schnittstellen implementiert

Wenn dieselbe Datei zweimal gelesen wird, wird das Ereignis zum Abschluss des Ladevorgangs nicht ausgeführt.

Fallstricke von FileReader unter iOS (Image zu Base64)

Ich arbeite gerade an einem Projekt. Das Hochladen von Bildern ist eine sehr alte Funktion. Dann möchte ich das Bild komprimieren und direkt auf base64 hochladen... Der Code, den ich am Anfang verwendet habe

var Dateiupload = Funktion (Objekt, Rückruf) {
            //Überprüfen Sie, ob der Browser das FileReader-Objekt unterstützt if (typeof FileReader == "undefined") {
                alert("Ihr Browser unterstützt das FileReader-Objekt nicht!");
            }
            var Datei = Obj;
            //Beurteilen, ob der Typ ein Bild ist, wenn (!/image\/\w+/.test(file.type)){
                alert("Bitte stellen Sie sicher, dass es sich bei der Datei um einen Bildtyp handelt");
                gibt false zurück;
            }
            var reader = neuer FileReader();
            reader.onload = Funktion (e) {
                var img = neues Bild,
                    width = 95, //Bildgrößenänderungsbreite quality = 0.2, //Bildqualität canvas = document.createElement('canvas'),
                    Schublade = Leinwand.getContext("2d");
                img.src = dieses.Ergebnis;
                var scale = parseInt(Bildhöhe / Bildbreite);
                img.width=Breite;
                img.height = Breite * Maßstab;
                Leinwand.Breite = Bild.Breite;
                Leinwandhöhe = Bildhöhe;
                Schublade.drawImage(testimgId, 0, 0, Leinwandbreite, Leinwandhöhe);
                var base64 = canvas.toDataURL('image/jpeg', 0.2);
                konsole.log(base64);
                var image_base64 = img.src.replace("data:image/png;base64,","");
                image_base64=URI-Komponente kodieren(image_base64);
                Alarm("19")
                //Rückruf aufrufen callback&&callback(img.src);
            }
            reader.readAsDataURL(Datei);
        }

Der obige Code funktioniert auf PC und Android einwandfrei, gibt unter iOS jedoch eine feste Zeichenfolge mit Base64-Kodierung zurück, unabhängig davon, welches Bild Sie hochladen.

Dann ändern...

Nochmal ändern.....

Verschiedene Dokumente anzeigen..

Weiter ändern...

So wurde es schließlich gelöst

Funktion getBase64(Dateiobjekt){
            var Datei = Dateiobjekt,
                cvs = document.getElementById("Leinwand"),
                ctx = cvs.getContext("2d");
            if(Datei){
                var url = window.URL.createObjectURL(file); //PS: Nicht kompatibel mit IE
                var img = neues Bild();
                img.src = URL;
                img.onload = Funktion(){
                    ctx.clearRect(0,0,cvs.Breite,cvs.Höhe);
                    cvs.width = Bildbreite;
                    cvs.height = img.height;
                    ctx.drawImage(Bild,0,0,Bildbreite,Bildhöhe);
                    var base64 = cvs.toDataURL("bild/png");
                    Rückruf (Base64);
                    Alarm("20")
                }
            }
        }

Das ist der Sinn des Teilens ...

Der Grund ist, dass FileReader-Objekte unter iOS nicht unterstützt werden!

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

Das könnte Sie auch interessieren:
  • Beispielanalyse für Datei-, FileReader- und Ajax-Dateiupload (php)
  • js verwendet FileReader zum Lesen lokaler Dateien oder Blobs
  • Verwenden Sie JS, um Dateien zu bearbeiten (FileReader liest --node's fs)
  • So erhalten Sie den Inhalt einer TXT-Datei über FileReader in JS

<<:  translate(-50%,-50%) in CSS erzielt horizontalen und vertikalen Zentrierungseffekt

>>:  Eine kurze Diskussion über den Entwurf und die Optimierung von MySQL-Baumstrukturtabellen

Artikel empfehlen

Beispiel zum Aktivieren langsamer Abfragen in MySQL

Vorwort Das langsame Abfrageprotokoll ist eine se...

Beispielcode zur Implementierung eines Foto-Stacking-Effekts mit CSS

Ergebnisse erzielen Schritt 1. Ursprüngliche inde...

So implementieren Sie die Vue-Bindungsklasse und den Inline-Bindungsstil

Inhaltsverzeichnis Bindungsklasse Inline-Stile bi...

Detaillierte Erläuterung der Destrukturierungszuweisung von JS ES6-Variablen

Inhaltsverzeichnis 1. Was ist Dekonstruktion? 2. ...

Detaillierte Erläuterung des Linux-CRM-Bereitstellungscodes

Linux-Grundkonfiguration Kompilieren und installi...

Vue realisiert die Bildschirmanpassung von Großbildschirmseiten

In diesem Artikel wird der spezifische Code von V...

Reduzieren Sie die Speicher- und CPU-Auslastung durch die Optimierung von Webseiten

Manche Webseiten erscheinen möglicherweise nicht g...

Interner Ereignisrückruf der Webkomponentenkomponente und Problempunktanalyse

Inhaltsverzeichnis Vorne geschrieben Was genau is...

CentOS verwendet expect, um Skripte und Befehle remote in Stapeln auszuführen

Manchmal müssen wir Server stapelweise bedienen, ...

Detailliertes Tutorial zum Kompilieren und Installieren von Python3.6 unter Linux

1. Gehen Sie zunächst auf die offizielle Website ...