2011-10-11 17 views
9

Szukam sposobu (łatwo, według preferencji;)) utworzyć łącze pobierania do pliku na oddzielnym serwerze plików.Tworzenie linku pobierania do pliku na serwerze plików

Sytuacja wygląda następująco: aplikacja, którą tworzę (asp.net 2.0 w vb.net, ale mam podobny problem w języku C#, oba rozwiązania działają dla mnie) będą działać wewnętrznie dla firmy. Zgodnie z dobrą praktyką przechowywanie plików i aplikacja internetowa znajdują się na dwóch oddzielnych serwerach.

I w zasadzie muszą być w stanie stworzyć link do pobrania w pliku, jedyną dostępną URL mam dostępu do pliku jest \ nazwa_serwera \ folder1 \ folder2 \ folder3 \ plik.txt (może być każdy rodzaj plik)

Weblinks po prostu nie działają. Oto, jak to jest obecnie skonfigurowane:

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, aby napisać ten plik do samej ścieżki aplikacji i działał idealnie, ale to nie jest dobra praktyka i dlatego zmieniam to (lub próbuję).

Czytam rozwiązania dotyczące tworzenia strony pobierania, a następnie posiadanie tabeli w bazie danych, która przechowuje linki i zwraca prawidłowy adres URL do pobrania, ale ograniczenie czasowe, z którym mam do czynienia niestety nie pozwala mi to rozwinąć.

Zakładając, że mogę podać ciąg z pełną ścieżką do pliku podobnego do powyższego, jaki jest najprostszy sposób, aby utworzyć łącze, które po kliknięciu powoduje pobranie dokumentu?

Uwaga: w tym środowisku mam 0 uprawnień administratora. To naprawdę mi nie pomaga. Załóżmy, że otrzymałem poprawny link jak powyżej i mam odpowiednie prawa dostępu do plików i takie.

UPDATE:

Powyższy przykład działa w IE, ale nie w Firefox i Chrome. IE konwertuje go na plik: // nazwa_serwera/... link, który robi to, co powinien, ale FF i Chrome zarówno aktywnie zdecydowali, że jest to niebezpieczne, jak i wyłączyli je ze swoich przeglądarek.

Odpowiedz

16

Można użyć pliku ashx (powiedzmy, downloadfile.ashx) i użyć następującego kodu (nie testowane, ale to będzie coś w tym stylu), w tym:

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 wykorzystać te informacje w swojej kotwicy tag jak:

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

Uwaga: można 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.

+0

Ok Mam obsługi działa, ale utrzymuje gving mi błędy w Response.WriteFile. Wprowadzam ciąg znaków "\\ serwer \ folder \ plik.txt" i otrzymuję: Nie udało się zmapować ścieżki "/server/folder/file.txt" Próbowałem każdego możliwego pliku. Jakieś doświadczenie w tej kwestii? – Flater

+0

Możesz przekazać parametr jak file = abc.txt dla pierwszego linku, file = otherfile.txt itp., O czym już wspomniałem. Otrzymasz dynamicznie nazwy plików i przekazujesz je do pliku ASHX. Potrzebujesz pliku ASHX, aby użytkownik mógł go pobrać stamtąd (twoja domena) zamiast używać ścieżki serwera, która nie istnieje po stronie klienta (jeśli nie jest w sieci LAN) – wasimbhalli

+0

Ok ignoruj ​​mój poprzedni wpis Mogę po prostu upuścić serwer .Mappath, a potem działa :) wciąż trochę niewyraźnie na sfinalizowanie tego, ale pomógł mi strasznie dużo! Dzięki! – Flater

0

\\servername\folder1\folder2\folder3\... to ścieżka UNC, której nie można użyć z poziomu przeglądarki. Ponieważ pliki znajdują się na oddzielnym serwerze, potrzebny jest atrybut href w postaci http://server-name/folder1/folder2/file.txt.

Jeśli nazwa serwera jest nierozwiązywalne przez klientów, to trzeba najpierw uzyskać adres IP serwera, a następnie sformułować href formularza: http://10.1.1.30/folder1/folder2/file.txt

Oto, w jaki sposób uzyskać adres IP z server-name:

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

EDIT:

I w zasadzie muszą być w stanie stworzyć link do pobrania w pliku

Dzięki rozwiązaniu ashx aplikacja będzie odczytywać plik z serwera i przekazywać go do klientów, a nie tylko udostępniać klientom łącze do pobrania pliku bezpośrednio z serwera plików.

3

ten fragment kodu utworzy plik w folderze pobierania o nazwie = hi.txt i treści 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(); 
0

Jeśli plik już istnieje na serwerze, a następnie można użyć tego kodu w Pobieranie przycisk kliknij zdarzenie tak

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

Chociaż jest prawidłowa, ta odpowiedź jest dokładnie taka sama jak ta, którą podałem jako rozwiązanie * prawie dwa lata temu *. – Flater

Powiązane problemy