Làm thế nào để khởi tạo một đối tượng Tệp trong JavaScript?


Câu trả lời:


203

Theo đặc tả API tệp W3C, hàm tạo tệp yêu cầu 2 (hoặc 3) tham số.

Vì vậy, để tạo một tập tin trống làm:

var f = new File([""], "filename");
  • Đối số đầu tiên là dữ liệu được cung cấp dưới dạng một mảng các dòng văn bản;
  • Đối số thứ hai là tên tệp;
  • Đối số thứ ba trông giống như:

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

Nó hoạt động trong FireFox, Chrome và Opera, nhưng không có trong Safari hoặc IE / Edge.


2
Sản xuất Illegal constructortrên Chrome 37 / Ubuntu vì vậy không có nó không hoạt động
Sebastien Lorber

2
Điều này không hoạt động trong Firefox 28+, Chrome 38+ và Opera 25 +. Tuy nhiên, Safari và IE vẫn không triển khai trình tạo này ngày hôm nay (xem caniuse.com/#feat=fileapi ). Tôi hiện đang tìm kiếm một polyfill hoặc một cách để mô phỏng điều này, nhưng cho đến nay vẫn chưa tìm thấy giải pháp phù hợp nào.
Pierre-Adrien Buisson

@ PA.Buisson Tôi không chắc chắn liệu điều này có đúng với mọi trường hợp không (nhưng nó là đủ cho tôi), nhưng bạn có thể sử dụng hàm tạo Blob (), như được đề xuất ở đây
raymondboswel

2
Sự thay thế này cho cạnh cửa sổ là gì?
Ravi Mishra

3
Đối với IE11, bạn có thể sử dụng lớp Blob để xây dựng một đối tượng Tệp. Đây dường như là giải pháp di động nhất đối với tôi. file = new Blob([blobdata], {type: filetype, lastModified: filelastModified}); file.name = filename
Jesse Hogan

30

Bây giờ bạn có thể!

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


Không, nó không hoạt động trong Chrome. Xem code.google.com/p/chromium/issues/detail?id=164933 . Đã xác minh rằng nó không hoạt động trong Chrome 36 OSX.
Ray Nicholus

sau đó tôi sẽ xác minh rằng nó DOSE hoạt động trong Chrome 35 OSX khi bạn chạynew File([], '')
Vô tận

Chỉ cần thử nghiệm, nó cũng không hoạt động trong 35. Vui lòng điều chỉnh câu trả lời của bạn để phản ánh thực tế rằng điều này chỉ hoạt động trong Firefox.
Ray Nicholus

hmm, bạn nói đúng nó chỉ hoạt động với tôi vì tôi đã kích hoạt cờ chrome thử nghiệm ... dl.dropboxusercontent.com/u/3464804/jCmQr8vrGk.gif
Endless

Sản xuất Illegal constructortrên Chrome 37 / Ubuntu
Sebastien Lorber

19

Cập nhật

BlobBuilder đã bị lỗi thời khi xem cách bạn sử dụng nó, nếu bạn đang sử dụng nó cho mục đích thử nghiệm.

Mặt khác, áp dụng cách dưới đây với các chiến lược di chuyển đến Blob , chẳng hạn như câu trả lời cho câu hỏi này .

Sử dụng Blob thay thế

Thay vào đó, có một Blob mà bạn có thể sử dụng thay cho Tệp vì đó là giao diện Tệp xuất phát từ thông số W3C :

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

Giao diện Tệp dựa trên Blob, kế thừa chức năng blob và mở rộng nó để hỗ trợ các tệp trên hệ thống của người dùng.

Tạo Blob

Sử dụng BlobBuilder như thế này trên một phương thức JavaScript hiện có, có một Tệp để tải lên qua XMLHttpRequestvà cung cấp một Blob cho nó hoạt động tốt như thế này:

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

Ví dụ mở rộng

Phần còn lại của mẫu là trên jsFiddle theo cách hoàn thiện hơn nhưng sẽ không tải lên thành công vì tôi không thể phơi bày logic tải lên trong một thời gian dài.


11
Nhận xét này đã lỗi thời. Không sử dụng BlobBuilder, sử dụng hàm tạo Blob. Blob (['mythingy'], {type: "thingy"})
odinho - Velmont

Mã này không chạy. TypeError: BlobBuilder không phải là nhà xây dựng
Con trỏ Null

2
Thật không may, BlobBuilder đã lỗi thời: developer.mozilla.org/en-US/docs/Web/API/BlobBuilder
JD.

DataTransferItemList.addđòi hỏi Filekhông Blob. Vì vậy, với câu hỏi ban đầu: Làm thế nào để khởi tạo tập tin ?
Tomáš Zato - Phục hồi Monica

1

Giờ đây, nó có thể và được hỗ trợ bởi tất cả các trình duyệt chính: https://developer.mozilla.org/en-US/docs/Web/API/File/File

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

4
Nhiều như nó làm tôi đau đớn khi nói điều này, edge là một trình duyệt chính.
li x

Tôi đã không thấy nhiều người sử dụng nó thực sự. caniuse.com/#feat=fileapi - IE 2,6%, Edge - 1,4%, Opera Mini - 2,7%. Trên netmarketshare.com/browser-market-share.aspx là 4,3%. Nếu bạn quan tâm Cạnh sau đó cần phải tìm một số cách giải quyết developer.microsoft.com/en-us/microsoft-edge/platform/issues/...
Pavel Evstigneev

Evestigneev bạn đã hiểu sai kết quả vì các trình duyệt được hỗ trợ có mức sử dụng toàn cầu khoảng 0,2%. Con số này là có bao nhiêu trình duyệt đang sử dụng api trong khi cạnh / IE tự nó chiếm khoảng 15% trình duyệt vẫn đang sử dụng.
li x

0

Ý tưởng ... Để tạo một đối tượng Tệp (api) trong javaScript cho các hình ảnh đã có trong 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);

Đừng làm vậy! ... (Nhưng dù sao tôi cũng đã làm được)

-> bàn điều khiển cho kết quả tương tự như Tệp đối tượng:

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

Nhưng kích thước của vật thể là sai ...

Tại sao tôi cần phải làm điều đó?

Ví dụ: để truyền lại một hình ảnh đã được tải lên, trong khi cập nhật sản phẩm, cùng với các hình ảnh bổ sung được thêm vào trong quá trình cập nhật


-5

Bởi vì đây là javascript và động, bạn có thể xác định lớp của riêng mình phù hợp với giao diện Tệp và sử dụng thay thế.

Tôi đã phải làm điều đó với dropzone.js vì tôi muốn mô phỏng tải lên tệp và nó hoạt động trên các đối tượng Tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.