2011-10-10 38 views
8

Tôi đang sử dụng tính năng chọn tệp 'nhiều' tuyệt vời của HTML5.HTML5/JS - Hiển thị nhiều đầu vào tệp trong div

<input type="file" id="fileInput" onChange="runTest()" multiple> 

Tôi muốn hiển thị tên tập tin được lựa chọn bên dưới trường đầu vào và làm cho nó trông khá với CSS, tuy nhiên ...

Nếu tôi chạy một chức năng kiểm tra JS, rằng 'cảnh báo' tôi về giá trị trường đầu vào, nó chỉ cho thấy một tập tin bất kể tôi chọn 10.

function runTest() { 
var fileInput = document.getElementById('fileInput').value; 
alert("You selected: "+fileInput); 
} 

tôi đã làm điều này trong khi tôi đã có một lĩnh vực đầu vào 'đơn' tập và làm việc ổn nhưng bây giờ nó là 'nhiều', nó doesn' Tôi thích nó

Mọi đề xuất?

Trả lời

7

Vâng, có vẻ như giá trị hoặc val(), được trả về bởi phần tử là tên của tệp được chọn cuối cùng. Để giải quyết vấn đề này, bạn nên sử dụng bản chất của các sự kiện nhiều thay đổi:

$('input:file[multiple]').change(
    function(){ 
     $('ul').append($('<li />').text($(this).val())); 
    }); 

JS Fiddle demo.

Và nhập tên vào danh sách (như trong ví dụ) hoặc thêm giá trị mới nhất vào mảng hoặc có thể sử dụng/tạo đầu vào bị ẩn để lưu trữ tên tệp như bạn cảm thấy phù hợp nhất với ứng dụng của bạn.

Để truy cập vào tập tin tên (cũng như ngày sửa đổi cuối cùng, tập tin có kích thước ...) bạn có thể (thử nghiệm trong Chromium 12/Ubuntu 11.04) sử dụng như sau:

$('input:file[multiple]').change(
    function(e){ 
     console.log(e.currentTarget.files); 
    }); 

JS Fiddle demo.


Sửa để làm cho trên hơi hữu ích hơn, và hy vọng, minh chứng:

$('input:file[multiple]').change(
    function(e){ 
     console.log(e.currentTarget.files); 
     var numFiles = e.currentTarget.files.length; 
      for (i=0;i<numFiles;i++){ 
       fileSize = parseInt(e.currentTarget.files[i].fileSize, 10)/1024; 
       filesize = Math.round(fileSize); 
       $('<li />').text(e.currentTarget.files[i].fileName).appendTo($('#output')); 
       $('<span />').addClass('filesize').text('(' + filesize + 'kb)').appendTo($('#output li:last')); 
      } 
    }); 

JS Fiddle demo.

Các thức mã khối được cập nhật, do sự thay đổi trong Webkit, Chrome 24 (mặc dù có thể từ trước đó), bởi nextgentech trong ý kiến, bên dưới:

$('input:file[multiple]').change(
    function(e){ 
     console.log(e.currentTarget.files); 
     var numFiles = e.currentTarget.files.length; 
      for (i=0;i<numFiles;i++){ 
       fileSize = parseInt(e.currentTarget.files[i].size, 10)/1024; 
       filesize = Math.round(fileSize); 
       $('<li />').text(e.currentTarget.files[i].name).appendTo($('#output')); 
       $('<span />').addClass('filesize').text('(' + filesize + 'kb)').appendTo($('#output li:last')); 
      } 
    }); 

JS Fiddle demo.

+0

Cảm ơn David, Tôi đã sử dụng điều này nhưng vẫn không quản lý để sản xuất tất cả các tệp, lạ. Tôi đã thực sự chỉ cần đọc một bài viết trên HTML5 (http://www.html5rocks.com/en/tutorials/file/dndfiles/) mà nếu áp dụng, sẽ tốt hơn cho tôi. Không nghi ngờ gì, mã của bạn thực sự đã giúp tôi với một vấn đề khác mà tôi đã gặp phải ở nơi khác, vì vậy cảm ơn ... – TheCarver

+0

Thật sao? Nó hoạt động nhất quán trong Chromium, mặc dù không đảm bảo về hành vi của các trình duyệt khác. Dù sao, tôi vui vì đã được (một số) giúp đỡ, nếu tôi có cơ hội tôi sẽ cố gắng và nhìn sâu hơn vào điều này. –

+0

Cảm ơn David, đã đánh giá cao – TheCarver

0

Đặt điểm ngắt trên cuộc gọi cảnh báo và xem nội dung của tệp biếnInInfo, xem có thuộc tính nào khác chứa tất cả tên tệp hay không.

+0

Âm thanh tốt, nhưng tôi không có ý tưởng những gì có nghĩa là, xin lỗi :) – TheCarver

0

đang tuyệt vời nhưng đối tượng cần phải được trống cho mỗi thay đổi:

$('input:file[multiple]').change(
function(e){ 
    $('#output').empty(); 
    console.log(e.currentTarget.files); 
    var numFiles = e.currentTarget.files.length; 
     for (i=0;i<numFiles;i++){ 
      fileSize = parseInt(e.currentTarget.files[i].fileSize, 10)/1024; 
      filesize = Math.round(fileSize); 
      $('<li />').text(e.currentTarget.files[i].fileName).appendTo($('#output')); 
      $('<span />').addClass('filesize').text('(' + filesize + 'kb)').appendTo($('#output li:last')); 
     } 
}); 

Cảm ơn bạn David ...

+0

cách xóa tệp đã chọn? –

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