JavaScript'te bir File nesnesi nasıl oluşturulur?


Yanıtlar:


205

W3C Dosya API'sı belirtimine göre, Dosya yapıcısı 2 (veya 3) parametre gerektirir.

Boş bir dosya oluşturmak için şunları yapın:

var f = new File([""], "filename");
  • İlk argüman bir metin satırı dizisi olarak sağlanan verilerdir;
  • İkinci argüman dosya adı;
  • Üçüncü argüman şöyle:

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

FireFox, Chrome ve Opera'da çalışır, ancak Safari veya IE / Edge'de çalışmaz.


2
Üretir Illegal constructorChrome 37 üzerinde / Ubuntu öylesine hayır işi değil
Sebastien Lorber

2
Firefox 28+, Chrome 38+ ve Opera 25 + 'da çalışır. Ancak, Safari ve IE bugün bu yapıcıyı hala uygulamamaktadır (bkz. Caniuse.com/#feat=fileapi ). Şu anda bir poli dolgu veya bunu taklit etmenin bir yolunu arıyorum, ancak şu ana kadar uygun bir çözüm bulamadık.
Pierre-Adrien Buisson

@ PA.Buisson Bunun tüm durumlar için geçerli olup olmadığından emin değilim (benim için yeterliydi), ancak burada
raymondboswel

2
Windows kenarı için bunun alternatifi nedir?
Ravi Mishra

3
IE11 için, bir File nesnesi oluşturmak için Blob sınıfını kullanabilirsiniz. Bu benim için en taşınabilir çözüm gibi görünüyor. file = new Blob([blobdata], {type: filetype, lastModified: filelastModified}); file.name = filename
Jesse Hogan

30

Şimdi yapabilirsin!

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


Hayır, Chrome'da çalışmıyor. Bkz. Code.google.com/p/chromium/issues/detail?id=164933 . Chrome 36 OSX'te çalışmadığı doğrulandı.
Ray Nicholus

o zaman çalıştırdığınızda DOSE Chrome 35 OSX'te çalıştığını doğrulayacağımnew File([], '')
Endless

Sadece test edildi, 35'te de çalışmıyor. Lütfen yanıtınızı yalnızca Firefox'ta çalıştığını gösterecek şekilde ayarlayın.
Ray Nicholus

hmm, haklısın. deneysel bir krom bayrağı etkinleştirdiğim için sadece benim için çalıştı
Sonsuz

Üreten Illegal constructor37 / Ubuntu Chrome
Sebastien Lorber

19

Güncelleme

Test amacıyla kullanıyorsanız, BlobBuilder kullanımdan kaldırıldığını görün.

Aksi takdirde , bu sorunun yanıtları gibi Blob'a gitme göç stratejileri ile aşağıdakileri uygulayın .

Bunun yerine bir Blob kullanın

Alternatif olarak, Dosya arayüzünün W3C spesifikasyonlarına göre türetildiği gibi Dosya yerine kullanabileceğiniz bir Blob vardır :

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

Dosya arayüzü Blob'u temel alır, blob işlevselliğini devralır ve kullanıcının sistemindeki dosyaları destekleyecek şekilde genişletir.

Blob'u Oluştur

BlobBuilder'ı , karşıya yüklenecek bir Dosya alan mevcut bir JavaScript yönteminde kullanmak ve bir Blob'uXMLHttpRequest sağlamak şu şekilde çalışır:

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

Genişletilmiş örnek

Numunenin geri kalanı jsFiddle'da daha eksiksiz bir şekilde çalışıyor, ancak yükleme mantığını uzun süreli olarak gösteremediğim için başarılı bir şekilde yüklenmeyecek.


11
Bu yorum güncel değil. BlobBuilder kullanmayın, Blob yapıcısını kullanın. Blob (['mythingy'], {type: "thingy"})
odinho - Velmont

Bu kod çalışmaz. TypeError: BlobBuilder bir kurucu değil
Pointer Null

2
Ne yazık ki, BlobBuilder kullanılmıyor: developer.mozilla.org/en-US/docs/Web/API/BlobBuilder
JD.

DataTransferItemList.addgerektirir Filedeğil Blob. Yani orijinal soruya: Dosya nasıl somutlaştırılır ?
Tomáš Zato - Monica

1

Artık mümkün ve tüm büyük tarayıcılar tarafından destekleniyor: https://developer.mozilla.org/en-US/docs/Web/API/File/File

var file = new File(["foo"], "foo.txt", {
  type: "text/plain",
});

4
Bunu söylemek bana acı veriyorsa, edge büyük bir tarayıcıdır.
li x

Aslında onu kullanan çok insan görmedim. caniuse.com/#feat=fileapi - IE% 2.6, Kenar -% 1.4, Opera Mini -% 2.7. Açık netmarketshare.com/browser-market-share.aspx 4.3% 'dir. Edge'i önemsiyorsanız, bazı çözüm bulmanız gerekir developer.microsoft.com/en-us/microsoft-edge/platform/issues/…
Pavel Evstigneev

Desteklenen tarayıcıların yaklaşık% 0,2'lik küresel kullanımı olduğundan sonuçları yanlış yorumladınız. Edge / IE'nin kendisi hala kullanılmakta olan tarayıcıların yaklaşık% 15'ini oluştururken, bu rakam api'yi kaç tarayıcı kullandığını gösterir.
li x

0

Fikir ... DOM'da zaten bulunan görüntüler için javaScript'te bir File nesnesi (api) oluşturmak için:

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

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

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

Bunu yapma! ... (ama yine de yaptım)

-> konsol Nesne Dosyası'na benzer bir sonuç verir:

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

Ama nesnenin boyutu yanlış ...

Bunu neden yapmam gerekiyor?

Örneğin, ürün güncellemesi sırasında önceden yüklenmiş bir görüntü formunu ve güncelleme sırasında eklenen ek resimleri yeniden iletmek için


-5

Bu javascript ve dinamik olduğundan, Dosya arabirimiyle eşleşen kendi sınıfınızı tanımlayabilir ve bunun yerine kullanabilirsiniz.

Bir dosya yüklemesini simüle etmek istediğimden ve File nesneleri üzerinde çalıştığından dropzone.js ile bunu yapmak zorunda kaldım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.