2013-07-02 45 views
13

Về cơ bản, tôi muốn tìm hiểu xem tôi có nên tải xuống tệp bằng AJAX hay không, tùy thuộc vào kích thước của tệp.Ajax - Nhận kích thước tệp trước khi tải xuống

Tôi đoán câu hỏi này cũng có thể được lặp lại như sau: Làm cách nào để chỉ nhận tiêu đề của yêu cầu ajax?


EDIT: ultima-rat0 trong các ý kiến ​​nói với tôi hai câu hỏi mà đã được hỏi rằng dường như đều giống nhau như thế này. Chúng rất giống nhau, nhưng cả hai đều muốn jQuery. Tôi muốn một giải pháp không phải jQuery cho điều này.

+2

có thể trùng lặp? http://stackoverflow.com/questions/1484303/get-size-of-file-requested-via-ajax và http://stackoverflow.com/questions/1440723/find-size-of-file-behind-download- link-with-jquery –

+0

@ ultima_rat0 Cảm ơn, vì lý do nào đó, chúng không xuất hiện trên danh sách các bản sao của stackexchange ... không biết tại sao. Điều đó _only_ tải xuống tiêu đề? – MiJyn

+1

bạn có thể lấy dữ liệu XHR-respone theo cách thủ công: http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method – hungdoan

Trả lời

21

Bạn có thể lấy dữ liệu XHR tiêu đề phản ứng bằng tay:

http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method

Chức năng này sẽ nhận được filesize của URL được yêu cầu:

function get_filesize(url, callback) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("HEAD", url, true); // Notice "HEAD" instead of "GET", 
           // to get only the header 
    xhr.onreadystatechange = function() { 
     if (this.readyState == this.DONE) { 
      callback(parseInt(xhr.getResponseHeader("Content-Length"))); 
     } 
    }; 
    xhr.send(); 
} 

get_filesize("http://example.com/foo.exe", function(size) { 
    alert("The size of foo.exe is: " + size + " bytes."); 
}); 
+0

Và nếu tôi sử dụng một biến thay vì cảnh báo? Tại sao họ trở lại 'không xác định'? Làm thế nào tôi có thể lưu trữ 'xhr.getResponseHeader (" Content-Length ")' trong một biến? –

+0

@FabioCalvosa 'xhr.open (" HEAD ", url, true);' // 'false' làm cho yêu cầu không đồng bộ Vì vậy, khi bạn gọi hàm đó như sau: var myVar; get_filesize ('https://sample.com'); cảnh báo (myVar); // biến của bạn là 'undefined' Nhưng nếu bạn thay đổi mã của mình như sau: var myVar; get_filesize ('https://sample.com', chức năng() { cảnh báo (myVar); // biến của bạn sẽ không 'không xác định' là nguyên nhân bạn gọi phương thức 'call back' }); – hungdoan

+0

điều này sẽ không bao giờ hoạt động nếu trình duyệt và máy chủ thực hiện mã hóa gzip ... tiêu đề nội dung độ dài bị cấm. Điều tồi tệ hơn là W3C/xhr cấm cài đặt Accept-Encoding do đó loại bỏ bất kỳ hy vọng nào về giải pháp phía khách hàng ... rất chán nản – user3338098

0

Đôi khi TRỤ có thể hoạt động khác so với GET vì vậy tôi đề nghị một cái gì đó như thế này hủy bỏ yêu cầu sau khi nhận được tiêu đề Content-Length:

new Promise(resolve => { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('GET', '/a.bin', true); 
    xhr.onreadystatechange =() => { 
     resolve(+xhr.getResponseHeader("Content-Length")); 
     xhr.abort(); 
    }; 
    xhr.send(); 
}).then(console.log); 
Các vấn đề liên quan