![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 23.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Staram się w swoim projekcie zastosować przesyłanie plików na serwer bez przeładowywania strony. Chciałem do tego wykorzystać bibliotekę advAJAX. Kod na którym eksperymentuje, wygląda następująco: formularz.html:
plik.php:
Wywołanie window.onload = przeslij; sprawia, że obsługę formularza przejmuje advAJAX. Gdy wywołanie to jest aktywne, to jako odpowiedź otrzymuję: "array(0) { }", czyli php nie stwierdziło żadnych plików do przesłania. Gdy wywołanie window.onload = przeslij; usuwam, formularz obsługiwany jest standardowo i po otwarciu nowej strony mam: array(1) { ["username"]=> array(5) { ["name"]=> string(15) "Clipboard01.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(74) "C:\Documents and Settings\Edric\Ustawienia lokalne\Temp\php218.tmp" ["error"]=> int(0) ["size"]=> int(250548) } czyli formularz działa prawidłowo. Wygląda na to, że advAJAX nie potrafi obsługiwać przesyłania plików.. albo ja robie coś źle. I tu pytanie - co zrobić żeby to zadziałało? Dodam jeszcze, że jeśli zmienię typ input na 'text', i sprawdzę zmienną $_POST po przesłaniu za pomocą advAJAX to wszystko działa dobrze. Może zna ktoś jakiś inny obiekt AJAX, który pomógłby mi to zrealizować? Próbowałem problem rozwiązać w inny sposób, ale na drodze stanęła mi Opera i jej obsługa inputów dla plików (pytanie na ten temat również znajduje się na forum. Bardzo proszę o pomoc, bo naprawdę nie wiem jak ten problem rozwiązać. Niestety nie wiem, jak to wygląda z advAJAX, ale znalazłem coś co prawdopodobnie rozwiązuje ten problem: http://en.dklab.ru/lib/JsHttpRequest/" title="Zobacz w manualu PHP" target="_manual Ten post edytował Edric 10.06.2008, 14:58:53 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 10.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Ajax czy też JS jako taki nie. Ale jak widać w moim przykładowym kodzie, AJAX potrafi wywoływać asynchroniczie kod PHP, który wysyłaniem plików spokojnie może się zająć (do tego ma przecież zmienną $_FILES). No i istnieje coś takiego jak <input type='file'/> co pozwala na pobranie nazwy pliku z dysku lokalnego za pomocą przeglądarki. Problem tkwił w tym, że biblioteka, z której korzystałem (advAJAX) akurat z przesyłaniem plików sobie nie radzi. Niemniej znalazłem bibliotekę która to umożliwia - http://en.dklab.ru/lib/JsHttpRequest . Jak znajdę chwilę czasu to wrzucę tu kod pozwalający z jej pomocą na kopiowanie plików na serwer bez przeładowywania strony i bez ukrytych ramek. Niestety nie rozumiem... Kod który piszę, ma pozwalać na przesłanie pliku z dysku lokalnego na serwer, bez przeładowania strony. Przeglądanie własnego dysku, to chyba nie problem - umożliwia to input z type='file'. Widzisz i tu właśnie się mylisz gdybyś przeczytał specyfikację i zaglądnął do kodu z pliku, który podajesz niżej czyli: JsHttpRequest.js, to zobaczyłbyś że tak naprawdę ta biblioteka działa na zasadzie automatycznego wyboru rozwiązania uploadu dla przesyłanych danych. W przpadku plików tworzone jest rozwiązanie w oparciu właśnie o iframe: "Automatic choice of the best AJAX realization (XMLHttpRequest, <script>, <IFRAME>)." Tak jak pisali wszyscy powyżej niestety nie ma możliwości załadować pliku za pomocą JavaScript, naprawdę długo szukałem takiego rozwiązania. Wracając do JSHttpRequest i IFRAME poniżej fragmenty z pliku JSHttpRequest.js: " * This library tries to use XMLHttpRequest (if available), and on * failure - use dynamically created <script> elements. Backend code * is the same for both cases. Library also supports file uploading; * in this case it uses FORM+IFRAME-based loading." . . . " // Create invisible IFRAME with temporary form (form is used on empty queryElem). var div = document.createElement('DIV'); var ifname = 'jshr_i_' + id; " Z tego co udało mi się ustalić (a i pewnie i to nie jest do końca takie pewne) to są 4 sposoby przesyłania plików bez przeładowania strony: 1. swfupload - czyli upload realizowany z poziomu flasha (podobno nie działa w 10 wersji flash - ale tego nie sprawdzałem), 2. form+ifrme - w sumie kilka sposobów realizacji ale idea generalnie taka sama - form ładowany do iframe, 3. jQuery - tu nie jestem pewien bo to teoretycznie biblioteka JavaScript więc niby też powinien być iframe ale w to się nie zagłębiałem., 4. Przeładowanie całej strony po uploadzie (pokaz miniatury wykonuje skrypt php w oparciu o zmienne sesji lub zmienne JavaScript, który generuje pierwotny form do wprowadzania danych). Jeżeli są jakieś inne rozwiązania bardzo chętnie je poznam i na ich temat porozmawiam (IMG:style_emoticons/default/smile.gif) w razie czego proszę na priv. Pozdrawiam |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 15:56 |