2012-12-27 74 views
5

Về jQuery File Upload, có sự kiện progress trả về đối tượng data, như tôi hiểu, báo cáo tiến trình cho mỗi tệp.Làm cách nào để xác định tiến trình của tệp?

Tôi đang thêm tệp và thanh tiến trình vào giao diện người dùng của mình qua sự kiện add() và sau này tôi muốn cập nhật các thanh tiến trình tương ứng của họ bên trong sự kiện progress(). Vấn đề tôi đang gặp là làm thế nào để tôi kết hợp chúng?

Tôi cần phải cung cấp cho mỗi tệp một ID duy nhất để tôi có thể ghép nối chúng, nhưng không được cung cấp ở xa như tôi có thể thấy. Làm thế nào chúng ta phải làm điều này?

Có lẽ một số mã băm JavaScript cho từng đối tượng Tệp không?

Một số mã:

$('#fileupload').fileupload({ 
    url: 'api/combox_upload.php', 
    dataType: 'json', 
    dropZone: $dropZone, 
    done: function (e, data) { 
     $.each(data.result, function(index, file) { 
      // indicate completeness 
     }); 
    }, 
    add: function(e, data) { 
     $.each(data.files, function(index, file) { 
      console.log(file); 
      $file_uploads.append($('<li>').text(file.name)); 
     }); 
     data.submit(); // start upload immediately 
    }, 
    progress: function(e, data) { 
     console.log(data); 
    } 
}); 

tôi nghĩ Tôi có thể đính kèm một ID duy nhất cho mỗi tập tin bằng cách sử dụng $.data như vậy:

var fileId = 0; 

$('#fileupload').fileupload({ 
    url: 'api/combox_upload.php', 
    dataType: 'json', 
    dropZone: $dropZone, 
    done: function (e, data) { 
     $.each(data.result, function(index, file) { 
      // indicate completeness 
     }); 
    }, 
    add: function(e, data) { 
     $.each(data.files, function(index, file) { 
      //console.log(file); 
      console.log(filename, fileId); 
      $.data(file, 'id', fileId++); 
      $file_uploads.append($('<li>').text(file.name)); 
     }); 
     data.submit(); // start upload immediately 
    }, 
    progress: function(e, data) { 
     var progress = parseInt(data.loaded/data.total * 100, 10); 
     $.each(data.files, function(index, file) { 
      console.log($.data(file,'id'), file.name, progress); 
     }); 
     //console.log(data); 
    } 
}); 

Phần mà tôi đang bối rối bây giờ là trong sự kiện tiến trình, nó không chỉ cung cấp cho bạn một tệp duy nhất, nó cung cấp cho bạn một mảng giữ 1 tệp ... Tôi không chắc chắn nếu nó được đảm bảo luôn có chính xác 1 tệp trong đó (data.files) hay không.

Trả lời

3

Bạn không đăng mã đang thực sự gọi tệp tải lên hoặc ràng buộc với sự kiện tiến độ, nhưng tôi đoán là bạn chỉ cần đặt một wrapper $.proxy xung quanh chức năng fileuploadprogress.

Chức năng $.proxy cho phép bạn chỉ định nội dung this sẽ tham chiếu trong hàm. Sau đó, bên trong chức năng của bạn, bạn sẽ có quyền truy cập vào datathis sẽ có thể cung cấp ngữ cảnh.

+0

Nhưng tôi không ràng buộc 'sự kiện progress' bằng tay cho mỗi tập tin ... đó là tất cả thực hiện tự động. Làm thế nào tôi có thể thiết lập một bối cảnh khác nhau cho mỗi tập tin? Đã đăng một số mã BTW. – mpen

+0

Xem qua tài liệu/mã nguồn cho tiện ích 'fileupload', nó có một tùy chọn gọi là' singleFileUploads' được đặt mặc định là 'true'. Nó có khả năng làm nhiều hơn một tệp, nhưng miễn là bạn không thay đổi giá trị đó thành 'false', bạn sẽ được đảm bảo rằng sẽ chỉ có 1 mục trong mảng' tệp' của bạn. –

+0

Oh .. Tôi đã không nhận thấy đó là 'true' theo mặc định ... nhưng tôi không chắc chắn làm thế nào điều này giải quyết vấn đề ở tất cả? Bạn chỉ khởi tạo '$ .fileupload()' một lần và cho nó một sự kiện tiến bộ bất kể. Với '$ .proxy', bạn phải liên kết từng tệp với một hàm gọi lại khác. – mpen

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