2016-07-05 21 views
5

Diese Frage an und von How to updoad in old browsers (ex Safari 5.1.4)Wie erstellt man einen ArrayBuffer und einen Daten-URI von Blob- und File-Objekten ohne FileReader?

Gegeben inspiriert bezogen ist ein <input type="file"> Element eine files Eigenschaft enthält File Objekte, die sich von Blob erben, ist es möglich, eine ArrayBuffer und wandeln die ArrayBuffer zu einem data URI von einem Blob oder File zu erstellen Objekt ohne Verwendung FileReader?

Ansätze haben versucht bisher

  • zu "arraybuffer", schaffen eine MessageEvent mit event.data Satz File Objekt eine mock WebSocket mit .binaryType Satz erstellen; Ergebnis ist File Objekt am onmessage handler

  • set Prototyp File zu ArrayBuffer, Uint8Array; Ergebnis ist Uncaught TypeError: Method ArrayBuffer.prototype.byteLength called on incompatible receiver #<ArrayBuffer>(), Uncaught TypeError: Method get TypedArray.prototype.byteLength called on incompatible receiver [object Object]()

  • gesetzt File bei FormData Objekt, Versuch Anfrage Körper zu schreiben, allerdings nicht gut konzipierte; Ergebnis Bad Request bei plnkr

Erwartetes Ergebnis: Konvertieren Blob und File Objekte TypedArray dann data URL oder direkt an data URL

<!DOCTYPE html> 
<html> 

<head> 
</head> 

<body> 
    <form method="get" entype="multipart/form-data" target="binaryFrame"> 
    <input id="#avatar" type="file" name="file" /> 
    <input type="submit" /> 
    </form> 
    <iframe name="binaryFrame"></iframe> 
    <script> 
    var input = document.querySelector("input[type=file]"); 
    input.addEventListener("change", handleFiles, true); 
    // see http://jsfiddle.net/adamboduch/JVfkt/ 
    var sock = new WebSocket("ws://mock"); 
    sock.binaryType = "arraybuffer"; 
    sock.onerror = function(e) { 
     console.log("sock error", e); // ignore, here 
     } 

    sock.onmessage = function(e) { 
     console.log("socket message", e.data, e.data instanceof ArrayBuffer); 
    }; 

    function handleFiles(evnet) { 
     var file = event.target.files[0]; 
     sock.dispatchEvent(new MessageEvent("message", { 
     data: file 
     })); 
     var data = new FormData(); 
     data.append("file", file); 
     document.forms[0].action = data; 
    } 
    </script> 
</body> 

</html> 

Siehe auch Display image from blob using javascript and websockets, How can you encode a string to Base64 in JavaScript?; interessanterweise ironisch wie ich jetzt ähnliche Frage frage https://stackoverflow.com/questions/34302231/is-there-any-way-to-convert-the-file-to-an-arraybuffer-without-filereader-api; Blob.slice() method, FileReader.readAsDataURL() method

+0

Ich habe keine Safari 5 zur Hand (obwohl dieser Browser seit Jahren veraltet ist, sollten Benutzer es so schnell wie möglich ändern) oder einen Browser, der 'Blob'-Objekte (oder' Datei' unterstützt)) unterstützt jedoch nicht den 'FileReader'. Gibt es das wirklich? Schaust du nicht in die falsche Richtung? (Eine Möglichkeit wäre, die Datei irgendwo hochzuladen und dann mit XHR erneut zu holen, aber zuerst diese ersten Fragen zu beantworten) – Kaiido

+1

@Kaiido _ "noch ein Browser, der Blob-Objekte (oder Datei) unterstützt, aber den FileReader nicht unterstützt. Gibt es das wirklich? "_ Auch hier haben Sie keinen Zugang zu Safari. Laut der MDN-Browserkompatibilität wird '' in Version 1.0 von Safari, 'Blob' in 5.1,' FileReader' in 6 unterstützt.0; 'responseType'' "blob" 'und' "arraybuffer" 'bei' XMLHttpRequest' state '" Yes "'. Neugierig, wie rohe Daten tatsächlich gespeichert sind, auf die innerhalb des "Blob" -Objekts zugegriffen wird? – guest271314

+0

Wahrscheinlich eine frühe Implementierung ... Zu schade, dass URL.createObjectURL auch nicht unterstützt wird, sonst hätten Sie etwas so einfaches ausprobieren können wie 'var url = URL.createObjectURL (blob); var xhr = neue XMLHttpRequest(); xhr.onload = function() { rawData = this.response; } xhr.open ('get', url) xhr.send(); '. Wenn man über frühe Implementierungen spricht, kann man sehen, dass IE9 TypedArray nicht unterstützt, aber immer noch eine Art durch canvas imageData-Objekt hat. – Kaiido

Antwort

1

Kann versuchen createObjectURL(), wenn es

URL.createObjectURL unterstützt() statische Methode erstellt eine DOMString eine URL enthält, gegeben, das Objekt darstellt, in Parametern können Sie url jegliche Bild erhalten, dokumentiert den Benutzer Uploads aber wenn ihr binäres wird es einfach herunterladen

var files = fileupload.files; //get all files 

for (var i = 0; file = files[i]; i++) 
    url= window.URL.createObjectURL(file); //gives url to files you can embed 

https://jsfiddle.net/y2u6hzb7/

es schafft nur Link und nicht bin Array starten so txt öffnen sie den Link um zu sehen neue Registerkarte.

+0

Siehe Original-Frage _ "Wie um einen 'ArrayBuffer' und' Daten-URI' aus 'Blob'- und' File'-Objekten ohne 'FileReader' zu erzeugen?" _ 'URL.createObjectURL()' konvertiert 'Blob' nicht in' ArrayBuffer' oder 'Daten-URI' – guest271314