Tworzenie łącza pobierania do pliku na serwerze plików

Szukam sposobu, aby (łatwo, według preferencji ;)) utworzyć link do pobrania pliku na oddzielnym serwerze plików.

Sytuacja wygląda następująco: aplikacja, którą rozwijam (asp.net 2.0 w vb.net ale mam podobny problem w c#, albo rozwiązanie działa dla mnie) będzie uruchamiane wewnętrznie dla firmy. Zgodnie z dobrą praktyką, magazyn plików i aplikacja internetowa znajdują się na dwóch oddzielnych serwerach.

W zasadzie muszę być w stanie stworzyć link do pobrania pliku, jedynym dostępnym adresem URL do pliku jest \Nazwa serwera\folder1\folder2\folder3\file.txt (może być dowolny plik)

Linki po prostu nie działają. Tak jest obecnie ustawiony:

tablerowfield.Text = String.Format(
    "<a href=""\\servername\folder1\folder2\folder3\{0}"" 
        target=""_blank"">Click me</a>",
    filename)
Co nie działa z oczywistych powodów. Kiedyś był ustawiony do zapisu tego pliku do samej ścieżki aplikacji i to działało idealnie, ale to nie jest dobra praktyka i dlatego go zmieniam (lub próbuję).

Czytam rozwiązania dotyczące tworzenia strony pobierania a potem mając tabelę w DB, która zawiera linki i zwraca właściwy adres URL do pobrania, ale ograniczenie czasowe, z którym mam do czynienia, niestety nie pozwala mi na rozwinięcie tego.

Zakładając, że mogę dostarczyć ciąg z pełną ścieżką pliku do pliku jak wyżej, jaki jest najprostszy sposób, aby utworzyć link, który po kliknięciu pobiera dokument?

Uwaga: mam 0 praw administratora w tym środowisku. To mi nie pomaga. Załóżmy, że otrzymałem poprawną link jak wyżej i mieć odpowiednie prawa dostępu do plików i takie.

UPDATE:

Powyższy przykład działa w IE, ale nie w Firefoksie i Chrome. IE konwertuje go do pliku: / / Nazwa serwera/... link, który robi to, co powinien, ale FF i Chrome zarówno aktywnie uznali, że jest to niebezpieczne i wyłączyli go ze swoich przeglądarek.

Author: John Saunders, 2011-10-11

4 answers

Możesz użyć pliku ASHX (powiedzmy, downloadfile.ashx) i użyj w nim następującego kodu (nie testowanego, ale będzie to coś takiego):

 Response.Clear();
 Response.ContentType = "application/octet-stream";
 Response.AddHeader("Content-Disposition", "attachment; filename=abc.txt");                                            
 Response.WriteFile(Server.MapPath("\\servername\folder1\folder2\folder3\abc.txt"));
 Response.End();

A następnie użyj tego w znaczniku anchor:

<a href="downloadfile.ashx"  target=""_blank"">Click me</a>

Uwaga: Możesz również przekazać parametry do pobierania różnych plików, takich jak:

<a href="downloadfile.ashx?file=abc.txt"  target=""_blank"">Click me</a>

A następnie w pliku ashx użyj nazwy pliku, aby pobrać odpowiedni plik.

 20
Author: wasimbhalli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 11:59:20

Ten fragment kodu utworzy plik w folderze pobierania z name = hi.txt i treść jako " dzięki Bogu, w końcu plik został pobrany."

 Response.Clear();
 Response.ContentType = "application/octet-stream";
 Response.AddHeader("Content-Disposition", "attachment; filename=hi.txt");
 Response.Write("thanks god, finally file got downloaded.");
 Response.End();
 2
Author: Narottam Goyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-03 08:29:49

Jeśli Twój plik jest już na serwerze, możesz użyć tego kodu w przycisku pobierania kliknij zdarzenie w ten sposób

protected void downloadpdf_Click(object sender, EventArgs e)
{
    Response.Clear();
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", "attachment; filename=""downloadName.pdf""");
    Response.WriteFile(Server.MapPath(@"~/path of pdf/actualfile.pdf"));
    Response.End();
}
 0
Author: user2766067,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-14 21:05:16

\\servername\folder1\folder2\folder3\... jest ścieżką UNC, której nie można użyć z przeglądarki. Ponieważ pliki znajdują się na oddzielnym serwerze, potrzebujesz atrybutu href formularza http://server-name/folder1/folder2/file.txt.

Jeśli nazwa serwera jest nie do rozwiązania przez klientów, musisz najpierw uzyskać adres IP serwera, a następnie sformułować href formularza: http://10.1.1.30/folder1/folder2/file.txt

Oto jak można uzyskać adres IP z nazwy serwera:

IPAddress[] host;
host = Dns.GetHostAddresses("server-name");
string ip = host[0].ToString();         

EDIT:

W zasadzie muszę być w stanie stworzyć link do pobrania do pliku

Z rozwiązaniem ashx Twoja aplikacja będzie odczytywać Plik z serwera i przekazywać go klientom, a nie tylko dostarczać klientom łącza do pobrania pliku bezpośrednio z serwera plików.

 -1
Author: Abhinav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-12 11:43:09