Come posso creare un collegamento a un file locale su una pagina Web gestita localmente?


155

Mi piacerebbe avere un file html che organizza alcuni file sparsi sul mio disco rigido. Ad esempio, ho due file che vorrei collegare a:

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

Il problema è che vorrei che i collegamenti funzionassero come collegamento al file. Ho provato quanto segue:

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

... ma il primo link non fa nulla e il secondo link apre il file in Chrome, non in VLC.

Le mie domande sono:

  1. C'è un modo per adattare il mio HTML per trattare i collegamenti come collegamenti ai file?

  2. Se non esiste un modo per regolare l'HTML, esistono altri modi per collegarsi ordinatamente ai file sparsi sul disco rigido?

Il mio computer esegue Windows 7 e il mio browser Web è Chrome.

Risposte:


259

Devi usare il file:///protocollo (sì, sono tre barre) se vuoi collegarti a file locali.

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

Questi non apriranno mai automaticamente il file nelle applicazioni locali. Questo per motivi di sicurezza che tratterò nell'ultima sezione. Se si apre, si aprirà sempre e solo nel browser. Se il tuo browser può visualizzare il file, lo farà, altrimenti ti chiederà probabilmente se vuoi scaricare il file.

Le versioni moderne di molti browser (ad esempio Firefox e Chrome) si rifiuteranno di passare dal protocollo http al protocollo file per prevenire comportamenti dannosi. Dovrai aprire la tua pagina web localmente usando il protocollo di file se vuoi fare tutto questo.

Perché rimane bloccato senza file:///?

La prima parte di un URL è il protocollo. Un protocollo è composto da poche lettere, quindi due punti e due barre. HTTP://e FTP://sono protocolli validi; C:/non lo è e sono abbastanza sicuro che non assomigli nemmeno a uno.

C:/inoltre non è un indirizzo web valido. Il browser potrebbe presumere che si tratti http://c/di una porta vuota specificata, ma ciò fallirà.

Il tuo browser potrebbe non presumere che si riferisca a un file locale. Ha poche ragioni per fare questo presupposto perché i siti pubblici di solito non tentano di collegarsi ai file locali delle persone.

Quindi se vuoi accedere ai file locali: digli di usare il protocollo dei file.

Perché tre barre?

Perché fa parte dello schema URI File . Hai la possibilità di specificare un host dopo le prime due barre. Se salti la specifica di un host, si presupporrà che ti riferisci a un file sul tuo PC. Questo significa che file:///C:/etcè una scorciatoia per file://localhost/C:/etc.

Questi file si apriranno comunque nel tuo browser e va bene

Il tuo browser risponderà a questi file nello stesso modo in cui risponderebbero allo stesso file ovunque su Internet. Questi file non saranno aperti nel vostro gestore di file di default (ad esempio MS Word o VLC Media Player), e non sarà in grado di fare qualcosa di simile chiederai File Explorer per aprire la posizione del file.

Questa è un'ottima cosa per la tua sicurezza.

I siti nel tuo browser non possono interagire molto bene con il tuo sistema operativo. Se un buon sito potrebbe dire al tuo computer di aprire lecture.mp4 in VLC.exe , un sito dannoso potrebbe dire di aprire virus.bat in CMD.exe . Oppure potresti semplicemente dire al tuo computer di eseguire alcuni file Uninstall.exe o aprire Esplora file un milione di volte.

Questo potrebbe non essere conveniente per te, ma HTML e sicurezza del browser non sono stati progettati per quello che stai facendo. Se vuoi essere in grado di aprire lecture.mp4 in VLC.exe, considera invece di scrivere un'applicazione desktop.


1
Grazie Jonathan. Sai se esiste un modo per "mostrare il file nella cartella" in alternativa?
Brian Fitzpatrick,

7
@Brian Il tuo browser non può interagire con il tuo sistema operativo in quel modo e dovresti essere estremamente felice di non poterlo fare.
doppelgreener,

23
Sembra che Chrome non scarichi i file locali usando comunque il file: /// protocol (dandoti un Not allowed to load local resourceerrore)
Loupax

1
Voglio dare un link come questo "file: /// .. \ .. \ sort.mw" in modo che risale a due cartelle e ottenga lì il file. Perché stiamo usando il file word in dropbox. Quindi c'è qualche soluzione.
Murtaza Munshi,

5
Vale anche la pena ricordare che non è possibile collegare da un sito Web (ad esempio un server di sviluppo locale) a un file locale. forums.mozillazine.org/viewtopic.php?f=9&t=1730
nuala

14

Se si esegue IIS sul PC, è possibile aggiungere la directory che si sta tentando di raggiungere come Directory virtuale. Per fare ciò, fai clic con il pulsante destro del mouse sul tuo sito in ISS e premi "Aggiungi directory virtuale". Denominare la cartella virtuale. Puntare la cartella virtuale sulla posizione della cartella sul PC locale. È inoltre necessario fornire credenziali con privilegi per accedere alla cartella specifica, ad es. HOSTNAME \ nome utente e password. Successivamente puoi accedere al file nella cartella virtuale come qualsiasi altro file sul tuo sito.

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

A proposito, questo funziona anche con Chrome che altrimenti non accetta il file di protocollo di file: //

Spero che questo aiuti qualcuno :)


Grazie per la risposta! Ho messo file: /// prima di un percorso a un file, tuttavia quando faccio clic su di esso non succede nulla. Devo aprirlo con Ctrl (nella nuova scheda). Perché è così?
Piotr Czyż,

5

Janky nella migliore delle ipotesi

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

quindi fai clic con il pulsante destro del mouse, seleziona l'opzione "copia posizione", quindi incolla nell'URL.


siamo costretti a fare clic con il tasto destro? esiste un modo per fare semplicemente clic sinistro su di esso?
Bandoleras

1

ritorno al 2017:

utilizzare URL.createObjectURL (file) per creare un collegamento locale al file system selezionato dall'utente;

non dimenticare di liberare memoria usando URL.revokeObjectURL ()


L'argomento file qui richiede un oggetto file reale costruito all'interno del runtime JS del client browser, il che significa che dovremmo averlo già caricato sul client browser (ad esempio tramite un controllo modulo di caricamento file). L'URL generato è un URL BLOB per il download o il riferimento a quella copia archiviata nella memoria all'interno del runtime JS del client browser. Questo non aiuta nella creazione di un collegamento a un file locale; è un collegamento a una copia archiviata in memoria (che altrimenti non si comporterà diversamente una volta che proviamo ad accedervi).
doppelgreener,

Esattamente quello di cui avevo bisogno. Utilizzare File Input per selezionare un file, quindi aprirlo in una scheda utilizzando createObjectURL.
Tony Lugg,

0

Ho un modo e lavoro in questo modo:

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

Non sembra un valore target valido, nemmeno in Internet Explorer .
doppelgreener,

IE ignora il target (non valido) (sopra). Di seguito funziona perfettamente con IE10, 11: <a href="C:/tmp"> Collegamento a tmp sull'unità C. </a>
primehunter

Funziona bene per me, utilizzando IE e un percorso dell'unità di rete come 'file: // servername / path \ to \ folder' al posto di FOLDER_PATH. Se si omette 'target = "_ explorer.exe"', la cartella si apre in IE anziché explorer.exe e sembra quasi explorer.
JonP,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.