Solved

Image uploaded but unable to view

Posted on 2011-09-07
11
226 Views
Last Modified: 2012-05-12
I have an image upload script which seems to be working fine:

		// Process new images. Resize to thumbnail and gallery.
		$path = $picpath . $_POST['gallery'] . '/';
		if( !is_dir($path) ) mkdir($path);
		
		for( $i=1; $i<=$upload_at_once; $i++ ) {
			if( empty($_POST['title'.$i]) ) continue;
			if( $_FILES['photo'.$i]['error'] > 0 ) trigger_error('#'. __LINE__ .'/'. $i .' - There was an error processing your file.',E_USER_ERROR);
			if( !$_FILES['photo'.$i]['size'] > 0 ) trigger_error('#'. __LINE__ .'/'. $i .' - There was an error processing your file.',E_USER_ERROR);
			
			list($name,$ext) = explode('.',$_FILES['photo'.$i]['name']);
			$name = substr($name,0,25);
			$name = $name . microtime(TRUE);
			$name = preg_replace('/[^a-zA-Z0-9_-]/','',$name);
			
			$galfull = $path . $name . '.' . $ext;
			$thfull = $path . $name . '_th.' . $ext;
			
			$temp = $path . 'temporary.' . $ext;
			if( !move_uploaded_file($_FILES['photo'.$i]['tmp_name'],$temp) ) trigger_error('#'. __LINE__ .'/'. $i .' - There was an error processing your file.',E_USER_ERROR);
			if( !imageResize($temp,$thfull,$thw,$thh,TRUE) ) trigger_error('#'. __LINE__ .'/'. $i .' - There was an error processing your file into a thumbnail.',E_USER_ERROR);
			if( !imageResize($temp,$galfull,$galw,$galh,TRUE) ) trigger_error('#'. __LINE__ .'/'. $i .' - There was an error processing your file into gallery size.',E_USER_ERROR);
			$sql = sprintf("INSERT INTO home_images
								(image_path,image_file,image_ext,image_title,image_caption,image_date,image_group,image_photographer)
								VALUES
								('images/home/%s/','%s','%s','%s','%s',NOW(),'%s','%s')",
								$db->real_escape_string($_POST['gallery']),
								$db->real_escape_string($name),
								$db->real_escape_string($ext),
								$db->real_escape_string($_POST['title'.$i]),
								$db->real_escape_string($_POST['caption'.$i]),
								$db->real_escape_string($_POST['gallery']),
								$db->real_escape_string($_POST['photographer'.$i])
								);
			if( !$db->query($sql) ) trigger_error('#'. __LINE__ .'/'. $i .' - There was an error adding to the database.',E_USER_ERROR);
			unlink($temp);
		}
		$content .= 'Successfully added new images.';

Open in new window

This is included by my loading mechanism and the content placed where it goes within the template. I then have an image viewing script, which is working for most pictures:
<?php

$image = ISSET($_GET['image']) ? $_GET['image'] : FALSE;
if( !$image ) die('Error #501:<br />There was a problem loading the image.'. var_dump($_GET));

/**
 * Print the page
 */

$sql = 'SELECT * FROM home_images WHERE id_image='. $image;
$result = $db->query($sql);
if( !$result ) die('MySQL Error: ('. mysqli_errno() .') '. mysqli_error .'<br />Query: '. $sql);
if( !$result->num_rows > 0 ) die('Error loading the selected image, please try again later.');
$info = $result->fetch_assoc();

$content .= '
<div id="main">
    <div style="height:5px;">&nbsp;</div>
    <center><a href="javascript:void()" onclick="history.go(-1);return false;">Back to previous page</a></center>
    <img src="'. sprintf('%sresources/%s%s.%s',$siteurl,$info['image_path'],$info['image_file'],$info['image_ext']) .'" style="padding: 10px 10px;" />
    <br />
    <h4>'. $info['image_title'] .'</h4>
    <p>'. $info['image_caption'] .'</p>
    ';
if( !empty($info['image_photographer']) ) $content .= '<p class="note">Photos provided by '. $info['image_photographer'] .'</p>';
$content .= '</div>
';
$sql = 'UPDATE home_images SET image_views = image_views+1 WHERE id_image='. $image;
$db->query($sql);

Open in new window


However I just used this script to upload 5 new pictures and they are not showing either in thumbnail or the view file. Also when I try to access these files directly via the full url http://www.domain.com/resources/images/home/groupname/imagename.jpg i get a 404 not found error. When I log into my FTP program I verified that these images are exactly where they are supposed to be.

Any idea why I can't seem to access these newly uploaded images? As I said its working fine for images that have been for there for a while, however the new images I just uploaded aren't showing, even tho they are located where the src tag says they are, as verified by the file system.
0
Comment
Question by:Derokorian
  • 6
  • 2
  • 2
  • +1
11 Comments
 
LVL 8

Expert Comment

by:pvlier
ID: 36498525
Might be an .htaccess rewriterule that redirects requests for files with particular names?
Second, did you check if the case is correct? Unix servers are casesensitive about filesnames...
0
 
LVL 10

Author Comment

by:Derokorian
ID: 36498563
To the second point: Yes I check the case of the filename, file path and the extension they are matching for both the thumbnail and full view. Which is very confusing to me.

To the first: I don't think my rewrites would be affecting anything, here is my file if you see an error:
RewriteEngine ON
RewriteBase /

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule (.+) $1 [L]

#page specific rewriting
RewriteRule ^waiting/(.*)/(.*)$ index.php?action=waiting&kid=$1&name=$2 [L]
RewriteRule ^waiting/(.*)$ index.php?action=waiting&page=$1 [L]
RewriteRule ^photos/(.*)$ index.php?action=photos&group=$1 [L]
RewriteRule ^view/(.*)$ index.php?action=view&image=$1 [L]
RewriteRule ^story/(.*)$ index.php?action=story&news=$1 [L]

#DTCO Rewrites
RewriteRule ^(table_info|auction_info|auction_rem|chef_info)/(.*)$ index.php?action=$1&id=$2 [L]

#general rewrite
RewriteRule ^(.*)$ index.php?action=$1 [L]

Open in new window

0
 
LVL 10

Author Comment

by:Derokorian
ID: 36498580
Further investigation provides more confusion. If i use the wrong case to try to access the image directly via the address bar, instead of getting a 404 error, i get redirected to the home page (as would be expected). So that tells me that the rewrite sees that the file is there, and the server just isn't giving it to me?
0
Easy, flexible multimedia distribution & control

Coming soon!  Ideal for large-scale A/V applications, ATEN's VM3200 Modular Matrix Switch is an all-in-one solution that simplifies video wall integration. Easily customize display layouts to see what you want, how you want it in 4k.

 
LVL 10

Assisted Solution

by:Derokorian
Derokorian earned 0 total points
ID: 36498638
It seems when I copied the images to their destinations they weren't given proper permissions.

Can anyone, looking at my code, tell me how to modify it so that the images created are given proper privileges? I need them to be web visible (obviously), its an apache server running on linux (not sure what distro). Any help would be greatly appreciated!
0
 
LVL 82

Expert Comment

by:hielo
ID: 36499273
>>Also when I try to access these files directly via the full url http://www.domain.com/resources/images/home/groupname/imagename.jpg i get a 404 not found error.

Try comment out line 35:
                  //unlink($temp);
0
 
LVL 10

Accepted Solution

by:
Derokorian earned 0 total points
ID: 36499716
Turns out I have to chmod the permissions on the new files, even tho these were inheritted before... oh well =D
0
 
LVL 10

Author Closing Comment

by:Derokorian
ID: 36521438
Need to apply proper permissions to the files after creating them.
0
 
LVL 8

Expert Comment

by:pvlier
ID: 36501833
Hi Dekorian, that's strange, because the files are uploaded using script that runs as the apache user (eg 'apache') so viewing them using apache would use the same user.... therefor the browser should be able to show them... also you said some files did work and some don't... very confusing... but glad you sorted your problem...
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 36502421
This is the code I use to "chmod" the uploaded files or issue an error message if the function fails.
if (!chmod ($my_new_file, 0755))
            {
                echo "<br/>chmod(0755) FAILED: fileperms() = ";
                echo substr(sprintf('%o', fileperms($my_new_file)), -4);
            }

Open in new window

0
 
LVL 10

Author Comment

by:Derokorian
ID: 36502951
>>>also you said some files did work and some don't... very confusing... but glad you sorted your problem...

Well these files were uploaded when we were on our old server, so something is configured differently that is not defaulting the right permissions.

Thanks Ray, I prefer trigger error so that I can turn off those messages in production =D
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 36502975
Yeah, I agree about trigger_error.  Sometimes I use output buffering to trap messages and email them to myself.
0

Featured Post

Microsoft Certification Exam 74-409

Veeam® is happy to provide the Microsoft community with a study guide prepared by MVP and MCT, Orin Thomas. This guide will take you through each of the exam objectives, helping you to prepare for and pass the examination.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article discusses four methods for overlaying images in a container on a web page
This article explains how to prepare an HTML email signature template file containing dynamic placeholders for users' Azure AD data. Furthermore, it explains how to use this file to remotely set up a department-wide email signature policy in Office …
The viewer will learn how to dynamically set the form action using jQuery.
The viewer will receive an overview of the basics of CSS showing inline styles. In the head tags set up your style tags: (CODE) Reference the nav tag and set your properties.: (CODE) Set the reference for the UL element and styles for it to ensu…

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question