2009-04-07 25 views
7

Tôi đang tìm thêm một số suy nghĩ về cách tốt nhất để bắt đầu tải xuống tệp từ Javascript.Bắt đầu tải xuống tệp hoạt động tốt, ngay cả trong IE?

Best way to initiate a download? có rất nhiều ý tưởng tốt có thể được tóm tắt:

  • Đặt src trên một iframe
  • Sử dụng window.location.replace()
  • Sử dụng một trang với một tiêu đề meta refresh
  • Sử dụng một window.open()
  • Hãy để máy chủ tập tin trực tiếp đầu ra, thiết lập Content-type và Content-Disposition

Tất cả các cách tiếp cận này đều hoạt động tốt cho các trình duyệt mà tôi đã thử nghiệm, ngoại trừ IE8. Với IE8, tôi gặp phải một loạt sự cố:

  • Khung nội tuyến không hoạt động do cookie do môi trường tôi đang sử dụng. Tôi nghĩ rằng tôi cần phải kích hoạt tiêu đề P3P để giải quyết vấn đề này, nhưng môi trường không cho phép tôi đặt tiêu đề, vì vậy P3P nằm ngoài số
  • Window.location.replace() hoạt động ngoại trừ trong IE8, thanh địa chỉ của cửa sổ thay đổi thành URL thành tệp và cửa sổ bên dưới trống sau khi tệp được tải xuống được mở
  • Phương pháp làm mới meta cũng hoạt động, nhưng thanh địa chỉ sẽ thay đổi thành URL của tệp và cửa sổ bên dưới là trống sau khi tải xuống tệp
  • Tôi đang cố gắng hết sức để tránh window.open() đến né tránh bất kỳ khối bật lên nào ker vấn đề
  • Các môi trường máy chủ Tôi đang ở sẽ không cho phép bạn xuất ra các file chính nó, như bạn có thể làm trong tiếng nói, đối tượng Response ASP.NET của

Tôi thậm chí còn không thử các phương pháp với IE6 hoặc IE7, vì vậy có thể có những bất ngờ khác ở đó. Vì vậy, có ai có bất kỳ đề xuất nào khác để bắt đầu tải xuống trong IE không, nơi (1) không có cửa sổ bật lên và (2) tệp có thể được lưu hoặc mở và (3) không để trống cửa sổ trống, (3)) chỉ sử dụng Javascript, HTML và URL vào một tệp?

Denver Mike

+0

Bạn có thể xây dựng trên môi trường máy chủ không? –

+0

Hi Joel, Điều này đang được xây dựng để chạy trên các máy chủ Salesforce.com - họ có ngôn ngữ lập trình riêng của họ được gọi là Apex. –

Trả lời

5

Các mô hình thông thường cho một trang download file (nếu bạn phải có một; Cá nhân tôi ghét họ) là một trong hai:

<script type="text/javascript"> 
    window.onload= function() { 
     window.location= document.getElementById('downloadlink').href; 
    } 
</script> 
<p> 
    Your download will begin shortly. If it doesn't, 
    <a id="downloadlink" href="file.zip">click here</a>. 
</p> 

Hoặc tương tự với một meta-làm mới thay vì của tập lệnh. Dù bằng cách nào cũng nên hành xử khá giống nhau.

Cách tiếp cận meta refresh cũng làm việc, nhưng vẫn còn những thay đổi thanh địa chỉ URL của tập tin và cửa sổ bên dưới là trống sau khi tải tập tin

Đó không nên xảy ra. Có phiên bản trực tuyến có thể được kiểm tra không? Thông thường, khi trình duyệt được đẩy tới tệp tải xuống trực tiếp bằng bất kỳ phương thức thông thường nào (nhấp chuột vào liên kết, location.href, meta-refresh), nó sẽ giữ trang trước trên màn hình.

môi trường không cho phép tôi để thiết lập tiêu đề, vì vậy P3P là ra

Bạn không cần phải sử dụng tiêu đề để thiết lập các chính sách P3P, một liên kết HTML <> thẻ hoạt động cũng như :

<link rel="P3Pv1" href="/policy.p3p" /> 

Nhưng tại sao bạn cần? Nếu URL mục tiêu chỉ phục vụ một tệp, bạn không cần thiết lập cookie, vậy tại sao lại bận tâm với P3P?

Tôi đang tuyệt vọng cố gắng để tránh window.open() để né tránh bất kỳ vấn đề chặn popup

Nếu bạn window.open() để đáp ứng với một nhấp chuột của người dùng, không có cửa sổ bật lên vấn đề chặn.

Không phải là bạn nên mở một cửa sổ bật lên chỉ để tải xuống tệp. Tôi bắt đầu nghĩ rằng có một cái gì đó rất lạ về các điểm đến tải về tập tin bạn đang liên kết đến - như nó không phải là một tải về tập tin ở tất cả, nhưng một số loại ứng dụng web HTML lạ. Liên kết đến tải xuống không khó, bạn chỉ cần liên kết đến tệp, công việc đã hoàn tất; bạn dường như làm điều này khó hơn nhiều so với bản chất của nó.

Vấn đề duy nhất thông thường chỉ với liên kết đến tệp là nếu nó chứa văn bản, HTML, XML hoặc hình ảnh, trình duyệt sẽ hiển thị nội tuyến thay vì tải xuống. Cách duy nhất để đánh bại điều này là sử dụng tiêu đề ‘Nội dung-Bố trí: tệp đính kèm’, bằng cách phân phối tiêu đề này qua tập lệnh đặt tiêu đề này hoặc bằng cách định cấu hình máy chủ web của bạn để gửi tiêu đề đó cho tất cả các tệp tải xuống. Nếu bạn không thể thực hiện một trong hai điều đó trong môi trường máy chủ của bạn, thì không có giải pháp.

+0

Cảm ơn bạn rất nhiều vì những lời bình luận chi tiết và những lời khuyên tuyệt vời của bạn. Tôi đã quyết định chỉ đơn giản là cung cấp một liên kết để tải về các tập tin và nó hoạt động tuyệt vời trong tất cả các trình duyệt và tránh tất cả các biến chứng này. –

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