Wgrywanie plików

0

Witam,

Mam problem z wrzucaniem na serwer zdjęć ze strony.

<form action="wysylanie.php" method="POST" enctype="multipart/form-data" multiple>    

<input type="file" name="zdjecia" />
<button type="submit">Wyślij</button>

</form>
<?php
        $nick = $_SESSION['user'];   

	if(isset($_POST['zdjecia'])){

	// Informacje o plikach
	$uploaded_name = $_FILES['zdjecia']['name'];
	$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1 );
	$uploaded_size = $_FILES['zdjecia']['size'];
	$uploaded_type = $_FILES['zdjecia']['type'];
	$uploaded_tmp = $_FILES['zdjecia']['tmp_name'];       
	
	// Gdzie zapisane zdjecia
	$target_path = 'uploads/'.$nick;

	$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

	$temp_file = 
	((ini_get('upload_tmp_dir') == '') ? (sys_get_temp_dir()) : (ini_get('upload_tmp_dir') ) );
	$temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

	if( strtolower($uploaded_ext) == 'jpg' || strtolower($uploaded_ext) == 'jpeg' || strtolower($uploaded_ext) == 'png' &&
	($uploaded_size < 100000 ) && 
	($uploaded_type == 'image/jpeg'  || $uploaded_type == 'image/png') && getimagesize($uploaded_tmp)) {
		if( $uploaded_type == 'image/jpeg') {
			$img = imagecreatefromjpeg($uploaded_tmp);
			imagejpeg($img, $temp_file, 100);    
		}
		else {
			$img = imagecreatefrompng($uploaded_tmp);    
			imagepng($img, $temp_file, 9);
		}
		imagedestroy($img);       
	}
	}
?>

Pliki nie pojawiają się na serwerze, proszę doświadczonych o informacje gdzie może tkwić błąd. :D

2

Błąd jest już w samym formularzu:
<input type="file" name="zdjecia" />

Poprawny input powinien wyglądać tak:
<input type="file" name="zdjecia[]" />

gdyż jest to formularz umożliwiający dodawanie wielu plików jednocześnie.

Następnie trzeba zmodyfikować kod po stronie php tak aby w pętli obsłużyć zapis każdego pliku. Mniej więcej coś takiego:

foreach($_FILES["zdjecia"]["tmp_name"] as $key => $tmp_name) 
// logika zapisu
0

a jeśli nie dodam możliwości wrzucania wielu plików? usunę znacznik multiple w inpucie? bo już czegoś takiego próbowałem i też nie działa.

2
Mey napisał(a):

a jeśli nie dodam możliwości wrzucania wielu plików? usunę znacznik multiple w inpucie? bo już czegoś takiego próbowałem i też nie działa.

Problem leży najprawdopodobniej w warunku $_POST. Pliki załączone za pomocą input'a zdjecia nie są wysyłane za pomocą $_POST lecz $_FILES. Dlatego warunek:

if(isset($_POST['zdjecia'])){

nigdy nie będzie spełniony.

Na początku sprawdź czy tablica $_FILES zawiera jakiekolwiek dane:

// wysylanie.php

var_dump($_FILES);

Jeśli tak to wystarczy zmienić warunek na taki:

if (isset($_FILES['zdjecia'])) {
// logika
0

Tablica zawiera dane czy to dla $_POST czy $_FILES.
katalogi zawierają uprawnienia chmod 0777.
limity w php.ini zostały zwiększone.

uprościłem cały kod do:

	// Informacje o plikach
	$uploaded_name = $_FILES['zdjecia']['name'];
	$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1 );
	$uploaded_size = $_FILES['zdjecia']['size'];
	$uploaded_type = $_FILES['zdjecia']['type'];
	$uploaded_tmp = $_FILES['zdjecia']['tmp_name'];           
	

	if(is_uploaded_file($uploaded_tmp)) {
		move_uploaded_file($uploaded_tmp, "uploads/");    
	}      

ale nadal plik nie dociera na serwer, może to problem ze ścieżką do katalogu na serwerze? Jaka powinna być poprawnie skonstruowana ścieżka?

2

Zobacz tu:
https://www.w3schools.com/php/php_file_upload.asp
Masz w ogóle file_uploads = On w PHP.ini?

0

Tak, mam limity zwiększone i file_uploads = On w php.ini, nie pomaga.
Może wyślijcie mi nawet najprostszy kod wysyłania który wam działa, ja zmodyfikuje zmienne aby.

0

skopiowałem centralnie kod stąd: https://www.w3schools.com/php/php_file_upload.asp ten najdłuższy z samego dołu i podmieniłem nazwy.
Działa ale nie wiem czy nie działało już wcześniej. Komunikat, który zwrócił ten kod: File is an image - image/jpeg.Sorry, file already exists.Sorry, your file was not uploaded.
Nie wiem czy to nie był problem braku wyświetlania obrazów w programie ftp. Dopiero po resecie programu pliki się pojawiły na serwerze. Sprawdzę to na rożnych kodach.

2

Jeśli zaistniało file_exists to znaczy, że plik został skopiowany już wcześniej. Czyli skrypt działa.
Klient FTP nie zauważa plików zmienionych w międzyczasie przez inny program. Zresetuj połączenie i będzie ok.
Albo testuj to sobie na lokalnym serwerze.

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