Sprawdzenie wielkości tmp pliku PRZED zuploadwaniem


(Armon) #1

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

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?

Pozdrawiam,

Armon


(Kacper B Zuk) #2

Hmm a jak będziesz chciał ten progress bar wyświetlać? Dopóki plik nie będzie wysłany to skrypt nawet nie zostanie uruchomiony, więc AJAX jest chyba jedynym wyjściem...


(Armon) #3

Napisałem, że będę używał AJAX'a.

Jeżeli będziesz mieć ścieżkę tymczasową do pliku to ustawiasz setInterval, aby pobierał co pół sekundy wielkość pliku i przy pomocy AJAXA go zwracał jako responseText; trochę tam jeszcze po drodze zabezpieczeń, innych drobiazgów, ale to nie powinno być trudne.

Jedynie trudną rzeczą jest, JAK DOSTAĆ ścieżkę do tymczasowego pliku ZANIM zostanie przeniesiony do docelowego folderu.


(Kacper B Zuk) #4

"ala progress bar w AJAXIE"

Wybacz, źle zrozumiałem to zdanie...


(Sitemaster) #5

najprościej pobierz sobie jakiś prosty uploader plików oparty na ajaxie i sprawdź jak tam jest to rozwiązane :wink:

btw google+check file size before uploading


(Armon) #6

taaaaa, tyle że tam stosują wszędzie frameworki, a chce napisać to samemu, sprawdzałem pod tym hasłem w google, nie ma tam dalej tego co szukam.

Nie potrafię tego zrozumieć, jakim cudem PHP WIE gdzie tworzy tmp_file, a dopiero po dokończeniu uploadowania potrafi mi o tym powiedzieć. Tzn. gdzieś w nagłówkach musi być informacja gdzie ma być zapisany tmp_file, ale w jakim?


(Xwars) #7

Źle na to patrzysz. Problem jest taki, że interpreter php nie wykonuje skryptu póki nie otrzyma całego pliku wysłanego formularzem a to zdecydowanie za późno na potrzeby progres bara. Jeśli gdziekolwiek jest napisane "progress bar w ajaxie" to autor ma na myśli "progress bar w ajaxie z niewidocznym elementem flash który zajmuje się uploadem pliku".


(Armon) #8

Masz rację, ale 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?


(Sitemaster) #9

ale jak, skąd serwer wie gdzie? Zapisuje tam gdzie wszystkie pliki tymczasowe, czyli w katalogu tmp lub temp

http://php.net/manual/en/function.tempnam.php

Poza tym jest

$_FILES["file"]["tmp\_name"] i $_FILES["file"]["size"]

  • ale o tym chyba wiesz i wiesz jakie z tym wiążą się ograniczenia.

no i jest jeszcze coś takiego jak $_SERVER['CONTENT_LENGTH'] - poszukaj w kontekście uploadu, może coś się rozjaśni.

Zapytasz skąd js wie gdzie (pod jaką nazwą) uploadowany plik jest zapisywany - otóż nie wie!

Jeśli wykorzystujesz upload za pomocą flasha, czy javy to nie musi tego nawet wiedzieć, bo jest znany rozmiar pliku i w locie można kontrolować ilość wysłanych danych.

Jeśli byś się opierał wyłącznie na php/js, to jest gorzej, tutaj są minimum 2 rozwiązania

  1. przekazywać sobie miedzy php i js info w postaci dodatkowego tymczasowego pliku

  2. monitorowanie katalogu tymczasowego


(Armon) #10

Jeżeli masz sam katalog, to fajnie, mógłbym dostać się do tego, a co jeśli 2 osoby na raz coś uploadują, wtedy masz problem, bo nie wiesz, czy wybrałeś prawidłowy plik? Potrzebna jest ścieżka bezwzględna.

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

wiem, że js nic nie wie, ale skoro php wie, to js może się dowiedzieć, w końcu od tego mam ajax'a ?

poczytam jeszcze o tym $_SERVER['CONTENT_LENGTH'] - dzięki

szkoda, że nie mogę przechwycić pliku i sam napisać skrypt uploadowani'a