Używam axios do podstawowych żądań http, takich jak GET i POST, i działa dobrze. Teraz muszę mieć również możliwość pobierania plików Excela. Czy jest to możliwe w przypadku Axios? Jeśli tak, czy ktoś ma przykładowy kod? Jeśli nie, czego jeszcze mogę użyć w aplikacji React, aby zrobić to samo?
124
Odpowiedzi:
Gdy odpowiedź jest dostarczana z plikiem do pobrania, nagłówki odpowiedzi będą wyglądać podobnie
Możesz utworzyć osobny komponent, który będzie zawierał ukrytą ramkę iframe.
Teraz możesz przekazać adres URL pliku do pobrania jako prop do tego komponentu, więc kiedy ten komponent otrzyma prop, wyrenderuje się ponownie i plik zostanie pobrany.
Edycja: Możesz także użyć modułu js-file-download . Link do repozytorium Github
Mam nadzieję że to pomoże :)
źródło
responseURL
, być może jest to adres URL, który chcesz.Bardziej ogólne rozwiązanie
Sprawdź dziwactwa na https://gist.github.com/javilobo8/097c30a233786be52070986d8cdb1743
Pełne kredyty na: https://gist.github.com/javilobo8
źródło
responseType: 'blob'
response
po zakończeniu. NastępniecreateObjectURL
tworzy lokalny adres URL do tych danych, do którego <a> może przejść.Pobieranie plików (przy użyciu Axios i Security)
Jest to jeszcze bardziej skomplikowane, gdy chcesz pobierać pliki za pomocą Axios i niektórych środków bezpieczeństwa. Aby nikt inny nie spędzał zbyt wiele czasu na rozwiązywaniu tego, pozwól, że przeprowadzę cię przez to.
Musisz zrobić 3 rzeczy:
Te kroki są w większości wykonalne - ale są znacznie skomplikowane ze względu na relację przeglądarki do CORS. Krok po kroku:
1. Skonfiguruj serwer (HTTP)
Stosując zabezpieczenia transportu, JavaScript wykonywany w przeglądarce może [zgodnie z projektem] uzyskać dostęp tylko do 6 nagłówków HTTP faktycznie wysłanych przez serwer HTTP. Jeśli chcemy, aby serwer zasugerował nazwę pliku do pobrania, musimy poinformować przeglądarkę, że jest „OK”, aby JavaScript uzyskał dostęp do innych nagłówków, do których byłaby przesyłana sugerowana nazwa pliku.
Załóżmy - ze względu na dyskusję - że chcemy, aby serwer przesyłał sugerowaną nazwę pliku w nagłówku HTTP o nazwie X-Suggested-Filename . Serwer HTTP informuje przeglądarkę, że jest OK , aby wystawiać odebrany niestandardowy nagłówek z JavaScript / Axios z następującym nagłówkiem:
Dokładny sposób konfiguracji serwera HTTP w celu ustawienia tego nagłówka różni się w zależności od produktu.
2. Zaimplementuj usługę po stronie serwera
Twoja implementacja usługi po stronie serwera musi teraz wykonywać 2 rzeczy:
Odbywa się to na różne sposoby, w zależności od wybranego stosu technologii. Naszkicuję przykład wykorzystując standard JavaEE 7, który powinien emitować raport w Excelu:
Usługa emituje teraz dokument binarny (w tym przypadku raport programu Excel), ustawia prawidłowy typ zawartości - a także wysyła niestandardowy nagłówek HTTP zawierający sugerowaną nazwę pliku do użycia podczas zapisywania dokumentu.
3. Zaimplementuj procedurę obsługi Axios dla otrzymanego dokumentu
Jest tu kilka pułapek, więc upewnijmy się, że wszystkie szczegóły są poprawnie skonfigurowane:
Szkieletowa implementacja Axios wyglądałaby wtedy następująco:
źródło
content-disposition
nagłówka zamiastx-suggested-filename
.Rozwiązanie Axios.post z IE i innymi przeglądarkami
Znalazłem tutaj niesamowite rozwiązania. Ale często nie uwzględniają problemów z przeglądarką IE. Może zaoszczędzi to trochę czasu komuś innemu.
przykład powyżej dotyczy plików programu Excel, ale z niewielkimi zmianami można je zastosować do dowolnego formatu.
Zrobiłem to na serwerze, aby wysłać plik Excela.
źródło
źródło
źródło
Jest to bardzo prosty kod javascript, który uruchamia pobieranie dla użytkownika:
window.open("<insert URL here>")
Nie chcesz / potrzebujesz axios do tej operacji; powinno być standardem, aby pozwolić przeglądarce zrobić to.
Uwaga: jeśli potrzebujesz autoryzacji do pobrania, może to nie działać. Jestem prawie pewien, że możesz użyć plików cookie do autoryzacji takiego żądania, pod warunkiem, że znajduje się w tej samej domenie, ale niezależnie od tego może to nie zadziałać natychmiast w takim przypadku.
A jeśli chodzi o to, czy jest to możliwe ... nie dzięki wbudowanemu mechanizmowi pobierania plików, nie .
źródło
Sztuczka polega na zrobieniu niewidocznego tagu kotwicy w
render()
i dodaniu Reactaref
umożliwiającego wywołanie kliknięcia, gdy otrzymamy odpowiedź axios:Oto dokumentacja: https://reactjs.org/docs/refs-and-the-dom.html . Podobny pomysł znajdziesz tutaj: https://thewebtier.com/snippets/download-files-with-axios/ .
źródło
To zadziałało dla mnie. Wdrożyłem to rozwiązanie w ReactJS
źródło
W przypadku żądania POST axios żądanie powinno wyglądać mniej więcej tak: Kluczowe jest tutaj to, że pola
responseType
iheader
muszą znajdować się w trzecim parametrze Post. Drugi parametr to parametry aplikacji.źródło
Moja odpowiedź to totalny hack - właśnie utworzyłem link, który wygląda jak przycisk i dodałem do niego adres URL.
Używam doskonałych VueJ, stąd dziwne uwagi, jednak to rozwiązanie jest agnostykiem frameworka. Pomysł sprawdzi się w każdym projekcie opartym na HTML.
źródło