2009-06-02 39 views
5

Trong Firefox 3, bạn có thể truy cập nội dung của phần tử <input type="file"> như sau.Dữ liệu tệp từ phần tử nhập

Giả sử một mẫu với các yếu tố sau:

<input type="file" id="myinput"> 

Bây giờ dữ liệu của tập tin được lựa chọn có thể được truy cập với:

// Get the file's data as a data: URL 
document.getElementById('myinput').files[0].getAsDataURL() 

Có cách nào qua trình duyệt để thực hiện cùng Điều?

tài liệu Firefox cho tính năng này:

+0

Bạn đang cố gắng hoàn thành điều gì? Xem trước hình ảnh trong trình duyệt hoặc tải lên tệp Ajax? –

+0

Mục tiêu hiện tại là vẽ hình ảnh trên canvas. Trong tương lai, tôi nghĩ rằng tôi có thể muốn thực hiện tải lên thông qua Ajax. – Doug

+0

Bạn đang khá hạn chế trong trường hợp đó. Tải lên tệp Ajax hoạt động trong FF 3+, Safari 4+ và Chrome 2+, vì vậy bạn có thể có nhiều may mắn hơn ở đó. Tôi, đối với một, không biết bất kỳ cách nào khác để nhập dữ liệu hình ảnh bên trong canvas. Nếu bạn tìm thấy, hãy cập nhật câu hỏi này. –

Trả lời

8

Điều này có thể trong ít nhất Chrome, Firefox và Safari: Reading Files. xem được liên kết jsfiddle

function readBlob(opt_startByte, opt_stopByte) { 

    var files = document.getElementById('files').files; 
    if (!files.length) { 
     alert('Please select a file!'); 
     return; 
    } 
    var file = files[0]; 
    var start = parseInt(opt_startByte) || 0; 
    var stop = parseInt(opt_stopByte) || file.size - 1; 

    var reader = new FileReader(); 

    // If we use onloadend, we need to check the readyState. 
    reader.onloadend = function(evt) { 
     if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
      document.getElementById('byte_content').textContent = _.reduce(evt.target.result, 
       function(sum, byte) { 
        return sum + ' 0x' + String(byte).charCodeAt(0).toString(16); 
       }, ''); 
     document.getElementById('byte_range').textContent = 
      ['Read bytes: ', start + 1, ' - ', stop + 1, 
      ' of ', file.size, ' byte file'].join(''); 
     } 
    }; 

    var blob; 
    if (file.slice) { 
     blob = file.slice(start, stop + 1); 
    }else if (file.webkitSlice) { 
     blob = file.webkitSlice(start, stop + 1); 
    } else if (file.mozSlice) { 
     blob = file.mozSlice(start, stop + 1); 
    } 
    console.log('reader: ', reader); 
    reader.readAsBinaryString(blob); 
    } 

    document.querySelector('.readBytesButtons').addEventListener('click', function(evt) { 
    if (evt.target.tagName.toLowerCase() == 'button') { 
     var startByte = evt.target.getAttribute('data-startbyte'); 
     var endByte = evt.target.getAttribute('data-endbyte'); 
     readBlob(startByte, endByte); 
    } 
    }, false); 
+0

mã jsFiddle dường như không hoạt động trong Chrome ngay bây giờ. –

+0

Cảm ơn bạn đã chỉ ra điều đó, tôi đã cập nhật fiddle. Dường như API đã được hoàn tất và Chrome hiện đang sử dụng .slice() thay vì cũ .webkitSlice(). – Paul

Các vấn đề liên quan