Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Wymuszenie downloadu pliku ze strony klienta

Witam,

Czy jest możliwe tylko po stronie klienta wymuszenie ściągnięcia pliku z zadanego url?
Mam web service generujący pliki i zwracający url do nich. Chciałbym teraz umożliwić ich ściągnięcie po kliknięciu przycisku.

konto usunięte

Temat: Wymuszenie downloadu pliku ze strony klienta

Czy chodzi o cos takiego:


function download(file) {
window.location = file;
}


Przy wywolaniu pod file podkladasz url do pliku:


download('http://mojserver.pl/pliki/plik.txt');


Oczywiscie jezeli masz WS to pozostaje kwestia jak uzyskac URL do pliku. Jezeli nie jest to ASP.NET to pozostaje wykonanie Ajax request do WS, parsowanie odpowiedzi XML albo odczytanie jako obiekt (zaleznie od tego co uzyjesz do ajax'a). Jezeli jest ASP.NET >=2.0 i masz dostep do zrodla to mozesz zmosic go zeby "gadal" w JSON'ie i wtedy cala sprawa sie upraszcza... a potem to tylko wywolujesz download(...)...
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Wymuszenie downloadu pliku ze strony klienta

Zapomniałem dodać, że nie chcę opuszczać strony, a czasami zassać obrazki. Window wyświetli mi jpgi i png, a tego nie chcę.

Z jakiegoś powodu całość mi się wywraca w operze jak zrobię tak jak mówisz - elementy w update panel przestają wywoływać postback. Dochodzi do tego 'problem' z obrazkami

Generalnie, to zastanawiam się jak użyteczny może być webservis generujacy pliki, skoro dość trudno je potem zassać. Javascript zdaje sobie nie radzić z czymś takim.

Wiem, że mogę wymusić content disposition po stronie serwera ale z kolei response.writefile() nie akcepuje absolutnego urla i oczekuje ścieżki wirtualnej. Więc serwis generujący pliki jest trudny do skonsumowania.Dominik Mikiewicz edytował(a) ten post dnia 20.03.09 o godzinie 13:24

konto usunięte

Temat: Wymuszenie downloadu pliku ze strony klienta

Zawsze mozesz wywolac caly download w iframe z visibility=hidden, wtedy nie ruszasz strony w zaden sposob.
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Wymuszenie downloadu pliku ze strony klienta

Ale iFrame wyświetli mi obrazki. Działa świetnie z zipami, to prawda. jpgi i png się niestety nie ściągną w ten sposób. Chyba że jest coś, co mi umknęło.

A uzywałem czegoś takiego:

var ifrm;

function downloadFile(url) {

if (!(ifrm == null)) {
document.body.removeChild(ifrm);
}

ifrm = document.createElement("IFRAME");
ifrm.setAttribute("src", url);

ifrm.style.width = 0 + "px";
ifrm.style.height = 0 + "px";

document.body.appendChild(ifrm);
}

konto usunięte

Temat: Wymuszenie downloadu pliku ze strony klienta

Pewnie nieprawidłowe nagłówni dostajesz.

Nie wiem co to za webservice, ale w PHP wygląda to mniej więcej tak:


@ob_end_clean();
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Expires: " . gmdate("D, d M Y H:i:s", mktime(date("H")+1, date("i"), date("s"), date("m"), date("d"), date("Y"))) . " GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Accept-Ranges: bytes");
header("Content-Length: " . $size);
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Type: application/octetstream");
@readfile(PATHTOFILE.$filename);


I wtedy zawsze otwiera okno pobierania pliku a nie wyświetla go.
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Wymuszenie downloadu pliku ze strony klienta

Wiem jak to zrobić po stronie serwera, z tym nie ma problemu. Wystarczy ustawić content type i wymusić download.

Patent polega na tym, że nie jestem w stanie zmusić w rozsądny sposób przeglądarki do pobrania pliku, którego url znam. O ile nie problemu z pobraniem pliku, którego mime przeglądarka nie kuma, to pobranie obrazków mi nie wychodzi.

Chcę wymusić download tylko i wyłącznie po stronie przeglądarki, bez server side. Sytuacja hipotetyczna wyglada tak:

1. mam url: var url = 'http://example.com/images/image.png'
2. co dalej?

konto usunięte

Temat: Wymuszenie downloadu pliku ze strony klienta

Ja bym zrobil ukryty iframe, i ustawil mu src na url pliku.
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Wymuszenie downloadu pliku ze strony klienta

opera nie chciała takiego łyknąć, więc ostatecznie zostawiłem z rozmiarem.
Generalnie pomysł z iFrame fajny, tylko ograniczony niestety do plików niejadalnych dla przeglądarki...

konto usunięte

Temat: Wymuszenie downloadu pliku ze strony klienta

Ok, mia culpa. Źle zrozumiałem temat.

To może inaczej. Masz url, to ładujesz jego zawartość ajaxem do zmiennej.
a potem już z górki:

mydoc = window.open();
mydoc.document.write(str);
mydoc.focus();
mydoc.document.execCommand("saveAs");
mydoc.close();


Nie testowałem, ale wydaje mi się to całkiem logicznym rozwiązaniem.

konto usunięte

Temat: Wymuszenie downloadu pliku ze strony klienta

a może coś w ten deseń?
http://www.jibbering.com/2002/4/httprequest.html
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Wymuszenie downloadu pliku ze strony klienta

Coś mam problemy z 'doajaxowaniem' się do pliku w innej domenie, ale z tego co czytałem jest to normalne. X-domain request = security threat...
A że sugerowane rozwiazania (dzięki wielkie btw) nie zdją egzaminu w przypadku grafik, chyba nie obędzie się bez serverside w tym przypadku...

Dzięki raz jeszcze

konto usunięte

Temat: Wymuszenie downloadu pliku ze strony klienta

jQuery posiada metody do wywołań cross-domain, niestety one operuja na danych JSON, a to raczej Cie nie urządza, bo masz sam plik, bez opakowania :/
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Wymuszenie downloadu pliku ze strony klienta

Wygooglałem,że script injection jest doskonałe do konsumpcji serwisów x-domain. Zresztą yahoo podaje to jako oficjalny trick na swoich stronach. Jeżeli jeszcze serwis zwraca dane w json i jest zaufany to nie ma problemu :-) Testowałem na szybko i jest oki.
Nie mogę tylko kurczę rozkminić jak zassać plik... Niby takie proste, a okazuje się że nie do końca

konto usunięte

Temat: Wymuszenie downloadu pliku ze strony klienta

Zauważyłem w tym wątku pare pomysłów, które wydają mi się mitami.

1. Nie da się wymusić pobierania binarnych plików za pomocą JavaScript (hack z execCommand jest interesujący, ale to jest tylko dla HTMLowego designMode i może wymusić konwersję do HTML!)

window.location nie robi nic specjalnego - wg specyfikacji HTML5 działanie ma takie samo, jak kliknięcie na link. Użycie takiej konstrukcji raczej tylko przeszkodzi użytkownikom bez JS.

2. Nie mogę już patrzeć na bezkrytycznie kopiowany "PHPowy" zestaw nagłówków do wymuszania pobierania. Większość z tych nagłówków jest kompletną bzdurą i niektóre nawet przeczą sobie nawzajem.

Wg RFC 2616 jest tylko jeden sposób na wymuszenie pobierania i na dodatek jest on zupełnie opcjonalny.


Content-Disposition:attachment


Nie potrzeba dokładać nazwy pliku, nie potrzeba miliona innych rzeczy. Nagłówek musi być wysłany razem z plikiem (nie w żadnym meta tagu). Najlepiej to zrobić za pomocą serwera (np. mod_headers Apache), bo PHP jest strasznie marny do wysyłania plików (psuje wznawianie, nawet minimalny skrypt zużywa wielokrotnie więcej RAM).

konto usunięte

Temat: Wymuszenie downloadu pliku ze strony klienta

Kornel L.:
Zauważyłem w tym wątku pare pomysłów, które wydają mi się mitami.

1. Nie da się wymusić pobierania binarnych plików za pomocą JavaScript (hack z execCommand jest interesujący, ale to jest tylko dla HTMLowego designMode i może wymusić konwersję do HTML!)
HTMLowego? Hmmm, to rozumie, że przetestowane jest?
Bo u mnie IE zapisał wszystkie pliki, które tesotwałem. Od JPEG przez bitmapy, pngi, mp3, avi itd itp. Nie zadziała oczywiście w przypadku, dla których serwer ma przypisane własne handlery.
Sporym minusem jest to, że działa tylko pod IE.

2. Nie mogę już patrzeć na bezkrytycznie kopiowany "PHPowy" zestaw nagłówków do wymuszania pobierania. Większość z tych nagłówków jest kompletną bzdurą i niektóre nawet przeczą sobie nawzajem.
Po pierwsze nie kopiowane tylko napisane metodą prób i błędów.
A niby które sobie przeczą?

Wg RFC 2616 jest tylko jeden sposób na wymuszenie pobierania i na dodatek jest on zupełnie opcjonalny.


Content-Disposition:attachment


Nie potrzeba dokładać nazwy pliku, nie potrzeba miliona innych rzeczy. Nagłówek musi być wysłany razem z plikiem (nie w żadnym meta tagu). Najlepiej to zrobić za pomocą serwera (np. mod_headers Apache),
Racja, szczególnie że plik nie jest na naszym serwerze i nie mamy wpływu na wysyłane nagłówki...
Przeczytaj dokładnie jaki jest problem.
Gdyby to nie był webservice tylko pliki trzymane na "naszym" serwerze to pytanie nigdy by się nie pojawiło, bo wymuszanie sciąganie plików z własnego serwer to nie problem.

bo PHP jest strasznie marny do wysyłania
plików (psuje wznawianie, nawet minimalny skrypt zużywa wielokrotnie więcej RAM).
Akurat wznawiane sciąganie plików w PHP jest trywialne i nie wymaga podstawowej wiedzy z PHP.
To, że Ty nie potrafisz tego zorbić nie znaczy że jest to trudne czy niemożliwe :)



Wyślij zaproszenie do