Advajax

w dziale Po godzinach
daroc napisał(a):

Czy ktoś pomoże mi rozgryźć pobrany z sieci skrypt Advajax?
Tu jest instrukcja http://advajax.anakin.us
Mam plik advajax.js zapisany na dysku, fragment z pliku (php) wygląda tak (przykład skopiowany ze strony, powinien więc chyba działać):

<script src="advajax.js"></script>
<script type="text/javascript">
advAJAX.get({
    url: "http://o2.pl",
    timeout : 3000,
    onTimeout : function() { alert("Connection timed out."); },
    retry: 2,
    retryDelay: 2000,
    onRetry : function() { alert("Retry connection..."); },
    onRetryDelay : function() { alert("Awaiting retry..."); },
    onSuccess : function(obj) { alert(obj.responseText); },
    onError : function(obj) { alert("Error: " + obj.status); }
});
</script>

Za każdym razem, nawet próbując róznych serwerów, otrzymuję komunikat timed out. Pamiętam, że kiedyś już w tego typu skrypt próbowałem zajrzeć i chyba jakoś to działało (również po wielu godzinach męki). A teraz próbując odtworzyć to co miałem kiedyś, nie mogę w ogóle tego uruchomić.

Oo... właśnie mi się udało. Działa gdy pobieram plik ze swojego serwera (relatywna ścieżka). Ale nie mogę znaleźć żadnych informacji jakoby skrypt działał tylko lokalnie ani też metody na to. Ktoś wie coś na ten temat?

Edit: Próbuję właśnie wysyłać za pomocą tego skryptu pliki na serwer (upload bez przeładowywania strony), jednakże żadne pliki się nie wysyłają (tablice $_FILES są puste). Przypuszczam, że może to być spowodowane tym, że skrypt nie bierze pod uwagę enctype="multipart/form-data" i dlatego pliki się nie wysyłają poprawnie. Ale nie wiem jak to naprawić.

Edit2: Znalazłem linijkę
obj.xmlHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

Po zmianie na multipart/form-data otrzymuję w PHP komunikat:
Warning: Missing boundary in multipart/form-data POST data in Unknown on line 0
I dalej żaden plik się nie wysyła.

Sombria napisał(a):

Originally posted by daroc:

Działa gdy pobieram plik ze swojego serwera (relatywna ścieżka). Ale nie mogę znaleźć żadnych informacji jakoby skrypt działał tylko lokalnie ani też metody na to. Ktoś wie coś na ten temat?


XMLHttpRequest w Operze nie działa dla różnych domen ze względów bezpieczeństwa. Da się to obejść w skryptach użytkownika lub jeśli obie domeny są "twoje" (ramka + postMessage)

Originally posted by daroc:

Próbuję właśnie wysyłać za pomocą tego skryptu pliki na serwer (upload bez przeładowywania strony), jednakże żadne pliki się nie wysyłają (tablice $_FILES są puste).


Chyba się nie da, bo co by to było, gdyby JavaScript miał dostęp do lokalnych plików? Takie cuda robi się przy użyciu ukrytej ramki a Ajax tylko do wyświetlenia postępu.

daroc napisał(a):

Myślałem, że zabezpieczeniem jest już to, że nie da się za pomocą JS zmienić wartości pola input typu file. Ale skoro tak jest bezpieczniej. smile A z tą ramką i wyświetlaniem postępu - jak to mniej więcej mogłoby wyglądać? Chodzi o stworzenie osobnych formularzy dla każdego pliku i kontroli wysyłania kolejnych plików?

Dzięki za zainteresowanie.

Sombria napisał(a):

Originally posted by daroc:

Myślałem, że zabezpieczeniem jest już to, że nie da się za pomocą JS zmienić wartości pola input typu file.


Jest zabezpieczeniem w przypadku wysyłania formularzy przez samą przeglądarkę.

Originally posted by daroc:

A z tą ramką i wyświetlaniem postępu - jak to mniej więcej mogłoby wyglądać?


W teorii tak, że tworzysz dwa skrypty: jeden do uploadu pliku w ramce, drugi do sprawdzania ile zostało pobrane. Ten drugi plik pobierasz Ajaksem w pewnych odstępach czasu i wyświetlasz pasek postępu. A w praktyce... ja nigdy tego nie robiłam bigsmile Nie wiem nawet czy to jest wykonalne w php. Widziałam gdzieś przykłady z użyciem skryptów cgi.

Za to bardzo proste jest zrobienie tego bez sprawdzania postępu i bez Ajaksa (zamiast tego można dać jakieś kręcące się kółko):
W pliku index.php wstawiasz formularz
<form action="upload.php" target="ukryta_ramka" onsubmit="pokaż_że_zaczęło_się_pobierać" (...)>
<input type="file" (...) />
(...)
</form>
<iframe name="ukryta_ramka" .........

A w pliku upload.html odbierasz pliki i wstawiasz kod JavaScript, który wyłączy to kółko w nadrzędnej ramce i poinformuje czy operacja się powiodła.

Originally posted by daroc:

Chodzi o stworzenie osobnych formularzy dla każdego pliku i kontroli wysyłania kolejnych plików?


Chodzi o wysłanie kilku plików jednocześnie? Myślę, że można je przesłać w jednym formularzu.

daroc napisał(a):

No tylko właśnie zastanawiałem się jak zrobić ten pasek postępu. wink I pomyślałem, że masz na myśli postęp wysyłania kolejnych plików (tak jakby wyświetlanie - który aktualnie się wysyła).
Ze zrobieniem uploadu w ramce raczej problemów bym nie miał. Zastanawiam się tylko, jak można by sprawdzić, ile KB już wysłano jakiegoś jednego pliku. Bo ani JavaScript ani PHP nie ma chyba możliwości sprawdzenia nawet nazwy tymczasowego pliku, który został stworzony podczas wysyłania.

Sombria napisał(a):

Idea pomysłu polega na tym, że plik jest zapisywany w określonym miejscu i pod określoną nazwą (opartą np. o identyfikator sesji). Wtedy inny skrypt (ten od postępu) łatwo może go zlokalizować i obliczyć ile zostało już pobrane.
Niestety PHP czeka aż cały plik zostanie pobrany, a to ciut za późno...

Pozostaje inny język: http://labs.beffa.org/w2box/ http://www.webdice.org/uber_uploader/
albo rozszerzenie dla PHP - UploadProgressMeter

daroc napisał(a):

Widzę, że wszystkie chyba opierają się na CGI. Tak czy inaczej będzie to działać tylko na określonych serwerach - nie wszystkie oferujące PHP dają też możliwość uruchamiania skryptów CGI. Mimo wszystko dzięki, przyjrzę się tym skryptom.