web-dev-qa-db-ja.com

JavaScriptでFileオブジェクトをインスタンス化する方法は?

JavaScriptには File オブジェクトがあります。テスト用にインスタンス化したい。

new File()を試しましたが、「Illegal constructor」エラーが表示されます。

Fileオブジェクトを作成することは可能ですか?


ファイルオブジェクトリファレンス: https://developer.mozilla.org/en/DOM/File

120
julesbou

W3C File API仕様によると、Fileコンストラクターには2つ(または3つ)のパラメーターが必要です。

したがって、空のファイルを作成するには次のようにします。

var f = new File([""], "filename");
  • 最初の引数は、テキストの行の配列として提供されるデータです。
  • 2番目の引数はファイル名です。
  • 3番目の引数は次のようになります。

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

FireFox、ChromeおよびOperaで動作しますが、SafariまたはIE/Edgeでは動作しません。

160
AlainD

できるようになりました!

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

更新

BlobBuilderは 廃止 テスト目的で使用している場合、使用方法を確認してください。

それ以外の場合は、 this question への回答など、Blobへの移行戦略に以下を適用します。

代わりにBlobを使用してください

代替として、 Blob があります File の代わりに使用できます W3C仕様 に従ってFileインターフェースが派生するものです。

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

FileインターフェースはBlobに基づいており、blob機能を継承し、ユーザーのシステム上のファイルをサポートするためにそれを拡張します。

Blobを作成する

XMLHttpRequestを介してファイルをアップロードし、それにBlobを提供する既存のJavaScriptメソッドで BlobBuilder をこのように使用すると、次のようにうまく機能します。

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

拡張例

サンプルの残りは jsFiddle でより完全な方法で実行されていますが、アップロードロジックを長期的に公開できないため、正常にアップロードされません。

18
Nick Josevski

現在、すべての主要なブラウザで可能かつサポートされています: https://developer.mozilla.org/en-US/docs/Web/API/File/File

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

アイデア...すでにDOMに存在する画像のためにjavaScriptでFileオブジェクト(api)を作成するには:

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

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

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

そんなことしないで! ...(とにかくやった)

->コンソールは、オブジェクトファイルのような結果を返します:

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

しかし、オブジェクトのサイズが間違っています...

なぜそうする必要があるのですか?

たとえば、更新中に追加された追加の画像とともに、製品の更新中に既にアップロードされた画像フォームを再送信する場合