JavaScript에서 File 객체를 인스턴스화하는 방법은 무엇입니까?


답변:


204

W3C File API 스펙에 따르면 File 생성자는 2 (또는 3) 개의 매개 변수를 필요로합니다.

빈 파일을 만들려면 다음을 수행하십시오.

var f = new File([""], "filename");
  • 첫 번째 인수는 텍스트 줄의 배열로 제공되는 데이터입니다.
  • 두 번째 인수는 파일 이름입니다.
  • 세 번째 인수는 다음과 같습니다.

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

FireFox, Chrome 및 Opera에서는 작동하지만 Safari 또는 IE / Edge에서는 작동하지 않습니다.


2
생산 Illegal constructor크롬 37 / 우분투는 그래서 작동하지 않습니다 없습니다
세바스티앙 Lorber

2
Firefox 28 이상, Chrome 38 이상 및 Opera 25 이상에서 작동하지만 Safari와 IE는 오늘날이 생성자를 아직 구현하지 않습니다 ( caniuse.com/#feat=fileapi 참조 ). 나는 현재 polyfill 또는 이것을 모방하는 방법을 찾고 있지만 지금까지 적합한 해결책을 찾지 못했습니다.
Pierre-Adrien Buisson이

@ PA.Buisson 나는 이것이 모든 경우에 해당되는지 확실하지 않지만 (나에게 충분했다) 여기에
raymondboswel

2
Windows Edge의 대안은 무엇입니까?
라비 Mishra

3
IE11의 경우 Blob 클래스를 사용하여 File 객체를 생성 할 수 있습니다. 이것은 나에게 가장 휴대용 솔루션 인 것 같습니다. file = new Blob([blobdata], {type: filetype, lastModified: filelastModified}); file.name = filename
Jesse Hogan

30

이제 할 수 있습니다!

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


아니요, Chrome에서는 작동하지 않습니다. code.google.com/p/chromium/issues/detail?id=164933을 참조하십시오 . Chrome 36 OSX에서 작동하지 않는지 확인했습니다.
Ray Nicholus 2016 년

그런 다음 실행할 때 Chrome 35 OSX에서 DOSE가 작동하는지 확인합니다.new File([], '')
Endless

방금 테스트를 거친 결과 35도 작동하지 않습니다. Firefox에서만 작동한다는 사실을 반영하여 답변을 조정하십시오.
레이 니콜러스

흠, 맞아. 실험용 크롬 플래그를 활성화 한 이후로만 작동했습니다 ... dl.dropboxusercontent.com/u/3464804/jCmQr8vrGk.gif
Endless

Illegal constructorChrome 37 / Ubuntu에서 제작
Sebastien Lorber

19

최신 정보

테스트 목적으로 BlobBuilder를 사용하는 경우 BlobBuilder는 더 이상 사용되지 않습니다 .

그렇지 않으면 이 질문에 대한 답변과 같이 Blob 으로 이동하는 마이그레이션 전략을 아래에 적용하십시오 .

대신 Blob을 사용하십시오.

대안으로이 물방울을 당신이 대신 사용할 수있는 파일 그대로 어떤 당에서 파일 인터페이스 도출 W3C 사양 :

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

File 인터페이스는 Blob을 기반으로하며 Blob 기능을 상속하고 사용자 시스템에서 파일을 지원하도록 확장합니다.

얼룩 만들기

파일을 업로드 하고 Blob을 제공 하는 기존 JavaScript 메소드 에서 BlobBuilder를 이와 같이 사용하면 다음 과 같이 XMLHttpRequest작동합니다.

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 에서보다 완전한 방식으로 작성되었지만 업로드 논리를 장기적으로 노출 할 수 없으므로 성공적으로 업로드하지 않습니다.


11
댓글이 오래되었습니다. BlobBuilder를 사용하지 말고 Blob 생성자를 사용하십시오. Blob ([ 'mythingy'], {유형 : "thingy"})
odinho-Velmont

이 코드는 실행되지 않습니다. 형식 오류 : BlobBuilder 생성자 아니다
포인터 널

2
불행히도 BlobBuilder는 더 이상 사용되지 않습니다 ( developer.mozilla.org/en-US/docs/Web/API/BlobBuilder
JD).

DataTransferItemList.add필요 File하지 않습니다 Blob. 원래 질문 : File 을 인스턴스화하는 방법은 무엇입니까?
Tomáš Zato-Reinstate Monica

1

이제 모든 주요 브라우저에서 가능하고 지원됩니다 : https://developer.mozilla.org/en-US/docs/Web/API/File/File

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

4
이 말을 아프게하는만큼 edge는 주요 브라우저입니다.
li x

실제로 사용하는 사람들이 많지 않았습니다. caniuse.com/#feat=fileapi-IE 2.6 %, Edge-1.4 %, Opera Mini-2.7 %. 에 netmarketshare.com/browser-market-share.aspx 4.3 %입니다. Edge에 관심이있는 경우 해결 방법 developer.microsoft.com/en-us/microsoft-edge/platform/issues/…
Pavel Evstigneev

Evestigneev는 지원되는 브라우저의 전 세계 사용량이 약 0.2 %이므로 결과를 잘못 해석했습니다. 이 그림은 api를 사용하는 브라우저 수와 Edge / IE 자체가 여전히 사용중인 브라우저의 약 15 %를 구성합니다.
li x

0

아이디어 ... 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);

하지마! ... (하지만 어쨌든 했어)

-> 콘솔은 Object 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

그러나 물체의 크기가 잘못되었습니다 ...

왜 그렇게해야합니까?

예를 들어, 제품 업데이트 중에 이미 업로드 된 이미지 양식과 업데이트 중에 추가 된 추가 이미지를 재전송


-5

이것은 자바 스크립트와 동적이기 때문에 File 인터페이스와 일치하는 클래스를 직접 정의하고 대신 사용할 수 있습니다.

파일 업로드를 시뮬레이트하고 File 객체에서 작동하기 때문에 dropzone.js로 그렇게해야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.