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.
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.
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();
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();
}
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.
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