วิธีการสร้างอินสแตนซ์อ็อบเจ็กต์ไฟล์ใน JavaScript


150

มีFileวัตถุใน JavaScript ฉันต้องการสร้างอินสแตนซ์เพื่อวัตถุประสงค์ในการทดสอบ

ฉันได้ลองnew File()แล้ว แต่ได้รับข้อผิดพลาด "ตัวสร้างที่ผิดกฎหมาย"

เป็นไปได้ไหมที่จะสร้างFileวัตถุ?


การอ้างอิง File Object: https://developer.mozilla.org/en/DOM/File

คำตอบ:


216

ตามข้อกำหนด W3C File API ตัวสร้างไฟล์ต้องการพารามิเตอร์ 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บน Chrome 37 / Ubuntu จึงไม่ทำงาน
Sebastien Lorber

2
สิ่งนี้ใช้ได้ใน Firefox 28+, Chrome 38+ และ Opera 25 + อย่างไรก็ตาม Safari และ IE ยังไม่ใช้ตัวสร้างนี้ในวันนี้ (ดูcaniuse.com/#feat=fileapi ) ตอนนี้ฉันกำลังมองหาโพลีฟิลล์หรือวิธีเลียนแบบสิ่งนี้ แต่ยังไม่พบวิธีแก้ปัญหาที่เหมาะสม
Pierre-Adrien Buisson

@ PA. Buisson ฉันไม่แน่ใจว่าสิ่งนี้ถือได้สำหรับทุกกรณีหรือไม่ (เพียงพอสำหรับฉัน) แต่คุณสามารถใช้ตัวสร้าง Blob () แทนได้ตามคำแนะนำที่นี่
raymondboswel

2
ทางเลือกอื่นสำหรับ windows edge คืออะไร?
Ravi Mishra

3
สำหรับ IE11 คุณสามารถใช้คลาส Blob เพื่อสร้างอ็อบเจกต์ File นี่ดูเหมือนจะเป็นทางออกที่พกพาสะดวกที่สุดสำหรับฉัน file = new Blob([blobdata], {type: filetype, lastModified: filelastModified}); file.name = filename
Jesse Hogan

31

ตอนนี้คุณสามารถ!

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

จากนั้นฉันจะตรวจสอบว่า DOSE ทำงานใน Chrome 35 OSX เมื่อคุณเรียกใช้new File([], '')
ไม่มีที่สิ้นสุด

เพิ่งทดสอบมันใช้ไม่ได้ใน 35 เช่นกัน โปรดปรับคำตอบของคุณให้สอดคล้องกับข้อเท็จจริงที่ว่าสิ่งนี้ใช้ได้เฉพาะใน Firefox
Ray Nicholus

อืมคุณพูดถูก มันใช้งานได้สำหรับฉันเท่านั้นเนื่องจากฉันได้เปิดใช้งานการตั้งค่าสถานะ Chrome แบบทดลอง ... dl.dropboxusercontent.com/u/3464804/jCmQr8vrGk.gif
ไม่มีที่สิ้นสุด

ผลิตIllegal constructorบน Chrome 37 / Ubuntu
Sebastien Lorber

19

อัปเดต

BlobBuilder เลิกใช้แล้วดูว่าคุณใช้งานอย่างไรหากคุณใช้เพื่อการทดสอบ

หรือใช้กลยุทธ์การย้ายข้อมูลด้านล่างเพื่อไปที่Blobเช่นคำตอบสำหรับคำถามนี้

ใช้ Blob แทน

นอกจากนี้ยังมีBlobที่คุณสามารถใช้แทนไฟล์ได้เนื่องจากเป็นสิ่งที่อินเทอร์เฟซของไฟล์ได้มาจากข้อมูลจำเพาะของ W3C :

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

อินเทอร์เฟซของไฟล์ขึ้นอยู่กับ Blob ซึ่งสืบทอดฟังก์ชันการทำงานของ Blob และขยายเพื่อรองรับไฟล์ในระบบของผู้ใช้

สร้าง Blob

การใช้BlobBuilderเช่นนี้กับวิธีการ JavaScript ที่มีอยู่ซึ่งใช้ไฟล์เพื่ออัปโหลดXMLHttpRequestและส่ง Blob ให้มันทำงานได้ดีเช่นนี้:

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'], {type: "thingy"})
odinho - Velmont

รหัสนี้ไม่ทำงาน TypeError: BlobBuilder ไม่ใช่ตัวสร้าง
Pointer Null

2
ขออภัย BlobBuilder ล้าสมัยแล้ว: developer.mozilla.org/en-US/docs/Web/API/BlobBuilder
JD

DataTransferItemList.addต้องไม่ได้File Blobสำหรับคำถามเดิม: จะสร้างอินสแตนซ์ไฟล์ได้อย่างไร?
Tomáš Zato - คืนสถานะ Monica

2

ตอนนี้เป็นไปได้และรองรับโดยเบราว์เซอร์หลักทั้งหมด: 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 คุณต้องหาทางแก้ปัญหาสำหรับผู้พัฒนา
Microsoft.com/en-us/microsoft-edge/platform/issues/…

Evestigneev คุณตีความผลลัพธ์ผิดเนื่องจากเบราว์เซอร์ที่รองรับมีการใช้งานทั่วโลกประมาณ 0.2% ตัวเลขนี้คือจำนวนเบราว์เซอร์ที่ใช้ api ในขณะที่ edge / IE คิดเป็นประมาณ 15% ของเบราว์เซอร์ที่ยังใช้งานอยู่
li x

1

แนวคิด ... ในการสร้าง File object (api) ใน javaScript สำหรับรูปภาพที่มีอยู่แล้วใน 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);

อย่าทำอย่างนั้น! ... (แต่ฉันก็ทำอยู่ดี)

-> คอนโซลให้ผลลัพธ์คล้ายกับไฟล์ออบเจ็กต์:

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

เนื่องจากนี่คือจาวาสคริปต์และไดนามิกคุณสามารถกำหนดคลาสของคุณเองที่ตรงกับอินเทอร์เฟซไฟล์และใช้แทนได้

ฉันต้องทำอย่างนั้นกับ dropzone.js เพราะฉันต้องการจำลองการอัปโหลดไฟล์และมันใช้งานได้กับวัตถุไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.