webForumDet fria alternativet

Problem med bilduppladdning

9 svar · 367 visningar · startad av MickeA.com

MickeA.comMedlem sedan feb. 20034 441 inlägg
#1

Hej!
Jag håller på och försöker få till bilduppladdning, jag baserar mitt script på det här, som jag hittade bland PHP-Filerna här på wF:
http://www.webforum.nu/showthread.php?t=121070

Koden jag använder ser ut såhär:

<?php
if(isset($_GET['do']) && $_GET['do'] = "add_product"){
	$product_cat			= fix_sql($_POST['product_cat']);
	$product_name			= fix_sql($_POST['product_name']);
	$product_article		= fix_sql($_POST['product_article']);
	$product_photo_name		= $_FILES['product_photo']['name'];
	$product_photo_tmp_name	= $_FILES['product_photo']['tmp_name'];
	$product_photo_type		= $_FILES['product_photo']['type'];
	$product_photo_ext		= strtolower(substr($product_photo_name, (strrpos($product_photo_name, '.'))));
	$product_prize			= fix_sql($_POST['product_prize']);
	$product_about			= fix_sql($_POST['product_about']);

	$fsize_dir = './../pics/product/';
	$thumb_dir = './../pics/product/thumbs/';
	$new_img_width_large = 480;
	$new_img_width_small = 110;
	$img_compress = 85;
	
	$query = "INSERT INTO site_products "
			."(product_cat, product_name, product_article, product_prize, product_about) "
			."VALUES "
			."("
			."" . $product_cat . ", "
			."'" . $product_name . "', "
			."'" . $product_article . "', "
			."" . $product_prize . ", "
			."'" . $product_about . "'"
			.")";
	mysql_query($query, $the_link) or die("<p>Sql frågan genererade ett fel:<br /><span>Orsak: " . mysql_error() . "</span></p></body></html>");
	$last_id = mysql_insert_id($the_link);
	if(isset($last_id) && is_numeric($last_id) && !empty($product_photo_name)){
		if ($product_photo_type == "image/pjpeg" || $product_photo_type == "image/gif" || $product_photo_type == "image/jpeg") {
			// Proceed img_upload...
			$query =	 "UPDATE site_products SET "
						."product_picture = 'product_" . $last_id . $product_photo_ext . "' "
						."WHERE product_id = " . $last_id . " "
						."LIMIT 1";
			mysql_query($query) or die(mysql_error());
			$img_x_y_size =  getimagesize($product_photo_tmp_name);

			if ($new_img_width_large < $img_x_y_size[0]) {

				$new_img_height_large = ceil(($new_img_width_large / $img_x_y_size[0]) * $img_x_y_size[1]);
				$new_img_height_small = ceil(($new_img_width_small / $img_x_y_size[0]) * $img_x_y_size[1]);

				// Gör om bildens storlek
				$new_image_large = imagecreatetruecolor($new_img_width_large, $new_img_height_large);
				$new_image_small = imagecreatetruecolor($new_img_width_small, $new_img_height_small);

				// Kontrollera vilken bildtyp det är (1=gif , 2=jpg , 3=png)
				switch($img_x_y_size[2]) {
					case 1:
						$image = imagecreatefromgif($product_photo_tmp_name);
					break;
					case 2:
						$image = imagecreatefromjpeg($product_photo_tmp_name);
					break;
					case 3:
						$image = imagecreatefrompng($product_photo_tmp_name);
					break;
				}

				imagecopyresampled($new_image_large, $image, 0, 0, 0, 0, $new_img_width_large, $new_img_height_large, $img_x_y_size[0], $img_x_y_size[1]);
				imagecopyresampled($new_image_small, $image, 0, 0, 0, 0, $new_img_width_small, $new_img_height_small, $img_x_y_size[0], $img_x_y_size[1]);

				// Kopiera bilden till sin mapp
				$save_img_large = $fsize_dir . 'product_' . $last_id . $product_photo_ext;
				$save_img_small = $thumb_dir . 'product_' . $last_id . $product_photo_ext;
				
				imagedestroy($image);

			} else {
				
				move_uploaded_file($product_photo_tmp_name, $fsize_dir . 'product_' . $last_id . $product_photo_ext);
				move_uploaded_file($product_photo_tmp_name, $thumb_dir . 'product_' . $last_id . $product_photo_ext);

			}
			
			[b]imagejpeg($new_image_large, $save_img_large, $img_compress);
			imagejpeg($new_image_small, $save_img_small, $img_compress);[/b]
			
			[b]imagedestroy($new_image_large);
			imagedestroy($new_image_small);[/b]

		}else{
			// Inte en bild...
		}
	}
	[b]header("Location: product_add.php");[/b]
	exit;
}
?>

Problem dyker upp när man laddar upp en bild som _inte_ överstiger maxbreddn (480px), då får jag ett helt gäng felmeddelanden:

Notice: Undefined variable: new_image_large in E:\Webserver\*******\*****\product_add.php on line 83

Notice: Undefined variable: save_img_large in E:\Webserver\*******\*****\product_add.php on line 83

Warning: imagejpeg(): supplied argument is not a valid Image resource in E:\Webserver\*******\*****\product_add.php on line 83

Notice: Undefined variable: new_image_small in E:\Webserver\*******\*****\product_add.php on line 84

Notice: Undefined variable: save_img_small in E:\Webserver\*******\*****\product_add.php on line 84

Warning: imagejpeg(): supplied argument is not a valid Image resource in E:\Webserver\*******\*****\product_add.php on line 84

Notice: Undefined variable: new_image_large in E:\Webserver\*******\*****\product_add.php on line 86

Warning: imagedestroy(): supplied argument is not a valid Image resource in E:\Webserver\*******\*****\product_add.php on line 86

Notice: Undefined variable: new_image_small in E:\Webserver\*******\*****\product_add.php on line 87

Warning: imagedestroy(): supplied argument is not a valid Image resource in E:\Webserver\*******\*****\product_add.php on line 87

Warning: Cannot modify header information - headers already sent by (output started at E:\Webserver\*******\*****\product_add.php:83) in E:\Webserver\*******\*****\product_add.php on line 93

Raderna som är fetstilta ovan är de rader som ger fel.
(Använde kod-taggen eftersom php-taggen ger så konstiga radbrytningar).

Skulle behöva lite hjälp med att få ordning på det här, jag är ingen hejjare på PHP.

Tack!

drewMedlem sedan mars 2007845 inlägg
#2

Du har en massa odefinerade variabler. Dom måste innehålla ett värde innan du använder dom. Kolla i originalskriptet och se hur dom är definerade (tilldelade värden) där. ex:

$new_image_large = ...

Då borde du också se vilka värden som borde finnas i dom.

header("Location: product_add.php");

Klagar den på för att du fått en massa felmedelanden. När dom är fixade försvinner den.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#3

Aha okej.
Jag har kollar hur originalscriptet ser ut och kommit fram till att samma felmess dyker upp om jag skulle provköra det.
Jag antar då att det räcker med att sätta $variabel = ""; för dessa som det gbälls om, eftersom de inte används om bilden _inte_ behöver förminskas.

Återkommer...

MickeA.comMedlem sedan feb. 20034 441 inlägg
#4

Hmm, det där funkade inte riktigt...
Vilka är argumenten som ska användas till:

imagejpeg($new_image_large, $save_img_large, $img_compress);
imagejpeg($new_image_small, $save_img_small, $img_compress);

Det verkar som om felet uppstår när bilden alltså inte behöver förminskas och då eftersom ovanstående variabler (bortsett från $img_compress) aldrig sätts.

Vad ska jag sätta dom till i mitt script ovan, för att det ska bli rätt?

drewMedlem sedan mars 2007845 inlägg
#5

Att sätta variablen till "" gör ingen nytta. Det är samma sak som den innehåller om den inte är satt.

Ska kolla lite i originalskriptet.

/D

drewMedlem sedan mars 2007845 inlägg
#6

Jag skulle nog prova att flytta dom raderna lite uppåt. Till alldeles efter

// Kopiera bilden till sin mapp
$save_img_large = $fsize_dir . 'product_' . $last_id . $product_photo_ext;
$save_img_small = $thumb_dir . 'product_' . $last_id . $product_photo_ext;
				
imagedestroy($image);

Här är mitt förslag till ditt skript. Inte testad och hunden vill ut. Prova.

<?php
if(isset($_GET['do']) && $_GET['do'] = "add_product"){
	$product_cat			= fix_sql($_POST['product_cat']);
	$product_name			= fix_sql($_POST['product_name']);
	$product_article		= fix_sql($_POST['product_article']);
	$product_photo_name		= $_FILES['product_photo']['name'];
	$product_photo_tmp_name	= $_FILES['product_photo']['tmp_name'];
	$product_photo_type		= $_FILES['product_photo']['type'];
	$product_photo_ext		= strtolower(substr($product_photo_name, (strrpos($product_photo_name, '.'))));
	$product_prize			= fix_sql($_POST['product_prize']);
	$product_about			= fix_sql($_POST['product_about']);

	$fsize_dir = './../pics/product/';
	$thumb_dir = './../pics/product/thumbs/';
	$new_img_width_large = 480;
	$new_img_width_small = 110;
	$img_compress = 85;
	
	$query = "INSERT INTO site_products "
			."(product_cat, product_name, product_article, product_prize, product_about) "
			."VALUES "
			."("
			."" . $product_cat . ", "
			."'" . $product_name . "', "
			."'" . $product_article . "', "
			."" . $product_prize . ", "
			."'" . $product_about . "'"
			.")";
	mysql_query($query, $the_link) or die("<p>Sql frågan genererade ett fel:<br /><span>Orsak: " . mysql_error() . "</span></p></body></html>");
	$last_id = mysql_insert_id($the_link);
	if(isset($last_id) && is_numeric($last_id) && !empty($product_photo_name))
	{
		if ($product_photo_type == "image/pjpeg" || $product_photo_type == "image/gif" || $product_photo_type == "image/jpeg")
		{
			// Proceed img_upload...
			$query =	 "UPDATE site_products SET "
						."product_picture = 'product_" . $last_id . $product_photo_ext . "' "
						."WHERE product_id = " . $last_id . " "
						."LIMIT 1";
			mysql_query($query) or die(mysql_error());
			$img_x_y_size =  getimagesize($product_photo_tmp_name);

			if ($new_img_width_large < $img_x_y_size[0])
			{
				$new_img_height_large = ceil(($new_img_width_large / $img_x_y_size[0]) * $img_x_y_size[1]);
				$new_img_height_small = ceil(($new_img_width_small / $img_x_y_size[0]) * $img_x_y_size[1]);

				// Gör om bildens storlek
				$new_image_large = imagecreatetruecolor($new_img_width_large, $new_img_height_large);
				$new_image_small = imagecreatetruecolor($new_img_width_small, $new_img_height_small);

				// Kontrollera vilken bildtyp det är (1=gif , 2=jpg , 3=png)
				switch($img_x_y_size[2])
				{
					case 1:
						$image = imagecreatefromgif($product_photo_tmp_name);
					break;
					case 2:
						$image = imagecreatefromjpeg($product_photo_tmp_name);
					break;
					case 3:
						$image = imagecreatefrompng($product_photo_tmp_name);
					break;
				}

				imagecopyresampled($new_image_large, $image, 0, 0, 0, 0, $new_img_width_large, $new_img_height_large, $img_x_y_size[0], $img_x_y_size[1]);
				imagecopyresampled($new_image_small, $image, 0, 0, 0, 0, $new_img_width_small, $new_img_height_small, $img_x_y_size[0], $img_x_y_size[1]);

				// Kopiera bilden till sin mapp
				$save_img_large = $fsize_dir . 'product_' . $last_id . $product_photo_ext;
				$save_img_small = $thumb_dir . 'product_' . $last_id . $product_photo_ext;
				
				imagedestroy($image);

				imagejpeg($new_image_large, $save_img_large, $img_compress);
				imagejpeg($new_image_small, $save_img_small, $img_compress);
			
				imagedestroy($new_image_large);
				imagedestroy($new_image_small);
			}
			else
			{
				move_uploaded_file($product_photo_tmp_name, $fsize_dir . 'product_' . $last_id . $product_photo_ext);
				move_uploaded_file($product_photo_tmp_name, $thumb_dir . 'product_' . $last_id . $product_photo_ext);
			}
		}
		else
		{
			// Inte en bild...
		}
	}
	header("Location: product_add.php");
	exit;
}
?>

/D

MickeA.comMedlem sedan feb. 20034 441 inlägg
#7

Nu är jag nästa hemma.
Det funkar nu att ladda upp utan att få felmeddelandet, men...
När jag laddar upp en bild som inte ska förminskas så skapas det ingen thumb.
Nu vet jag inte om scriptet gjorde det från början heller, men det är iaf. meningen.
Oavsett om bilden man laddar upp ska förminskas eller inte, så måste det alltid skapas en miniatyr.

Vore även glad om du kunde förklara hur du gjorde om scriptet, så att det slutade strula. ;)

drewMedlem sedan mars 2007845 inlägg
#8

thumbs skapas i thumb.php som finns i samma paket, inte i photo.php.

Ska se var och hur det lämpligast stoppas in, om en stund.

Som jag skrev i mitt förra inlägg så flyttade jag raderna du fick felmeddelanden på. Jag flyttade upp dom så dom bara anropas om bildens storlek ändras, annars gör dom iaf ingen nytta.

Platsen där dom var innan är en bra plats att skapa thumbs på.

edit: thumb.php bara roterar bilden.

/J

drewMedlem sedan mars 2007845 inlägg
#9

Prova byta ut

            else
            {
                move_uploaded_file($product_photo_tmp_name, $fsize_dir . 'product_' . $last_id . $product_photo_ext);
                move_uploaded_file($product_photo_tmp_name, $thumb_dir . 'product_' . $last_id . $product_photo_ext);
            }

i mitt tidigare förslag mot.

			else
			{
				$new_img_height_small = ceil(($new_img_width_small / $img_x_y_size[0]) * $img_x_y_size[1]);
				$new_image_small = imagecreatetruecolor($new_img_width_small, $new_img_height_small);
				switch($img_x_y_size[2])
				{
					case 1:
						$image = imagecreatefromgif($product_photo_tmp_name);
					break;
					case 2:
						$image = imagecreatefromjpeg($product_photo_tmp_name);
					break;
					case 3:
						$image = imagecreatefrompng($product_photo_tmp_name);
					break;
				}
				imagecopyresampled($new_image_small, $image, 0, 0, 0, 0, $new_img_width_small, $new_img_height_small, $img_x_y_size[0], $img_x_y_size[1]);
				$save_img_small = $thumb_dir . 'product_' . $last_id . $product_photo_ext;
				imagedestroy($image);
				imagejpeg($new_image_small, $save_img_small, $img_compress);
				imagedestroy($new_image_small);

				move_uploaded_file($product_photo_tmp_name, $fsize_dir . 'product_' . $last_id . $product_photo_ext);
			}

Det är varken speciellt snyggt eller testat men det borde funka (tror jag). Jag har bara kopierat lite grejer från delen som förminskar bilden om den är för stor. Det verkar som att originalskriptet förutsatte att bilderna skulle vara för stora.

/D

MickeA.comMedlem sedan feb. 20034 441 inlägg
#10

Tackar!
Det fungerar som en dans.
Man kanske kan lägga det där i en egen fil som man infogar på sidan (eller i en funktion) om man vill ha det lite snyggare.
I det här fallet spelar det dock ingen roll om det är snyggt eller inte, det är funktionen jag är ute efter och den har jag nu.

Tack!

140 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)