Zastanawiałem się, jak sprawić, by łącze do pliku PDF można było pobrać zamiast otwierać je w przeglądarce? Jak to się robi w html? (Zakładam, że jest to zrobione przez javascript lub coś w tym rodzaju).
javascript
html
404Error
źródło
źródło
Odpowiedzi:
Nie możesz tego zrobić za pomocą HTML. To rozwiązanie serwerowe. Musisz przesyłać strumieniowo plik, aby przeglądarka wyzwoliła okno dialogowe zapisu.
Radziłbym tego nie robić. Sposób interakcji użytkownika z plikiem PDF należy pozostawić użytkownikowi.
AKTUALIZACJA (2014):
Więc ... ta odpowiedź wciąż spotyka się z wieloma negatywnymi opiniami. Zakładam, że po części odpowiedź na to pytanie udzielono 4 lata temu i jak wskazuje Sarim, istnieje teraz atrybut HTML 5,
download
który może to obsłużyć.Zgadzam się i uważam, że odpowiedź Sarima jest dobra (prawdopodobnie powinna to być odpowiedź wybrana, jeśli OP kiedykolwiek powróci). Jednak ta odpowiedź jest nadal niezawodnym sposobem na poradzenie sobie z tym (jak wskazuje odpowiedź Yiğita Yenera i - co dziwne - ludzie się z nią zgadzają). Chociaż atrybut pobierania zyskał poparcie, nadal jest nierówny:
http://caniuse.com/#feat=download
źródło
http
znacznik do pytania. Zamiast akapitu 2: „Możesz ponownie rozważyć, czy zapobieganie natychmiastowemu przeglądaniu plików PDF leży w najlepszym interesie wszystkich użytkowników. Powiedziawszy to ...” Następnie załóż, że OP i przyszli czytelnicy są dorośli i przejdź do odpowiedzi, na przykład Yenera .Dzięki html5 jest to teraz możliwe. Ustaw atrybut „download” w elemencie.
Źródło: http://updates.html5rocks.com/2011/08/Downloading-resources-in-HTML5-a-download
źródło
if ("download" in document.createElement("a")){ ... }
Jest to możliwe tylko po ustawieniu nagłówka odpowiedzi http za pomocą kodu po stronie serwera. Mianowicie;
źródło
Musisz zmienić wysłane nagłówki http. W zależności od serwera możesz zmodyfikować swój .htaccess w następujący sposób:
źródło
będziesz musiał użyć skryptu PHP (lub innego języka do tego celu po stronie serwera)
i użyj httacces do przekierowania (przepisania) do pliku PHP zamiast do pliku PDF
źródło
http://www.example.com/_PDFs/___download_the_catalogue_instead_opening.php
i próbuję otworzyć plik pdf, nadal otwiera oryginał w przeglądarce, zamiast tego pobiera wersję o zmienionej nazwie ...Możesz użyć
Sprawdź ten przykład:
http://www.codeproject.com/KB/aspnet/textfile.aspx
Dotyczy to ASP.NET. Jestem pewien, że możesz znaleźć podobne rozwiązania we wszystkich innych językach po stronie serwera. Jednak o ile wiem, nie ma rozwiązania javascript.
źródło
Bez atrybutu html5 można to osiągnąć za pomocą php:
Utwórz plik php o nazwie download.php z tym kodem:
Teraz, jeśli chcesz automatycznie rozpocząć pobieranie pliku PDF, napisz ten javascript:
Jeśli chcesz, aby to działało na łączu, użyj tego ...
źródło
$file = $_GET['$file'];
. Ponieważ można by było wtedy również zadzwonićdownload.php?file=../../../wp-config.php
lub jakikolwiek inny dany zasób. Dodatkowe sprawdzanie rozszerzeń, typów MIME i dozwolonych ścieżek pobierania z (oraz usuwanie rzeczy takich jak "../") jest bardzo ważne!<a href='download.php'> ?
Jeśli chcesz bezpośrednio pobrać dowolny obraz lub plik pdf z przeglądarki zamiast otwierać go w nowej karcie, to w javascript należy ustawić wartość na pobranie atrybutu tworzenia dynamicznego łącza
W przypadku nowej aktualizacji Chrome czasami zdarzenie nie działa. do tego zostanie użyty następujący kod
Dołączanie elementu podrzędnego i usuwanie elementu podrzędnego jest przydatne tylko w przypadku Firefoksa, przeglądarki Internet Explorer. Na Chrome będzie działać bez dołączania i usuwania dziecka
źródło
Najlepszym rozwiązaniem dla mnie było to, które napisał Nick na swoim blogu
Podstawową ideą jego rozwiązania jest użycie modów nagłówkowych serwerów Apache i edycja pliku .htaccess, tak aby zawierała dyrektywę FileMatch, która wymusza działanie wszystkich plików * .pdf jako strumienia zamiast załącznika. Chociaż w rzeczywistości nie wymaga to edycji HTML (jak w oryginalnym pytaniu), nie wymaga żadnego programowania jako takiego.
Pierwszym powodem, dla którego wolałem podejście Nicka, jest to, że pozwoliło mi to ustawić je dla poszczególnych folderów, aby pliki PDF w jednym folderze mogły być nadal otwierane w przeglądarce, podczas gdy inne (te, które chcielibyśmy, aby użytkownicy mogli edytować, a następnie ponownie przesłać) być zmuszane jako pliki do pobrania.
Chciałbym również dodać, że w przypadku plików PDF istnieje opcja wysyłania / wysyłania formularzy do wypełnienia za pośrednictwem interfejsu API na serwery, ale implementacja zajmuje trochę czasu.
Drugim powodem było to, że liczy się czas. Napisanie procedury obsługi plików PHP w celu wymuszenia dyspozycji zawartości w nagłówku () również zajmie mniej czasu niż API, ale nadal będzie dłuższe niż podejście Nicka.
Jeśli wiesz, jak włączyć mod Apache i edytować pliki .htaccss, możesz to uzyskać w około 10 minut. Wymaga hostingu Linux (nie Windows). To może nie być odpowiednie podejście do wszystkich zastosowań, ponieważ wymaga dostępu do serwera wysokiego poziomu do konfiguracji. W związku z tym, jeśli powiedziałeś o dostępie, prawdopodobnie dlatego, że wiesz już, jak zrobić te dwie rzeczy. Jeśli nie, sprawdź blog Nicka, aby uzyskać więcej instrukcji.
źródło
Ponieważ sposób html5 (moja poprzednia odpowiedź) nie jest dostępny we wszystkich przeglądarkach, oto inny nieco hackowy sposób.
To rozwiązanie wymaga udostępniania zamierzonego pliku z tej samej domeny LUB posiadania uprawnienia CORS.
application/octet-stream
. Wynik powinien wyglądaćdata:application/octet-stream;base64,SGVsbG8sIFdvcmxkIQ%3D%3D
Teraz gotowe
location.href = data
. Spowoduje to pobranie pliku przez przeglądarkę. Niestety nie możesz w ten sposób ustawić nazwy pliku ani rozszerzenia. Majstrowanie przy mediach może coś przynieść.Zobacz szczegóły: https://developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs
źródło
Musiałem to zrobić dla plików utworzonych z dynamicznymi nazwami w określonym folderze i obsługiwanych przez IIS.
To zadziałało dla mnie:
Dodaj nowy nagłówek z następującymi informacjami:
Name: content-disposition Value: attachment
(z: http://forums.iis.net/t/1175103.aspx?add+CustomHeaders+only+for+certain+file+types+ )
źródło
Jeśli używasz HTML5 (i myślę, że teraz wszyscy go używają), istnieje atrybut o nazwie
download
.dawny.
<a href="somepathto.pdf" download="filename">
tutaj
filename
jest opcjonalne, ale jeśli zostanie podane, przyjmie tę nazwę dla pobranego pliku.źródło
<a href="download/Curriculum_it.pdf.zip">Download curriculum</a>
lub tamto:<a href="download/Curriculum_it.pdf.zip" download="Curriculum_it">Download curriculum</a>
i nie widzę absolutnie żadnej różnicy w tym, jak to działa. Oba pobierają plik .zip. A w drugim użycie opcji filename wydaje się nic nie robić.Zachowanie powinno zależeć od tego, jak przeglądarka jest skonfigurowana do obsługi różnych typów MIME. W tym przypadku typ MIME to application / pdf. Jeśli chcesz zmusić przeglądarkę do pobrania pliku, możesz spróbować wymusić inny typ MIME na plikach PDF. Odradzam to, ponieważ użytkownik powinien wybrać, co się stanie, gdy otworzą plik PDF.
źródło
Możesz użyć download.js ( https://github.com/rndme/download i http://danml.com/download.html ). Jeśli plik znajduje się w zewnętrznym adresie URL, musisz wysłać żądanie Ajax, ale jeśli tak nie jest, możesz użyć funkcji:
Przeczytaj ich dokumentację, aby uzyskać więcej informacji w GitHub.
źródło
Wreszcie znalazłem ...... utwórz dynamiczny tag kotwicy i kliknij go
„Payment.pdf” dotyczy tylko nazwy niestandardowej.
źródło