JayStabins Posted October 12, 2013 Share Posted October 12, 2013 Hey guys, Need a little help here, this function works fine the first time around, but I have added some logic to also create a thumbnail of the uploaded image. the function is recursive and at the end calls itself, the problem is the second time around where the move_uploaded_file function fails. Any help would be appreciated! function imageUpload($file, $user, $isThumb = FALSE) { // create thumbnail or save picture if ($isThumb) { $userDirectory = $_SESSION['member_id'] . "/images/thumbs"; $max = 100; } else { $userDirectory = $_SESSION['member_id'] . "/images"; $max = 800; } /* For Debugging, this will properlly check to see if image has been selected if ($file['image']['name'] == "") throw new Exception ( 'No image selected' ); */ // current directory $directory_self = str_replace ( basename ( $_SERVER ['PHP_SELF'] ), '', $_SERVER ['PHP_SELF'] ); $upload_directory = $_SERVER ['DOCUMENT_ROOT'] . $directory_self . "$userDirectory/"; $saveto = "$upload_directory" . time () . ".jpg"; var_dump($saveto); echo "<br />"; var_dump($file); echo "<br />"; if (! makeDir ( "$upload_directory" )) throw new Exception ( 'Error creating location on server, please try again...' ); if (! move_uploaded_file ( $file ['image'] ['tmp_name'], $saveto )) throw new Exception ( 'Error copying image to server, please try again...' ); switch ($file ['image'] ['type']) { case 'image/gif' : $src = imagecreatefromgif ( $saveto ); break; case 'image/jpeg' : case 'image/pjpeg' : $src = imagecreatefromjpeg ( $saveto ); break; case 'image/png' : $src = imagecreatefrompng ( $saveto ); break; default : // invalid image type throw new Exception ( 'Error, invalid file type. Please upload only (.gif, .png or .jpg)' ); break; } list ( $w, $h ) = getimagesize ( $saveto ); $tw = $w; $th = $h; if ($w > $h && $max < $h) { $th = $max / $w * $h; $tw = $max; } elseif ($h > $w && $max < $h) { $tw = $max / $h * $w; $th = $max; } elseif ($max < $w) { $tw = $th = $max; } try { $tmp = imagecreatetruecolor ( $tw, $th ); imagecopyresampled ( $tmp, $src, 0, 0, 0, 0, $tw, $th, $w, $h ); imageconvolution ( $tmp, array ( array ( - 1, - 1, - 1 ), array ( - 1, 16, - 1 ), array ( - 1, - 1, - 1 ) ), 8, 0 ); try { imagejpeg ( $tmp, $saveto ); } catch (Exception $e) { throw new Exception('Error with function imagejpeg() ' . $e->getMessage()); } } catch ( Exception $e ) { throw new Exception ( 'Error Code: ' . $e->getCode () ); } try { if (!$isThumb) { echo "About to create thumbnail for image<br />"; //create thumbnail for image $thumbLocation = imageUpload($file, $user, TRUE); var_dump($thumbLocation); $result = queryMySql ( "INSERT INTO pictures SET member_id='$user', file_location='$saveto', thumb_location='$thumbLocation'" ); var_dump($result); } else{ imagedestroy ( $tmp ); imagedestroy ( $src ); } } catch ( Exception $e ) { throw new Exception ( 'Unable to save to database: ' . $e->getCode () . " || " . $e->getMessage()); } return $saveto; } Here is the output from my var_dump's and catch statements.... string(73) "/2/images/1381618929.jpg" array(1) { ["image"]=> array(5) { ["name"]=> string(10) "Desert.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpTKWhtS" ["error"]=> int(0) ["size"]=> int(845941) } } array(1) { ["image"]=> array(5) { ["name"]=> string(10) "Desert.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpTKWhtS" ["error"]=> int(0) ["size"]=> int(845941) } } About to create thumbnail for imagestring(80) "/2/images/thumbs/1381618930.jpg" array(1) { ["image"]=> array(5) { ["name"]=> string(10) "Desert.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpTKWhtS" ["error"]=> int(0) ["size"]=> int(845941) } } array(1) { ["image"]=> array(5) { ["name"]=> string(10) "Desert.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpTKWhtS" ["error"]=> int(0) ["size"]=> int(845941) } } Failed to upload image Unable to save to database: 0 || Error copying image to server, please try again... $file is $_FILES..... any help would be greatly appreciated! Quote Link to comment Share on other sites More sharing options...
jazzman1 Posted October 13, 2013 Share Posted October 13, 2013 (edited) Can I see the path to $upload_directory? ............................ $saveto = "$upload_directory" . time () . ".jpg"; // here echo $upload_directory; var_dump($saveto); .......................... Also, don't understand very well what are you going to replace here -> $directory_self = str_replace ( basename ( $_SERVER ['PHP_SELF'] ), '', $_SERVER ['PHP_SELF'] ); echo $directory_self; Edited October 13, 2013 by jazzman1 Quote Link to comment Share on other sites More sharing options...
JayStabins Posted October 13, 2013 Author Share Posted October 13, 2013 (edited) That is funny, don't even remember coding this..... $directory_self = str_replace ( basename ( $_SERVER ['PHP_SELF'] ), '', $_SERVER ['PHP_SELF'] ); still works fine with the first run again but fails on the second run to create a thumb.... $upload_directory = $_SERVER ['DOCUMENT_ROOT'] . $_SERVER ['PHP_SELF'] . "$userDirectory/"; $saveto = "$upload_directory" . time () . ".jpg"; var_dump /home/(myusername)/(myDomain).com/2/images/1381624178.jpg" took out my username and domain for security..... Edited October 13, 2013 by JayStabins Quote Link to comment Share on other sites More sharing options...
JayStabins Posted October 13, 2013 Author Share Posted October 13, 2013 Again, it runs okay on the first run and saves the image to the proper directory but fails when creating the thumbnail.... Quote Link to comment Share on other sites More sharing options...
jazzman1 Posted October 13, 2013 Share Posted October 13, 2013 Hm....it should be work. Just forget at now about the thumbnails. Try to upload the same image twice recursively to two different directories. I don't see anything wrong in this simple test: function imageUpload($file, $user, $isThumb = FALSE) { // create thumbnail or save picture if ($isThumb) { $userDirectory = 'jazzman' . "/images/thumbs"; $max = 100; } else { $userDirectory = "jazzman" . "/images"; $max = 800; } // current directory $directory_self = str_replace ( basename ( $_SERVER ['PHP_SELF'] ), '', $_SERVER ['PHP_SELF'] ); $upload_directory = $_SERVER ['DOCUMENT_ROOT'] . $directory_self . "$userDirectory/"; var_dump($upload_directory ); echo "<br />"; var_dump($file,$user,$isThumb); if (!$isThumb) { echo "About to create thumbnail for image<br />"; //create thumbnail for image $thumbLocation = imageUpload($file, $user, $isThumb = TRUE); } } imageUpload('jazzman.jpg', 'jazz'); Output: string(40) "/var/www/html/test/jazzman/images/"string(11) "jazzman.jpg" string(4) "jazz" bool(false)About to create thumbnail for imagestring(47) "/var/www/html/test/jazzman/images/thumbs/"string(11) "jazzman.jpg" string(4) "jazz" bool(true) Quote Link to comment Share on other sites More sharing options...
Solution jazzman1 Posted October 13, 2013 Solution Share Posted October 13, 2013 (edited) When you submit the form this form has been submitted ones! So the file has been already submitted. When you're calling this function again the first argument does not exist (no resource). The first argument should be the path to the large image not just the name of the file as expected to be. $thumbLocation = imageUpload('path_to_the_uploaded_file', $user, $isThumb = TRUE); Edited October 13, 2013 by jazzman1 Quote Link to comment Share on other sites More sharing options...
JayStabins Posted October 13, 2013 Author Share Posted October 13, 2013 You nailed it, once I use the move_uploaded_file function I lose the file from the $_POST, so I passed the file location instead when calling the function again. I put some checks in the function to ensure that the file location is being used properly and also the switch statement is now nested (because I am using the function for one purpose) and now it works flawlessly. Here it he script for anyone that may want to use it to create a thumb and an image from one uploaded file. Cheers! function imageUpload($file, $user, $isThumb = FALSE) { // create thumbnail or save picture if ($isThumb) { $userDirectory = $_SESSION ['member_id'] . "/images/thumbs"; $max = 100; } else { $userDirectory = $_SESSION ['member_id'] . "/images"; $max = 800; } $directorySelf = $_SERVER ['PHP_SELF']; $upload_directory = $_SERVER ['DOCUMENT_ROOT'] . $directorySelf . "$userDirectory/"; $saveto = "$upload_directory" . time () . ".jpg"; if (! makeDir ( "$upload_directory" )) throw new Exception ( 'Error creating location on server, please try again...' ); if ($isThumb) { echo "About to try and copy " . $file . " to " . $saveto; copy ( $file, $saveto ); $src = imagecreatefromjpeg ( $saveto ); } else { if (! move_uploaded_file ( $file ['image'] ['tmp_name'], $saveto )) throw new Exception ( 'Error copying image to server, please try again...' ); switch ($file ['image'] ['type']) { case 'image/gif' : $src = imagecreatefromgif ( $saveto ); break; case 'image/jpeg' : case 'image/pjpeg' : $src = imagecreatefromjpeg ( $saveto ); break; case 'image/png' : $src = imagecreatefrompng ( $saveto ); break; default : // invalid image type throw new Exception ( 'Error, invalid file type. Please upload only (.gif, .png or .jpg)' ); break; } } list ( $w, $h ) = getimagesize ( $saveto ); $tw = $w; $th = $h; if ($w > $h && $max < $h) { $th = $max / $w * $h; $tw = $max; } elseif ($h > $w && $max < $h) { $tw = $max / $h * $w; $th = $max; } elseif ($max < $w) { $tw = $th = $max; } try { $tmp = imagecreatetruecolor ( $tw, $th ); imagecopyresampled ( $tmp, $src, 0, 0, 0, 0, $tw, $th, $w, $h ); imageconvolution ( $tmp, array ( array ( - 1, - 1, - 1 ), array ( - 1, 16, - 1 ), array ( - 1, - 1, - 1 ) ), 8, 0 ); try { imagejpeg ( $tmp, $saveto ); } catch ( Exception $e ) { throw new Exception ( 'Error with function imagejpeg() ' . $e->getMessage () ); } } catch ( Exception $e ) { throw new Exception ( 'Error Code: ' . $e->getCode () ); } try { if (! $isThumb) { echo "About to create thumbnail for image<br />"; // create thumbnail for image $thumbLocation = imageUpload ( $saveto, $user, TRUE ); $result = queryMySql ( "INSERT INTO pictures SET member_id='$user', file_location='$saveto', thumb_location='$thumbLocation'" ); var_dump ( $result ); } else { imagedestroy ( $tmp ); imagedestroy ( $src ); } } catch ( Exception $e ) { throw new Exception ( 'Unable to save to database: ' . $e->getCode () . " || " . $e->getMessage () ); } return $saveto; } Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.