Jump to content

Cannot view image in browser


sargeuk40

Recommended Posts

I have wamp 2 installed and have been following a course php mysql beyond the basics.

 

I am at a stage where I can move a photo by a form to a folder and then the info is transferred into the database.

 

To view the photos however, does  not work. I get the placeholder but no image on a list photos page. All the source and code appears correct and can be copied from his tutorial should you go wrong.

 

I am using xp. I am completely baffled. the image info comes up in firefox when right clicked with alt text missing but there wasn't any there initially. Image info but no image- what am I doing wrong?

Link to comment
https://forums.phpfreaks.com/topic/155809-cannot-view-image-in-browser/
Share on other sites

We need to see relevent code before we can help.

 

"2ND ATTEMPT I COPIED IN THE PHOTOGRAPH CODE INCORRECTLY, HERE IT IS

 

I understand. There are several pages that could affect things but will enclose the page that is essentially failing:

 

Code as follows: "List Photos"

<?php echo output_message($message); ?>
<table class="bordered">
  <tr>
    <th>Image</th>
    <th>Filename</th>
    <th>Caption</th>
    <th>Size</th>
    <th>Type</th>
	<th> </th>
  </tr>
<?php foreach($photos as $photo): ?>
  <tr>
    <td><img src="../<?php echo $photo->image_path(); ?>" width="100" /></td>   
    <td><?php echo $photo->filename; ?></td>
    <td><?php echo $photo->caption; ?></td>
    <td><?php echo $photo->size_as_text(); ?></td>
    <td><?php echo $photo->type; ?></td>
	<td><a href="delete_photo.php?id=<?php echo $photo->id; ?>">Delete</a></td>
  </tr>
<?php endforeach; ?>
</table>
<br />
<a href="photo_upload.php">Upload a new photograph</a>

<?php include_layout_template('admin_footer.php'); ?>

 

 

There is also a page storing all the criteria revolning around the photos. I will enclose that too as it contains a lot of the called for information:

 

Photograph:

<?php
// If it's going to need the database, then it's 
// probably smart to require it before we start.
require_once(LIB_PATH.DS.'database.php');

class Photograph extends DatabaseObject {

protected static $table_name="photographs";
protected static $db_fields=array('id', 'filename', 'type', 'size', 'caption');
public $id;
public $filename;
public $type;
public $size;
public $caption;

private $temp_path;
  protected $upload_dir="images";
  public $errors=array();
  
  protected $upload_errors = array(
	// http://www.php.net/manual/en/features.file-upload.errors.php
	UPLOAD_ERR_OK 				=> "No errors.",
	UPLOAD_ERR_INI_SIZE  	=> "Larger than upload_max_filesize.",
  UPLOAD_ERR_FORM_SIZE 	=> "Larger than form MAX_FILE_SIZE.",
  UPLOAD_ERR_PARTIAL 		=> "Partial upload.",
  UPLOAD_ERR_NO_FILE 		=> "No file.",
  UPLOAD_ERR_NO_TMP_DIR => "No temporary directory.",
  UPLOAD_ERR_CANT_WRITE => "Can't write to disk.",
  UPLOAD_ERR_EXTENSION 	=> "File upload stopped by extension."
);

// Pass in $_FILE(['uploaded_file']) as an argument
  public function attach_file($file) {
	// Perform error checking on the form parameters
	if(!$file || empty($file) || !is_array($file)) {
	  // error: nothing uploaded or wrong argument usage
	  $this->errors[] = "No file was uploaded.";
	  return false;
	} elseif($file['error'] != 0) {
	  // error: report what PHP says went wrong
	  $this->errors[] = $this->upload_errors[$file['error']];
	  return false;
	} else {
		// Set object attributes to the form parameters.
	  $this->temp_path  = $file['tmp_name'];
	  $this->filename   = basename($file['name']);
	  $this->type       = $file['type'];
	  $this->size       = $file['size'];
		// Don't worry about saving anything to the database yet.
		return true;

	}
}
  
public function save() {
	// A new record won't have an id yet.
	if(isset($this->id)) {
		// Really just to update the caption
		$this->update();
	} else {
		// Make sure there are no errors

		// Can't save if there are pre-existing errors
	  if(!empty($this->errors)) { return false; }
	  
		// Make sure the caption is not too long for the DB
	  if(strlen($this->caption) > 255) {
			$this->errors[] = "The caption can only be 255 characters long.";
			return false;
		}

	  // Can't save without filename and temp location
	  if(empty($this->filename) || empty($this->temp_path)) {
	    $this->errors[] = "The file location was not available.";
	    return false;
	  }

		// Determine the target_path
	  $target_path = SITE_ROOT .DS. 'public' .DS. $this->upload_dir .DS. $this->filename ;
	  
	  // Make sure a file doesn't already exist in the target location
	  if(file_exists($target_path)) {
	    $this->errors[] = "The file {$this->filename} already exists.";
	    return false;
	  }

		// Attempt to move the file 
		if(move_uploaded_file($this->temp_path, $target_path)) {
	  	// Success
			// Save a corresponding entry to the database
			if($this->create()) {
				// We are done with temp_path, the file isn't there anymore
				unset($this->temp_path);
				return true;
			}
		} else {
			// File was not moved.
	    $this->errors[] = "The file upload failed, possibly due to incorrect permissions on the upload folder.";
	    return false;
		}
	}
}

public function destroy() {
	// First remove the database entry
	if($this->delete()) {
		// then remove the file
	  // Note that even though the database entry is gone, this object 
		// is still around (which lets us use $this->image_path()).
		$target_path = SITE_ROOT.DS.'public'.DS.$this->image_path();
		return unlink($target_path) ? true : false;
	} else {
		// database delete failed
		return false;
	}
}
public function image_path() {
  return $this->upload_dir.DS.$this->filename;
}

public function size_as_text() {
	if($this->size < 1024) {
		return "{$this->size} bytes";
	} elseif($this->size < 1048576) {
		$size_kb = round($this->size/1024);
		return "{$size_kb} KB";
	} else {
		$size_mb = round($this->size/1048576, 1);
		return "{$size_mb} MB";
	}
}


// Common Database Methods
public static function find_all() {
	return self::find_by_sql("SELECT * FROM ".self::$table_name);
  }
  
  public static function find_by_id($id=0) {
  global $database;
    $result_array = self::find_by_sql("SELECT * FROM ".self::$table_name." WHERE id=".$database->escape_value($id)." LIMIT 1");
	return !empty($result_array) ? array_shift($result_array) : false;
  }
  
  public static function find_by_sql($sql="") {
    global $database;
    $result_set = $database->query($sql);
    $object_array = array();
    while ($row = $database->fetch_array($result_set)) {
      $object_array[] = self::instantiate($row);
    }
    return $object_array;
  }

private static function instantiate($record) {
	// Could check that $record exists and is an array
    $object = new self;
	// Simple, long-form approach:
	// $object->id 				= $record['id'];
	// $object->username 	= $record['username'];
	// $object->password 	= $record['password'];
	// $object->first_name = $record['first_name'];
	// $object->last_name 	= $record['last_name'];

	// More dynamic, short-form approach:
	foreach($record as $attribute=>$value){
	  if($object->has_attribute($attribute)) {
	    $object->$attribute = $value;
	  }
	}
	return $object;
}

private function has_attribute($attribute) {
  // We don't care about the value, we just want to know if the key exists
  // Will return true or false
  return array_key_exists($attribute, $this->attributes());
}

protected function attributes() { 
	// return an array of attribute names and their values
  $attributes = array();
  foreach(self::$db_fields as $field) {
    if(property_exists($this, $field)) {
      $attributes[$field] = $this->$field;
    }
  }
  return $attributes;
}

protected function sanitized_attributes() {
  global $database;
  $clean_attributes = array();
  // sanitize the values before submitting
  // Note: does not alter the actual value of each attribute
  foreach($this->attributes() as $key => $value){
    $clean_attributes[$key] = $database->escape_value($value);
  }
  return $clean_attributes;
}

// replaced with a custom save()
// public function save() {
//   // A new record won't have an id yet.
//   return isset($this->id) ? $this->update() : $this->create();
// }

public function create() {
	global $database;
	// Don't forget your SQL syntax and good habits:
	// - INSERT INTO table (key, key) VALUES ('value', 'value')
	// - single-quotes around all values
	// - escape all values to prevent SQL injection
	$attributes = $this->sanitized_attributes();
  $sql = "INSERT INTO ".self::$table_name." (";
	$sql .= join(", ", array_keys($attributes));
  $sql .= ") VALUES ('";
	$sql .= join("', '", array_values($attributes));
	$sql .= "')";
  if($database->query($sql)) {
    $this->id = $database->insert_id();
    return true;
  } else {
    return false;
  }
}

public function update() {
  global $database;
	// Don't forget your SQL syntax and good habits:
	// - UPDATE table SET key='value', key='value' WHERE condition
	// - single-quotes around all values
	// - escape all values to prevent SQL injection
	$attributes = $this->sanitized_attributes();
	$attribute_pairs = array();
	foreach($attributes as $key => $value) {
	  $attribute_pairs[] = "{$key}='{$value}'";
	}
	$sql = "UPDATE ".self::$table_name." SET ";
	$sql .= join(", ", $attribute_pairs);
	$sql .= " WHERE id=". $database->escape_value($this->id);
  $database->query($sql);
  return ($database->affected_rows() == 1) ? true : false;
}

public function delete() {
	global $database;
	// Don't forget your SQL syntax and good habits:
	// - DELETE FROM table WHERE condition LIMIT 1
	// - escape all values to prevent SQL injection
	// - use LIMIT 1
  $sql = "DELETE FROM ".self::$table_name;
  $sql .= " WHERE id=". $database->escape_value($this->id);
  $sql .= " LIMIT 1";
  $database->query($sql);
  return ($database->affected_rows() == 1) ? true : false;

	// NB: After deleting, the instance of User still 
	// exists, even though the database entry does not.
	// This can be useful, as in:
	//   echo $user->first_name . " was deleted";
	// but, for example, we can't call $user->update() 
	// after calling $user->delete().
}

}

?>

 

Finally the Upload Image page looks like this. Please note it successfully uploads the image to the images folder folder and places an entry in the database.

 

Photo_Upload

<?php
require_once('../../includes/initialize.php');
if (!$session->is_logged_in()) { redirect_to("login.php"); }
?>
<?php
$max_file_size = 1048576;   // expressed in bytes
                            //     10240 =  10 KB
                            //    102400 = 100 KB
                            //   1048576 =   1 MB
                            //  10485760 =  10 MB

if(isset($_POST['submit'])) {
	$photo = new Photograph();
	$photo->caption = $_POST['caption'];
	$photo->attach_file($_FILES['file_upload']);
	if($photo->save()) {
		// Success
      $session->message("Photograph uploaded successfully.");
		redirect_to('list_photos.php');
	} else {
		// Failure
      $message = join("<br />", $photo->errors);
	}
}

?>

<?php include_layout_template('admin_header.php'); ?>

<h2>Photo Upload</h2>

<?php echo output_message($message); ?>
  <form action="photo_upload.php" enctype="multipart/form-data" method="POST">
    <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size; ?>" />
    <p><input type="file" name="file_upload" /></p>
    <p>Caption: <input type="text" name="caption" value="" /></p>
    <input type="submit" name="submit" value="Upload" />
  </form>
  

<?php include_layout_template('admin_footer.php'); ?>

 

 

Any help would be greatly appreciated. I have tried sharing options, alternative path methods to reach the folder. I am on wamp 2 windows xp, firefox.

 

 

When I click on the image placeholder in the browser i get for instance this message applicable to the upload image - buddhas.jpg

 

The requested URL /photo_gallery/public/images\buddhas.jpg was not found on this server.

 

Any advice?

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.