Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sprawdzenie wielkości pliku PRZED uploadem
Forum PHP.pl > Forum > PHP
armon
Witam,

Próbuję napisać coś ala progress bar w AJAXIE oraz PHP, lecz nie mogę się nigdzie doszukać jak sprawdzić wielkość pliku przed zuploadowaniem go na serwer.

Zauważyłem, że do wielkości pliku mogę dostać się tylko jeśli
  1. if (isset($_FILES['file_name'])


zwróci wartość true, czyli dopiero po zuploadowaniu go, a to mi nic nie pomoże.

Chce uzyskać ścieżkę do tymczasowego pliku oraz pobierać wielkość pliku co np. pół sekundy no i reszta to już z górki, ale muszę mieć dostęp do ścieżki przed zuploadniem, a nie po...

Wie ktoś może, czy jest to możliwe? winksmiley.jpg

Pozdrawiam,

Armon
dantes
Z tego co wiem, to Ajaxem/Jsem będzie ciężko o ile to w ogóle możliwe. Prędzej, jeśli to będzie flashowy/javovy uploader, choć i tu nie korzystałem z tego.
armon
Jeżeli dostanę się do tymczasowego pliku przed zuploadowaniem to w czym problem? Brakuje mi tylko tego. Tylko nie wiem czy PHP to umożliwia, bo ten $_FILES to taki trochę ograniczony jest O.o
Blame
Cytat(armon @ 1.02.2010, 16:10:00 ) *
Jeżeli dostanę się do tymczasowego pliku przed zuploadowaniem to w czym problem? Brakuje mi tylko tego. Tylko nie wiem czy PHP to umożliwia, bo ten $_FILES to taki trochę ograniczony jest O.o

A powiesz mi gdzie wtedy będzie ten tymczasowy plik, w drodze, w locie, a może w przeglądarce? Za pomocą samego php nie da się sprawdzić wielkości uploadowanego pliku przed jego faktycznym ściągnięciem na serwer, nie ważne czy do ostatecznej lokalizacji czy do folderu tymczasowego. Pozostaje flash, np. http://www.swfupload.org/
armon
Cytat(Blame @ 1.02.2010, 16:30:50 ) *
A powiesz mi gdzie wtedy będzie ten tymczasowy plik, w drodze, w locie, a może w przeglądarce? Za pomocą samego php nie da się sprawdzić wielkości uploadowanego pliku przed jego faktycznym ściągnięciem na serwer, nie ważne czy do ostatecznej lokalizacji czy do folderu tymczasowego. Pozostaje flash, np. http://www.swfupload.org/

Nieważne gdzie będzie, ważne że jego rozmiar będzie się zmieniałquestionmark.gif Przecież napisałem, że będę korzystał także z AJAX'a.

AJAX bez problemu uzyska dostęp do wielkości pliku przed jego zuploadowaniem (oraz podczas uploadowania) i będzie mógł go aktualizować co taki czas jaki ja będę chciał, jednak jeżeli nie ma możliwości zwykłego pobrania ścieżki tymczasowego pliku przed zuploadowaniem to całkowicie odpada taka opcja O.o
ucho
Temat był poruszany _wielokrotnie_. Są całe 3 rozwiązania:
1. Uploader we Flash/Java/itd
2. APC z włączoną odpowiednią opcją - ale są podobno problemy przy wielu uploadach na raz
3. Odbierać upload innym skryptem niż php, ja to kiedyś robiłem w perlu.
JavaScript nie ma _żadnego_dostępu do pliku, który wybrałeś selektorem FILE, powinieneś się cieszyć jak możesz poznać nazwę pliku i np. sprawdzić czy rozszerzenie jest ok tongue.gif
armon
Cytat(ucho @ 1.02.2010, 20:02:52 ) *
Temat był poruszany _wielokrotnie_. Są całe 3 rozwiązania:
1. Uploader we Flash/Java/itd
2. APC z włączoną odpowiednią opcją - ale są podobno problemy przy wielu uploadach na raz
3. Odbierać upload innym skryptem niż php, ja to kiedyś robiłem w perlu.
JavaScript nie ma _żadnego_dostępu do pliku, który wybrałeś selektorem FILE, powinieneś się cieszyć jak możesz poznać nazwę pliku i np. sprawdzić czy rozszerzenie jest ok tongue.gif


No tak, ale mnie ciekawi fakt, jak pobrać ścieżkę do tmp file, przed jego zuploadowaniem, przecież to jest na moim serwerze to nie robi żadnej luki w zabezpieczeniach dla użytkownika?

Skąd serwer wie gdzie ma zapisywać temporary file, bo skądś to musi wiedzieć, czymś, gdzieś musi zostać wysłana o tym wiadomość? Gdzieś ta informacja musi być przetrzymywana, skoro jest przekazywana dalej dla skryptu PHP?
Pilsener
1. Server wie gdzie uploadować, bo jest to zapisane w php.ini
2. A pod jaką nazwą to chyba masz tablicę $_FILES?

Teraz sprawdza się przesłany plik, zanim się go zapisze. Służą do tego choćby:
http://pl2.php.net/manual/pl/ref.fileinfo.php

Masz też cały arsenał starych sposobów: np. wczytanie kilku pierwszych i ostatnich bajtów pliku by sprawdzić, co zawiera.

I nie da się sprawdzić pliku na komputerze użytkownika, stąd kwarantanna w postaci pliku tymczasowego.
armon
Cytat(Pilsener @ 2.02.2010, 11:49:45 ) *
1. Server wie gdzie uploadować, bo jest to zapisane w php.ini
2. A pod jaką nazwą to chyba masz tablicę $_FILES?

Teraz sprawdza się przesłany plik, zanim się go zapisze. Służą do tego choćby:
http://pl2.php.net/manual/pl/ref.fileinfo.php

Masz też cały arsenał starych sposobów: np. wczytanie kilku pierwszych i ostatnich bajtów pliku by sprawdzić, co zawiera.

I nie da się sprawdzić pliku na komputerze użytkownika, stąd kwarantanna w postaci pliku tymczasowego.



ale przecież napisałem tablica $_FILES zaistnieje dopiero PO wczytaniu pliku, a PO to już progress bar ma 100% ;/

Jak masz wczytać pierwszy, ostatni bajt etc. skoro nie wiem gdzie jest ten plik przed powstaniem $_FILES? Jak już $_FILES powstanie to już jest "po ptokach"
Blame
Mamooo! Widzę że tego nie rozumiesz więc postaram ci to przedstawić jak najłopatologiczniej w kilku krokach:
1. User wybiera sobie plik, naciska przycisk uploaduj.
2. W tym momencie strona się przeładowywuje, trwa to tak długo jak długo wykonują się punkty od 3 do 4.
3. Skrypt odbiera plik do katalogu temp JUŻ NA SERWERZE. W $_FILES mamy już nazwę pliku i inne dane.
4. Jeśli plik przejdzie wszystkie nasze filtry(jeśli jakieś są) np. na rozszerzenie, wielkość itp. to jest KOPIOWANY do lokalizacji docelowej czyli z katalogu "temp" jest przenoszony do załóżmy folderu "pliki".
5. Cały skrypt kończy swoje działanie i albo wyświetla jakiś komunikat typu "Plik zauploadowany" albo przekierowuje na inną stronę, jak kto woli.

Z tego względu samym php NIE da się zrobić progres bar'a, bo my nie mamy jako tako wpływu na skrypt kiedy plik jest wrzucany na serwer. Do takich rzeczy powinno się używać języków w których możemy zrobić upload w tle np. Flash bez przeładowania strony.
armon
Cytat(Blame @ 2.02.2010, 15:13:50 ) *
Mamooo! Widzę że tego nie rozumiesz więc postaram ci to przedstawić jak najłopatologiczniej w kilku krokach:
1. User wybiera sobie plik, naciska przycisk uploaduj.
2. W tym momencie strona się przeładowywuje, trwa to tak długo jak długo wykonują się punkty od 3 do 4.
3. Skrypt odbiera plik do katalogu temp JUŻ NA SERWERZE. W $_FILES mamy już nazwę pliku i inne dane.
4. Jeśli plik przejdzie wszystkie nasze filtry(jeśli jakieś są) np. na rozszerzenie, wielkość itp. to jest KOPIOWANY do lokalizacji docelowej czyli z katalogu "temp" jest przenoszony do załóżmy folderu "pliki".
5. Cały skrypt kończy swoje działanie i albo wyświetla jakiś komunikat typu "Plik zauploadowany" albo przekierowuje na inną stronę, jak kto woli.

Z tego względu samym php NIE da się zrobić progres bar'a, bo my nie mamy jako tako wpływu na skrypt kiedy plik jest wrzucany na serwer. Do takich rzeczy powinno się używać języków w których możemy zrobić upload w tle np. Flash bez przeładowania strony.


Przecież AJAX nie potrzebuje przeładowania strony i może korzystać ze zmiennych z PHP.
Wystarczy skorzystać z tego, że w p. 3, który przedstawiłeś mam w tym momencie uploadowany plik, czyli jego rozmiar się zmienia z sekundy na sekundę, więc przy pomocy AJAXa oraz metody setInterval, pobieram co np. pół sekundy nowe wartości, które oznaczają aktualny rozmiar pliku.

if ($_FILES['file_name']) zwraca true dopiero jak cały plik zostaje wczytany do końca i dopiero wtedy otrzymuje $FILES['file_name']['tmp_name'].

Chyba, że to dlatego, że żaden skrypt nie chce działać dopóty, dopóki nie wczyta się cały plik (przeładowuje się strona). Da się to zmienić?

O.o
-=Peter=-
Sprawdź http://pecl.php.net/package/uploadprogress
Z tego co kiedyś czytałem (nie pamiętam, czy to było akurat o tym rozszerzeniu, teraz się w to nie zagłębiałem) dzięki tej bibliotece można zrobić to co napisałeś, czyli np. sprawdzić w czasie uploadu ile bajtów już dotarło na serwer.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.