Jak utworzyć instancję obiektu File w JavaScript?

Odpowiedzi:

204

Zgodnie ze specyfikacją W3C File API, konstruktor File wymaga 2 (lub 3) parametrów.

Aby utworzyć pusty plik, wykonaj:

var f = new File([""], "filename");
  • Pierwszy argument to dane dostarczone jako tablica wierszy tekstu;
  • Drugim argumentem jest nazwa pliku;
  • Trzeci argument wygląda następująco:

    var f = new File([""], "filename.txt", {type: "text/plain", lastModified: date})

Działa w FireFox, Chrome i Opera, ale nie w Safari ani IE / Edge.

AlainD
źródło
2
Produkuje Illegal constructorna Chrome 37 / Ubuntu, więc nie, nie działa
Sebastien Lorber,
2
Działa to w przeglądarkach Firefox 28+, Chrome 38+ i Opera 25+, jednak Safari i IE nadal nie implementują dziś tego konstruktora (patrz caniuse.com/#feat=fileapi ). Obecnie szukam wypełnienia polyfill lub sposobu na jego emulację, ale do tej pory nie znalazłem odpowiedniego rozwiązania.
Pierre-Adrien Buisson
@ PA.Buisson Nie jestem pewien, czy to odnosi się do wszystkich przypadków (to był wystarczający dla mnie), ale można użyć Blob () konstruktora zamiast, jak sugeruje tutaj
raymondboswel
2
Jaka jest alternatywa dla tego dla krawędzi systemu Windows?
Ravi Mishra
3
W przypadku przeglądarki IE11 można użyć klasy Blob do skonstruowania obiektu File. Wydaje mi się, że jest to najbardziej przenośne rozwiązanie. file = new Blob([blobdata], {type: filetype, lastModified: filelastModified}); file.name = filename
Jesse Hogan
30

Teraz możesz!

var parts = [
  new Blob(['you construct a file...'], {type: 'text/plain'}),
  ' Same way as you do with blob',
  new Uint16Array([33])
];

// Construct a file
var file = new File(parts, 'sample.txt', {
    lastModified: new Date(0), // optional - default = now
    type: "overide/mimetype" // optional - default = ''
});

var fr = new FileReader();

fr.onload = function(evt){
   document.body.innerHTML = evt.target.result + "<br><a href="+URL.createObjectURL(file)+" download=" + file.name + ">Download " + file.name + "</a><br>type: "+file.type+"<br>last modified: "+ file.lastModifiedDate
}

fr.readAsText(file);

Nieskończony
źródło
Nie, to nie działa w Chrome. Zobacz code.google.com/p/chromium/issues/detail?id=164933 . Zweryfikowano, że nie działa w Chrome 36 OSX.
Ray Nicholus
wtedy sprawdzę, czy DOSE działa w Chrome 35 OSX po uruchomieniunew File([], '')
Endless
Właśnie przetestowany, to też nie działa w 35. Dostosuj swoją odpowiedź, aby odzwierciedlić fakt, że działa to tylko w przeglądarce Firefox.
Ray Nicholus
hmm, masz rację. zadziałało tylko dla mnie, odkąd aktywowałem eksperymentalną flagę Chrome ... dl.dropboxusercontent.com/u/3464804/jCmQr8vrGk.gif
Endless
Działa Illegal constructorna Chrome 37 / Ubuntu
Sebastien Lorber,
19

Aktualizacja

BlobBuilder został przestarzały, zobacz, jak go używasz, jeśli używasz go do celów testowych.

W przeciwnym razie zastosuj poniższe strategie migracji do Bloba , takie jak odpowiedzi na to pytanie .

Zamiast tego użyj obiektu Blob

Alternatywnie istnieje Blob , którego można użyć zamiast File, ponieważ jest to interfejs pliku, zgodnie ze specyfikacją W3C :

interface File : Blob {
    readonly attribute DOMString name;
    readonly attribute Date lastModifiedDate;
};

Interfejs File jest oparty na obiekcie Blob, dziedzicząc funkcjonalność obiektu BLOB i rozszerzając go w celu obsługi plików w systemie użytkownika.

Utwórz obiekt Blob

Użycie BlobBuilder w ten sposób w istniejącej metodzie JavaScript, która pobiera plik do przesłania za pośrednictwem XMLHttpRequesti dostarczenie do niego obiektu Blob, działa dobrze w następujący sposób:

var BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder;
var bb = new BlobBuilder();

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://jsfiddle.net/img/logo.png', true);

xhr.responseType = 'arraybuffer';

bb.append(this.response); // Note: not xhr.responseText

//at this point you have the equivalent of: new File()
var blob = bb.getBlob('image/png');

/* more setup code */
xhr.send(blob);

Rozszerzony przykład

Pozostała część próbki znajduje się na jsFiddle w bardziej kompletny sposób, ale nie zostanie pomyślnie przesłana, ponieważ nie mogę ujawnić logiki przesyłania na dłuższą metę.

Nick Josevski
źródło
11
Ten komentarz jest nieaktualny. Nie używaj BlobBuilder, użyj konstruktora Blob. Blob (['mythingy'], {type: "thingy"})
odinho - Velmont,
Ten kod nie działa. TypeError: BlobBuilder nie jest konstruktorem
Pointer Null
2
Niestety BlobBuilder jest przestarzały: developer.mozilla.org/en-US/docs/Web/API/BlobBuilder
JD.
DataTransferItemList.addFilenie wymaga Blob. A więc do pierwotnego pytania: jak utworzyć wystąpienie pliku ?
Tomáš Zato - Przywróć Monikę
1

Teraz jest to możliwe i obsługiwane przez wszystkie główne przeglądarki: https://developer.mozilla.org/en-US/docs/Web/API/File/File

var file = new File(["foo"], "foo.txt", {
  type: "text/plain",
});
Pavel Evstigneev
źródło
4
Choć boli mnie to powiedzieć, Edge jest główną przeglądarką.
li x
Właściwie nie widziałem wielu ludzi, którzy go używali. caniuse.com/#feat=fileapi - IE 2,6%, Edge - 1,4%, Opera Mini - 2,7%. Na netmarketshare.com/browser-market-share.aspx wynosi 4,3%. Jeśli zależy Ci na Edge, musisz znaleźć programistę
Microsoft.com/en-us/microsoft-edge/platform/issues/…
Evestigneev, źle zinterpretowałeś wyniki, ponieważ obsługiwane przeglądarki mają globalne wykorzystanie około 0,2%. Ta liczba pokazuje, ile przeglądarek korzysta z interfejsu API, podczas gdy sama Edge / IE stanowi około 15% przeglądarek nadal w użyciu.
li x
0

Pomysł ... Aby utworzyć obiekt File (api) w javaScript dla obrazów już obecnych w DOM:

<img src="../img/Products/fijRKjhudDjiokDhg1524164151.jpg">

var file = new File(['fijRKjhudDjiokDhg1524164151'],
                     '../img/Products/fijRKjhudDjiokDhg1524164151.jpg', 
                     {type:'image/jpg'});

// created object file
console.log(file);

Nie rób tego! ... (ale i tak to zrobiłem)

-> konsola daje wynik podobny do pliku obiektu:

File(0) {name: "fijRKjokDhgfsKtG1527053050.jpg", lastModified: 1527053530715, lastModifiedDate: Wed May 23 2018 07:32:10 GMT+0200 (Paris, Madrid (heure d’été)), webkitRelativePath: "", size: 0, …}
lastModified:1527053530715
lastModifiedDate:Wed May 23 2018 07:32:10 GMT+0200 (Paris, Madrid (heure d’été)) {}
name:"fijRKjokDhgfsKtG1527053050.jpg"
size:0
type:"image/jpg"
webkitRelativePath:""__proto__:File

Ale rozmiar obiektu jest zły ...

Dlaczego muszę to zrobić?

Na przykład w celu retransmisji już załadowanego formularza graficznego podczas aktualizacji produktu, wraz z dodatkowymi zdjęciami dodanymi podczas aktualizacji

SNS - Web et Informatique
źródło
-5

Ponieważ jest to skrypt javascript i dynamiczny, możesz zdefiniować własną klasę pasującą do interfejsu File i użyć jej zamiast tego.

Musiałem to zrobić z dropzone.js, ponieważ chciałem zasymulować przesyłanie pliku i działa to na obiektach File.

Ian1971
źródło