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.


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);


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ę.


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",
});

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


-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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.