![]() |
![]() |
![]() ![]()
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 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
NIestety, ale AJAX jak i cała JavaScript nie obsługuje przesyłania plików. Jeśli zależy Ci na przesyłaniu formularza z plikiem bez przeładowania strony, musisz zastosować ukrytą ramkę (np 1px x 1px) i do niej normalnie submitować formularz.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 74 Pomógł: 5 Dołączył: 17.07.2007 Skąd: Krakow Ostrzeżenie: (0%) ![]() ![]() |
Nie działa, bo w ten sposób normalnie mógłbyś przeglądać sobie kompa użytkownika, a tego byś jako przeglądający przecież nie chciał.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 23.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
NIestety, ale AJAX jak i cała JavaScript nie obsługuje przesyłania plików. Jeśli zależy Ci na przesyłaniu formularza z plikiem bez przeładowania strony, musisz zastosować ukrytą ramkę (np 1px x 1px) i do niej normalnie submitować formularz. 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. Nie działa, bo w ten sposób normalnie mógłbyś przeglądać sobie kompa użytkownika, a tego byś jako przeglądający przecież nie chciał. 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'. Ten post edytował Edric 11.06.2008, 12:30:06 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 535 Pomógł: 27 Dołączył: 3.05.2005 Ostrzeżenie: (20%) ![]() ![]() |
Nie zrobisz tego w ten sposób po prostu - względy bezpieczeństwa. Jedyna opcja to perl itp.
P.S. Słyszałem że ustawiając specjalnie FF można to wykonać ale to jak robisz tylko dla siebie. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 23.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
Nie zrobisz tego w ten sposób po prostu - względy bezpieczeństwa. Jedyna opcja to perl itp. P.S. Słyszałem że ustawiając specjalnie FF można to wykonać ale to jak robisz tylko dla siebie. Ale czemu względy bezpieczeństwa? Przecież przesyłanie plików na serwer to normalna sprawa - po to jest input type=file, po to jest m.in. POST, po to jest zmienna $_FILES w PHP. Jedyne co ja chcę zmienić, to wysyłać te pliki bez przeładowania strony. Zresztą - działa mi to. Poniżej wrzucam kod dla pliku html oraz php. W html są tylko najważniejsze rzeczy - skrypt i formularz. <body> itp sobie darowałem;). user.html:
serw.php
Oczywiście wymagane są pliki JsHttpRequest.js oraz JsHttpRequest.php - wszystko na stronie http://en.dklab.ru/lib/JsHttpRequest/ Mi całość działa w Operze, FF i IE7. W FF nie włączałem żadnych specjalnych opcji - lecę na standardowych ustawieniach. |
|
|
![]()
Post
#7
|
|
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: 23.08.2025 - 12:39 |