2009-04-07 43 views
8

Tôi đã tự hỏi liệu có phương pháp nào để triển khai lời nhắc tải xuống tệp của trình duyệt bằng JavaScript hay không.Lời nhắc tải xuống tệp trình duyệt bằng JavaScript

Lý do của tôi - người dùng tốt sẽ tải tệp lên máy chủ tệp cục bộ không thể truy cập được từ máy chủ web. Nói cách khác, cả hai sẽ trên các miền khác nhau!

Ví dụ: giả sử các trang web được lưu trữ trên www.xyz.com nhưng các tệp sẽ nằm trên máy chủ tệp cục bộ có địa chỉ như \\10.10.10.01\Files\file.txt. Làm thế nào tôi tải lên/chuyển tập tin vào máy chủ tập tin địa phương ... bằng cách sử dụng ActiveX và VBScript! (đừng hỏi :-)

Vì vậy, tôi lưu trữ đường dẫn tệp cục bộ trong cơ sở dữ liệu của mình và ràng buộc dữ liệu đó vào lưới. Khi người dùng nhấp vào liên kết đó, tệp sẽ mở trong cửa sổ (sử dụng JavaScript).

Sự cố là một số loại tệp nhất định như văn bản, jpg, pdf, v.v. mở trong cửa sổ trình duyệt. Làm cách nào để tôi có thể triển khai content-type hoặc content-disposition bằng cách sử dụng tập lệnh phía máy khách? Điều đó thậm chí có thể?

EDIT: máy chủ tệp cục bộ có thư mục dùng chung của cửa sổ lưu tệp.

+0

Máy chủ tệp cục bộ của bạn là loại máy chủ nào? Máy chủ HTTP/FTP/bất cứ máy chủ nào thực sự hoặc bạn đang nói về các thư mục chia sẻ của Windows (nghĩa là '\\ 10.10.10.01' thay vì' // 10.10.10.01'? – Christoph

+0

Thư mục được chia sẻ trong các cửa sổ & đường dẫn thực tế đến tập tin sẽ là '\\ 10.10.10.01 \ Files \ file.txt' – aix

+0

@aix: sau đó bạn không may mắn - không có cách nào để gửi thông tin meta thích hợp qua tiêu đề HTTP – Christoph

Trả lời

5

"content-disposition: attachment" là cách duy nhất để ép buộc điều này, và điều này PHẢI được đặt trong tiêu đề phản hồi.

+0

Làm cách nào tôi có thể đặt nó ở phía máy khách Hiện tại tôi đang sử dụng javascript để mở tệp. Gọi window.open ('\\ 10.10.10.01 \ Files \ file.t xt ') để mở tệp. Thao tác này sẽ mở tệp trong cửa sổ. Không phải là "nội dung-bố trí: tệp đính kèm" cài đặt tiêu đề phản hồi phía máy chủ? – aix

+0

Khi câu hỏi cho biết "điều này phải được đặt trong tiêu đề phản hồi", bạn không thể đặt nó trên máy khách. – Quentin

1

Bạn có thể thử sử dụng siêu liên kết đơn giản với type="application/octet-stream". Dường như làm việc trong FF, nhưng IE và Opera bỏ qua thuộc tính.

+0

Theo spec, IE và Opera là đúng. Thuộc tính type nói "Mong đợi điều này từ máy chủ" để khách hàng không hiểu một loại nội dung cụ thể có thể tránh làm phiền để cố tải xuống nó (hữu ích nhất với bot).Content-Type thực sự vượt trội hơn nó. – Quentin

+0

Theo ý kiến ​​của tôi, IE và Opera sai: khi không có bất kỳ thông tin kiểu nội dung nào khác (trường hợp ở đây), 'gợi ý tư vấn' (HTML spec) được cung cấp bởi trình duyệt phải được trình duyệt tôn trọng; lưu ý, tệp không được gửi qua HTTP, vì vậy không có trường Loại Nội dung nào có thể vượt trội hơn thuộc tính – Christoph

4

Nếu tập tin được lưu trữ trên một máy chủ web như trong ví dụ của bạn, bạn có thể làm:

window.location.replace(fileUrl); 

.. và trình duyệt sẽ tìm ra những gì để làm với các tập tin. Điều này làm việc tốt cho hầu hết các tệp, chẳng hạn như .xls, .csv, v.v. nhưng hãy nhớ rằng đây không phải là bằng chứng đầy đủ vì cài đặt trình xử lý MIME của người dùng sẽ xác định việc cần làm với tệp ... tức là nếu nó là một tập tin .txt nó rất có thể sẽ chỉ được hiển thị trong trình duyệt và sẽ không được cung cấp một hộp thoại "tải xuống tệp".

+0

Lưu ý rằng điều này có nghĩa là bạn có thể đặt tệp này vào thanh địa chỉ: 'data: text/csv, a, b, c% 0ad, e, f' (điều này tạo ra một tệp CSV tải xuống với 3 cột và 2 hàng). Không chắc chắn điều này là phù hợp với câu hỏi ban đầu, nhưng googling làm thế nào để tạo ra dấu nhắc đó, tôi đã kết thúc ở đây. Có lẽ nó sẽ giúp người đọc trong tương lai :) – Luc

3

Kể từ tháng 8 năm 2015, việc thêm thuộc tính "tải xuống" vào thẻ của bạn sẽ bật hành vi bạn đang tìm kiếm, ít nhất là trong Chrome.

+1

Đáng tiếc không hỗ trợ cross-origin trên Firefox và không hoạt động trên Safari, Edge và IE, thực tế đó làm cho thuộc tính download vô dụng đối với tôi: / – Sojtin

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