[php] przesyłanie plików

0

Mam formularz z dynamicznie generowanymi w javascripcie polami file o nazwach "file1", "file2", "file3" itd. Przed wysłaniem formularza srypt generuje jeszcze niewidzialny input o nazwie "file" przekazujący ilość wygenerowanych inputów.
Oto kod odpowiedzialny za zapis plików na serwerze:

$bledy = null;
for($i=0; $i<$_POST["file"]; $i++) {
	if($_POST["file".($i+1)]!="") {
		if (is_uploaded_file($_FILES["file".($i+1)]["tmp_name"])) {
			global $limit;
			$limit_przekroczony = null;
			if ($this->pliki+$_FILES["file".($i+1)]["size"]<$limit)
 			move_uploaded_file($_FILES["file".($i+1)]["tmp_name"],
			$this->katalog."/pliki/".$_FILES["file".($i+1)]["name"]);
			else $bledy[] = "limit_dyskowy";
		}
		else $bledy[] = "blad_przeslania";
	}
}

kod obsługi błędów:

if($bledy) foreach($bledy as $i) {
	if($i=="limit_dyskowy") $komunikat = "Nie masz wystarczającej ilości miejsca na dysku!\n";
	else $komunikat = "Błąd podczas przesłania pliku!\n";
}
if(!isset($komunikat)) $komunikat = "Twoje dane zostały zaktualizowane.";
else $komunikat = nl2br(rtrim($komunikat));
return $komunikat;

i za każdym razem wyskakuje "Błąd podczas przesłania pliku!", dlaczego?

0

w pierwszej linijce chyba powinno być
$i<count($_POST["file"])

0

nie...
Johny, weź rzuć na to okiem jak możesz ;]

0

Ze ja?

Hmm, sprawdz co masz w $_POST i $_FILES i jakie to ma wartosci, tak dla pewnosci, bo tak na pierwszy rzut oka to wyglada ok.

foreach($_POST as $key => $value)
  echo "$key=>$value<br>";

I jeszcze jedno, w tablicy bledy masz tyle samo elementow co uploadowanych plikow?

pozdrawiam
johny

0

dzięki Johny'emu okazało się, że nie ma w ogóle tablicy $_FILES i doszedłem do mojego głupiego błędu - miałem w atrybucie enctype tagu form napisane "multipart-form/data" zamiast "multipart/form-data", poprawiłem i sprawdziłem jeszcze raz, wypisało coś takiego $_FILES:file1=>Array$_POST:file=>1nie wyskakuje już żaden błąd, ale nadal nie działa - przesłany plik nie zapisuje się w katalogu, katalogi tworzę w ten sposób:

mkdir($this->katalog, 0742);
mkdir($this->katalog."pliki/", 0742);

@Johny: elementów w tablicy $bledy jest tyle co błędów

0

Poczulem sie jak wywolany do tablicy :) gdziez te piekne czasy ;-)

Rozumiem, ze katalogi sie tworza?
Zobacz co zwraca move_uploaded_file, powinno byc true - jesli nie, to sprawdz czy parametry jakie podajesz sa w porzadku. Bo skoro nie ma juz bledu, to rozumiem, ze tego ifa z limitem przelazi?

pozdrawiam
johny

0

jak pryszłeś na forum żeby spytać tylko johny'ego to nie mogłeś mu na priv napisać ?

co masz w $this->katalog ?
move_uploaded_file działa czasami tylko kiedy mu się poda w parametrach ścieżki bezwzględne

nie łatwiej napisać
for($i=1; $i<=$_POST['file']; $i++) {

wtedy nie musiałbyś wszędzie dodawać jedynki do $i

obejrzyj dokładnie tablicę $_FILES

print_r($_FILES);

i jak wyżej - sprawdź co zwraca move_uploaded_file

fajnie że grupa ma uprawnienie odczytu a wszyscy inni zapisu

0

@Johny: tak, katalogi się tworzą, ifa z limitem przełazi i zrobiłem ifa na move_uploaded_file, którego też przełazi
@Adamo: a co? zazdrosny jesteś? :-D Johny był jako jedyny na forum więc zwróciłem się do niego...
w tablicy $_FILES jest:Array ( [file1] => Array ( [name] => ciapson.gif [type] => image/gif [tmp_name] => /tmp/phpkOY96j [error] => 0 [size] => 16211 )więc chyba wszystko dobrze...

Adamo napisał(a)

fajnie że grupa ma uprawnienie odczytu a wszyscy inni zapisu
a nie 7 - właściciel, 4 - grupa, 2 - wszyscy?

0

no zazdrosny jestem
tak, 7 (odczyt + zapis + wykonanie) - właściciel, 4 (odczyt) - grupa, 2 (zapis) - wszyscy, zgadza się

nie odpowiedziałeś co zwraca move_uploaded_file

a te foldery to się w ogóle tworzą ? zdaje się że mkdir działa tylko kiedy dostnie nazwę folderu bez slasha na końcu a w obu nazwach masz slasha na końcu, a jeśli nie masz to w takim razie drugi folder się nie utworzy bo zamiast /costam/pliki się utworzy /costampliki

0
ciapek888 napisał(a)

a nie 7 - właściciel, 4 - grupa, 2 - wszyscy?

Owszem, ale 2 to wlasnie prawo zapisu. Sprobuj ustawic prawa na 774 i zobacz czy wtedy sie pliki wrzuca. Prawdopodobnie to dlatego, ze grupa nie ma zapisu - jak pisal Adamo.

PS. @Adamo: mi tam nie przeszkadza, moje ego zostalo mile polechtane ;)

pozdrawiam
johny

0
Adamo napisał(a)

nie odpowiedziałeś co zwraca move_uploaded_file

ciapek888 napisał(a)

i zrobiłem ifa na move_uploaded_file, którego też przełazi

@Johny: zrobiłem katalogi na 774 i nadal to samo :-[

0

To sprawdz jeszcze czy sciezka, ktora podajesz jako docelowa jest prawidlowa. Co jest w $this->katalog?

0

Czasami serwery wymagają 777 aby mozna bylo utworzyc/przeniesc plik do takiego katalogu. Czyli full open.

0

@Johny: scieżka jest dobra
@maniek_2: inne pliki mi się zapisują w katalogu z uprawnieniami 764

już sam niewiem co mam napisać :/
wywalam cały kod (oprócz tego co na pewno działa)

class CV {
    var $wszyscy;
    var $user;
    var $katalog;
    var $folio;
    var $przestrzen_dyskowa = 0;
    function CV() {
        $this->wszyscy = explode("\n", file_get_contents("data/users.dat"));
    }
    function nowy_uzytkownik() {
        $this->user = strtoupper(substr($_POST["imie"], 0, 1)).strtolower(substr($_POST["imie"], 1))." ".strtoupper(substr($_POST["nazwisko"], 0, 1)).strtolower(substr($_POST["nazwisko"], 1));
        foreach($this->wszyscy as $i) if($this->user==$i) return "Użytkownik ".$this->user." już istnieje!";
        dopisz("data/users.dat", $this->user);
        $this->rejestracja = date("d-m-Y - H:i:s");
        $this->katalog = $_SERVER['DOCUMENT_ROOT']."/cv/users/".strtolower($_POST["imie"]."_".$_POST["nazwisko"])."/";
        mkdir($this->katalog, 0764);
        mkdir($this->katalog."pliki/", 0764);
        return $this->popraw_dane();
    }
    function popraw_dane() {
        $bledy = null;
        // "folio.txt"
        $this->folio = null;
        for($i=1; $i=<$_POST["url"]; $i++) if($_POST["url".$i]!="") $this->folio["url"][$i-1] = $_POST["url".$i]."+-*-+".$_POST["url".$i."o"];
        for($i=1; $i=<$_POST["file"]; $i++) {
            if($_POST["file".$i]!="") {
                if (is_uploaded_file($_FILES["file".$i]["tmp_name"])) {
                    global $limit;
                    $limit_przekroczony = null;
                    if ($this->pliki+$_FILES["file".$i]["size"]<$limit) {
                        $dozwolony = true;
                        global $niedozwolone;
                        $info = pathinfo($_FILES["file".$i]["tmp_name"]);
                        foreach($niedozwolone as $wartosc) if($info["extension"]==$wartosc) {
                            $bledy[] = $info["extension"];
                            $dozwolony = false;
                            break;
                        }
                        if($dozwolony) {
                            if(move_uploaded_file($_FILES["file".$i]["tmp_name"],
                            $this->katalog."pliki/".$_FILES["file".$i]["name"]))
                            $this->folio["file"][$i-1] = $_FILES["file".$i]["name"]."+-*-+".$_POST["file".$i."o"];
			    else $bledy[] = "blad_zapisu";
                        }
                    }
                    else $bledy[] = "limit_dyskowy";
                }
                else $bledy[] = "blad_przeslania";
            }
        }
        if($this->folio) {
        zapisz($this->katalog."folio.txt", ($this->folio["url"]&&$this->folio["file"])? implode("\n^-_-^\n", $this->folio["url"])."\n^-_-^\n".implode("\n^-_-^\n", $this->folio["file"]): ($this->folio["url"])? implode("\n^-_-^\n", $this->folio["url"]): implode("\n^-_-^\n", $this->folio["file"]));
        foreach($this->folio as $i => $wartosc) foreach($this->folio[$i] as $j => $wartosc) $this->folio[$i][$j] = explode("+-*-+", $wartosc);
        }
        elseif(file_exists($this->katalog."folio.txt")) unlink($this->katalog."folio.txt");
        // komunikat zwrotny
        $komunikat = "";
        if($bledy) foreach($bledy as $wartosc) {
            if($wartosc=="limit_dyskowy") $komunikat .= "Nie masz wystarczającej ilości miejsca na dysku!\n";
            elseif($wartosc=="blad_przeslania") $komunikat .= "Błąd podczas przesłania pliku!\n";
            elseif($wartosc=="blad_zapisu") $komunikat .= "Błąd podczas zapisu pliku!\n";
            else $komunikat .= "Pliki o rozszeżeniu ".$wartosc." są niedozwolone z powodów bezpieczeństwa!\n";
        }
        if($komunikat=="") $komunikat = "Twoje dane zostały zaktualizowane...";
        else $komunikat = nl2br(rtrim($komunikat));
        return $komunikat;
    }
}

metodę popraw_dane "piszę" już parę dni
pomocy ;-(

0

no dobra, uploadują się inne przy 764 ale zależy też kto jest właścicielem i jest różnica czy folder założył ftp czy php, poza tym zawsze powinno się minimalizować ilość czynników przez które coś może nie działać i dopiero jak działać będzie to przywrócić wszystko do normy - nic cię nie kosztuje sprawdzenie chmoda 777 a oszczędziłbyś dyskusji

0
Adamo napisał(a)

no dobra, uploadują się inne przy 764
nie uploadują tylko zpisują i sprawdziłem 777 tez niedziała...
Co dziwniejsze to pozostałe 6 plików tesktowych się zapisują normalnie a folio.txt cos nie chce no i uploadowany plik tez sie nie kopiuje :/

0

A co to jest 6 plikow tekstowych i folio.txt? Sprobuj za pomoca php stworzyc w tym katalogu jakis plik - czy to tez sie nie uda? A pozniej skopiowac jakis inny, ale za pomoca zwyklego move.

0

nie ma funkjci move ()chyba chodzilo ci o rename() - przenosi się normalnie...
napisałem, że wywalam cały kod oprócz tego co na pewno działa, metoda popraw dane zapisuje wczesniej dane do 6 plików tekstowych w utworzonym katalogu, więc tego kodu nienapisałem, a "folio.txt" już nie zapisuje tak jakby nie przechodziło przez if($this->folio),
no i nie ma w katalogu uploadowanego pliku, a błędu nie zgłasza :/

0

No to skoro przez rename dziala, to moze zrob przez to? Skoro i tak wczesniej sprawdzasz, czy plik jest poprawnie uploadowany, to drugi raz juz tego sprawdzenia nie musisz miec.

PS. Nie chodzilo mi konkretnie o move, a funkcje przenoszaca, tylko skleroza dopadla :P

pozdrawiam
johny

0

brak rozwiązania mojego problemu zmusił mnie do napisania kodu zapisującego plik jeszcze raz(swoją drogą powinienem Od razu tak zrobić) i napisałem wszystko dokładnie tak samo, a jedyny błąd z poprzedniej wersji, na który się natknąłem to wywolanie funkcji pathinfo powinno być:

$info = pathinfo($_FILES[$plik]["name"];

i chociaż niebardzo ma to do zapisywania pliku, to teraz wszystko działa [rotfl]
wielkie dzięki wszystkim za pomoc
[browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1