Làm cách nào để tạo liên kết đến tệp cục bộ trên trang web chạy cục bộ?


155

Tôi muốn có một tệp html tổ chức một số tệp nhất định nằm rải rác trong ổ cứng của tôi. Ví dụ: tôi có hai tệp mà tôi sẽ liên kết đến:

  • C:\Programs\sort.mw
  • C:\Videos\lecture.mp4

Vấn đề là tôi muốn các liên kết hoạt động như một lối tắt đến tệp. Tôi đã thử như sau:

<a href="C:\Programs\sort.mw">Link 1</a>
<a href="C:\Videos\lecture.mp4">Link 2</a>

... nhưng liên kết đầu tiên không làm gì và liên kết thứ hai mở tệp trong Chrome, không phải VLC.

Câu hỏi của tôi là:

  1. Có cách nào để điều chỉnh HTML của tôi để coi các liên kết là lối tắt đến các tệp không?

  2. Nếu không có cách nào để điều chỉnh HTML, có cách nào khác để liên kết gọn gàng với các tệp nằm rải rác trong ổ cứng không?

Máy tính của tôi chạy Windows 7 và trình duyệt web của tôi là Chrome.

Câu trả lời:


259

Bạn cần sử dụng file:///giao thức (vâng, đó là ba dấu gạch chéo) nếu bạn muốn liên kết đến các tệp cục bộ.

<a href="file:///C:\Programs\sort.mw">Link 1</a>
<a href="file:///C:\Videos\lecture.mp4">Link 2</a>

Chúng sẽ không bao giờ tự động mở tệp trong các ứng dụng cục bộ của bạn. Đó là vì lý do bảo mật mà tôi sẽ đề cập trong phần cuối. Nếu nó mở, nó sẽ chỉ mở trong trình duyệt. Nếu trình duyệt của bạn có thể hiển thị tệp, nó sẽ, nếu không nó có thể sẽ hỏi bạn nếu bạn muốn tải xuống tệp.

Các phiên bản hiện đại của nhiều trình duyệt (ví dụ Firefox và Chrome) sẽ từ chối chuyển từ giao thức http sang giao thức tệp để ngăn chặn hành vi nguy hiểm. Bạn sẽ cần mở trang web của mình cục bộ bằng giao thức tệp nếu bạn muốn thực hiện công cụ này.

Tại sao nó bị mắc kẹt mà không có file:///?

Phần đầu tiên của URL là giao thức. Một giao thức là một vài chữ cái, sau đó là dấu hai chấm và hai dấu gạch chéo. HTTP://FTP://là các giao thức hợp lệ; C:/không và tôi khá chắc chắn rằng nó thậm chí không giống với một.

C:/cũng không phải là một địa chỉ web hợp lệ. Trình duyệt có thể cho rằng nó có nghĩa là http://c/với một cổng trống được chỉ định, nhưng điều đó sẽ thất bại.

Trình duyệt của bạn có thể không cho rằng nó đề cập đến một tệp cục bộ. Nó có ít lý do để đưa ra giả định đó bởi vì các trang web công cộng thường không cố gắng liên kết đến các tệp cục bộ của mọi người.

Vì vậy, nếu bạn muốn truy cập các tệp cục bộ: hãy bảo nó sử dụng giao thức tệp.

Tại sao ba nhát chém?

Bởi vì đó là một phần của lược đồ URI tệp . Bạn có tùy chọn chỉ định máy chủ sau hai dấu gạch chéo đầu tiên. Nếu bạn bỏ qua việc chỉ định máy chủ, nó sẽ cho rằng bạn đang đề cập đến một tệp trên PC của chính bạn. Điều này có nghĩa file:///C:/etclà một phím tắt cho file://localhost/C:/etc.

Những tệp này sẽ vẫn mở trong trình duyệt của bạn và điều đó là tốt

Trình duyệt của bạn sẽ phản hồi các tệp này giống như cách họ phản hồi với cùng một tệp ở bất kỳ đâu trên internet. Các tệp này sẽ không mở trong trình xử lý tệp mặc định của bạn (ví dụ: MS Word hoặc VLC Media Player) và bạn sẽ không thể làm bất cứ điều gì như yêu cầu File Explorer mở vị trí của tệp.

Đây là một điều cực kỳ tốt cho an ninh của bạn.

Các trang web trong trình duyệt của bạn không thể tương tác tốt với hệ điều hành của bạn. Nếu một trang web tốt có thể nói máy tính của bạn để mở lecture.mp4 trong VLC.exe , một trang web độc hại có thể nói cho nó để mở virus.bat trong Cmd.exe . Hoặc nó chỉ có thể yêu cầu máy của bạn chạy một vài tệp Uninstall.exe hoặc mở File Explorer một triệu lần.

Điều này có thể không thuận tiện cho bạn, nhưng bảo mật HTML và trình duyệt không thực sự được thiết kế cho những gì bạn đang làm. Nếu bạn muốn để có thể mở lecture.mp4 trong VLC.exe xem xét việc viết một ứng dụng desktop để thay thế.


1
Cảm ơn Jonathan. Bạn có biết có cách nào để "hiển thị tệp trong thư mục" thay thế không?
Brian Fitzpatrick

7
@Brian Trình duyệt của bạn không thể tương tác với HĐH của bạn theo cách đó và bạn nên cực kỳ vui mừng vì nó không thể.
doppelgreener

23
Có vẻ như Chrome sẽ không tải xuống các tệp cục bộ bằng cách sử dụng tệp: giao thức /// (gây ra Not allowed to load local resourcelỗi cho bạn )
Loupax

1
Tôi muốn cung cấp một liên kết như thế này "tập tin: /// .. \ .. \ sort.mw" để nó quay trở lại hai thư mục và nhận được tập tin ở đó. Bởi vì chúng tôi đang sử dụng tệp từ trong dropbox. Vậy có giải pháp nào không.
Murtaza Munshi

5
Cũng có thể đề cập đến việc bạn không thể liên kết từ một trang web (ví dụ: máy chủ dev cục bộ) đến một tệp cục bộ. forum.mozillazine.org/viewtopic.php?f=9&t=1730
bến

14

Nếu bạn đang chạy IIS trên PC, bạn có thể thêm thư mục mà bạn đang cố truy cập dưới dạng Thư mục ảo. Để thực hiện việc này, bạn nhấp chuột phải vào Trang web của bạn trong ISS và nhấn "Thêm thư mục ảo". Đặt tên cho thư mục ảo. Trỏ thư mục ảo đến vị trí thư mục của bạn trên PC cục bộ. Bạn cũng phải cung cấp thông tin đăng nhập có đặc quyền để truy cập vào thư mục cụ thể, vd. HOSTNAME \ tên người dùng và mật khẩu. Sau đó, bạn có thể truy cập tệp trong thư mục ảo như bất kỳ tệp nào khác trên trang web của bạn.

http://sitename.com/virtual_folder_name/filename.fileextension

Nhân tiện, điều này cũng hoạt động với Chrome mà mặt khác không chấp nhận tệp giao thức tệp: //

Hy vọng điều này sẽ giúp được ai đó :)


Cảm ơn về câu trả lời! Tôi đã đặt tệp: /// trước một đường dẫn đến một tệp tuy nhiên khi tôi nhấp vào nó thì chẳng có gì cả. Tôi phải mở nó bằng Ctrl (trong tab mới). Tại sao nó như vậy?
Piotr Czyż

5

Janky tốt nhất

<a href="file://///server/folders/x/x/filename.ext">right click </a></td>

và sau đó nhấp chuột phải, chọn tùy chọn "sao chép vị trí" và sau đó dán vào url.


chúng ta có bị buộc phải nhấp chuột phải không? Có một cách tồn tại để chỉ nhấp chuột trái vào nó?
Bandolera

1

trở lại năm 2017:

sử dụng URL.createObjectURL (tệp) để tạo liên kết cục bộ đến hệ thống tệp mà người dùng chọn;

đừng quên giải phóng bộ nhớ bằng cách sử dụng URL.revokeObjectURL ()


Đối số tệp ở đây yêu cầu một đối tượng tệp thực tế được xây dựng bên trong thời gian chạy JS của trình duyệt, nghĩa là chúng ta phải tải nó lên máy khách trình duyệt (ví dụ như thông qua điều khiển biểu mẫu tải lên tệp). URL được tạo là một URL blob để tải xuống hoặc tham chiếu bản sao được lưu trữ trong bộ nhớ trong thời gian chạy JS của trình duyệt. Điều đó sẽ không giúp tạo ra một liên kết đến một tệp cục bộ; đó là một liên kết đến một bản sao được lưu trữ trong bộ nhớ (nếu không chúng sẽ không hoạt động khác đi một khi chúng ta cố gắng truy cập nó).
doppelgreener

Chính xác những gì tôi cần. Sử dụng Nhập tệp để chọn tệp, sau đó mở tệp trong tab bằng cách sử dụng createObjectURL.
Tony Lugg

0

Tôi có một cách và làm việc như thế này:

<'a href="FOLDER_PATH" target="_explorer.exe">Link Text<'/a>

Điều đó không giống như một giá trị mục tiêu hợp lệ, ngay cả trong Internet Explorer .
doppelgreener

IE bỏ qua mục tiêu (không hợp lệ) (ở trên). Theo dõi hoạt động tốt với IE10, 11: <a href="C:/tmp"> Liên kết với tmp trên ổ C. </a>
Primehunter

Nó hoạt động tốt với tôi, sử dụng IE và đường dẫn ổ đĩa mạng như 'file: // servername / path \ to \ folder' thay cho FOLDER_PATH. Nếu bạn bỏ qua 'target = "_ explorer.exe"' thì thư mục sẽ mở trong IE thay vì explorer.exe và nó trông khá giống trình thám hiểm.
JonP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.