'Images not displaying - Bad file descriptor

This page works for showing everything but the images, which are stored in the public/uploads folder with filenames as "1.jpg", "2.jpg" etc. I seem to be unable to construct a query string that effectively retrieves the image. Need be, I can include the SQLite.

<?php
$page_name = 'gallery';
$nav_plantgallery_class = 'active_page';

// plant gallery requires login to access content
// if (is_user_logged_in()) {


  // --- Upload Document ---

  // Set maximum file size for uploaded files.
  // MAX_FILE_SIZE must be set to bytes
  // 1 MB = 1000000 bytes
  define("MAX_FILE_SIZE", 1000000);

  // feedback CSS classes
  $file_feedback_class = 'hidden';
//   $name_feedback_class = 'hidden';
  $desc_feedback_class = 'hidden';
  $name_feedback_class = 'hidden';
  $genus_feedback_class= 'hidden';
//   $desc_feedback_class = 'hidden';
  $type_feedback_class = 'hidden';
  $id_feedback_class='hidden';



  // upload fields
  $upload_name = NULL;
// $plant_name=
  $upload_desc = NULL;
//   $upload_source = NULL;
  $upload_filename = NULL;
  $upload_ext = NULL;
  $upload_genus=
  $upload_type=
  $upload_plantid=NULL;

  // sticky values
  // Note: file uploads are not sticky!
//   $sticky_name = '';
//   $sticky_desc = '';
//   $sticky_source = '';
$sticky_name = $sticky_genus=
$sticky_desc ='';
$sticky_plantid=
$sticky_planttype_groundcover = '';
$sticky_planttype_fern = '';
$sticky_planttype_flower = '';
$sticky_planttype_shrub = '';
$sticky_planttype_vine = '';
$sticky_planttype_tree = '';
$sticky_planttype_grass = '';

  // Users must be logged in to upload files!
  if (isset($_POST["upload"])) {

    $upload_name = trim($_POST['name']); // untrusted
    $upload_desc = trim($_POST['desc']); // untrusted
    // $upload_source = trim($_POST['source']); // untrusted
    $upload_genus= trim($_POST['genus']);
    $upload_type= trim($_POST['type']);
    $upload_plantid= trim($_POST['plant_id']);

    // get the info about the uploaded files.
    $upload = $_FILES['jpg-file'];

    // Assume the form is valid...
    $form_valid = True;

    // file is required
    if ($upload['error'] == UPLOAD_ERR_OK) {
      // The upload was successful!

      // Get the name of the uploaded file without any path
      $upload_filename = basename($upload['name']);

      // Get the file extension of the uploaded file and convert to lowercase for consistency in DB
      $upload_ext = strtolower(pathinfo($upload_filename, PATHINFO_EXTENSION));

      // This site only accepts JPG files!
      if (!in_array($upload_ext, array('jpg'))) {
        $form_valid = False;
      }
    } else {
      // upload was not successful
      $form_valid = False;
    }

    // name is required
    if (empty($upload_name)) {
      $form_valid = False;
      $name_feedback_class = '';
    }

    // description is required
    if (empty($upload_desc)) {
      $form_valid = False;
      $desc_feedback_class = '';
    }

    if (empty($upload_genus)) {
        $form_valid = False;
        $genus_feedback_class = '';
      }

      if (empty($upload_type)) {
        $form_valid = False;
        $type_feedback_class = '';
      }
      if (empty($upload_plantid)) {
        $form_valid = False;
        $id_feedback_class = '';
      }

    // // Record NULL (not empty string)
    // if (empty($upload_source)) {
    //   $upload_source = NULL;
    // }

    if ($form_valid) {

      // insert upload into DB
      $result = exec_sql_query(
        $db,
        "INSERT INTO plants (plant_id, name, description, genus, type, file_name, file_ext) VALUES (:plant_id, :name, :description, :genus, :type, :file_name, :file_ext)",
        array(
        //   ':user_id' => $current_user['id'],
        ':plant_id' => $upload_plantid,
          ':name' => $upload_name,
          ':description' => $upload_desc,
          ':genus' => $upload_genus,
          ':type' => $upload_type,
          ':file_name' => $upload_filename,
          ':file_ext' => $upload_ext,
        //   ':source' => $upload_source
        )
      );

      if ($result) {
        // We successfully inserted the record into the database, now we need to
        // move the uploaded file to it's final resting place: public/uploads directory

        // get the newly inserted record's id
        $record_id = $db->lastInsertId('id');

        // uploaded file should be in folder with same name as table with the primary key as the filename.
        // Note: THIS IS NOT A URL; this is a FILE PATH on the server!
        //       Do NOT include / at the beginning of the path; path should be a relative path.
        //          NO: /public/...
        //         YES: public/...
        $id_filename = 'public/uploads/documents/' . $record_id . '.' . $upload_ext;

        // Move the file to the public/uploads/documents folder
        // Note: THIS FUNCTION REQUIRES A PATH. NOT A URL!
        move_uploaded_file($upload["tmp_name"], $id_filename);
      }
    } else {
      // file uploads are not sticky!
      // user must reselect file, show file feedback when showing feedback!
      $file_feedback_class = '';

      $sticky_name = $upload_name;
      $sticky_desc = $upload_desc;
      $sticky_genus= $upload_genus;
      $sticky_type= $upload_type;
      $sticky_plantid=$upload_plantid;
    //   $sticky_source = $upload_source;
    }
  }


  // --- Document Records ---

  // query the database for the grade records
  $records = exec_sql_query(
    $db,
    "SELECT * FROM plants ORDER BY file_name ASC;",

  )->fetchAll();
// }
?>









<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />

  <name><?php echo $page_name; ?> - plants</name>

  <link rel="stylesheet" type="text/css" href="/public/styles/site.css" media="all" />
</head>

<body>
  <?php include('includes/header.php'); ?>

  <main class="plantgallery">

    <section class="gallery">
      <h2><?php echo $page_name; ?></h2>

      <?php
      // if (is_user_logged_in()) {

        // Only show the documents gallery if we have records to display.
        if (count($records) > 0) { ?>

          <ul>
            <?php
            foreach ($records as $record) { ?>
              <li>
                <a href="/document?<?php echo http_build_query(array('id' => $record['id'])); ?>">
                  <img class="flower" src="/public/uploads/<?php echo $record['id'] . '.' . $record['file_ext']; ?>" alt="<?php echo htmlspecialchars($record['id']); ?>" />
                  <p><?php echo ucfirst($record['plant_name']); ?></p>
                </a>
              </li>
            <?php
            } ?>
          </ul>

        <?php
        } else { ?>

          <p>Gallery is <em>empty</em>.</p>

        <?php } ?>




<?php        if ($is_admin() && is_user_logged_in()) {?>


        <section class="upload">
          <h2>Upload Plant</h2>

          <form action="/" method="post" enctype="multipart/form-data" novalidate>

            <!-- MAX_FILE_SIZE must precede the file input field -->
            <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_FILE_SIZE; ?>" />

            <p class="feedback <?php echo $file_feedback_class; ?>">Please select an JPG file.</p>
            <div class="label-input">
              <label for="upload-file">JPG File:</label>
              <input id="upload-file" type="file" name="jpg-file" accept=".jpg,image/jpg" />
            </div>

            <p class="feedback <?php echo $name_feedback_class; ?>">Please provide a name.</p>
            <div class="label-input">
              <label for="upload-name">Plant name:</label>
              <input id='upload-name' type="text" name="name" placeholder="plant name" value="<?php echo htmlspecialchars($sticky_name); ?>" />
            </div>

            <p class="feedback <?php echo $desc_feedback_class; ?>">Please provide a description.</p>
            <div class="label-input">
              <label for="upload-desc">Description:</label>
              <textarea id="upload-desc" name="desc" rows="5" placeholder="plant description."><?php echo htmlspecialchars($sticky_desc); ?></textarea>
            </div>

            <p class="feedback <?php echo $genus_feedback_class; ?>">Please provide a genus.</p>
            <div class="label-input">
              <label for="upload-genus">Genus:</label>
              <input id='upload-genus' type="text" name="genus" placeholder="plant genus" value="<?php echo htmlspecialchars($sticky_genus); ?>" />
            </div>

            <p class="feedback <?php echo $id_feedback_class; ?>">Please provide a plant ID.</p>
            <div class="label-input">
              <label for="upload-id">name:</label>
              <input id='upload-id' type="text" name="id" placeholder="plant id" value="<?php echo htmlspecialchars($sticky_plantid); ?>" />
            </div>







            <!-- <div class="label-input">
              <label for="upload-source" class="optional">Source URL:</label>
              <input id='upload-source' type="url" name="source" placeholder="URL where found. (optional)" value="<?//php echo htmlspecialchars($sticky_source); ?>" />
            </div> -->

            <div class="align-right">
              <button type="submit" name="upload">Upload Plant</button>
            </div>

          </form>
        </section>

      <?php
    //   } else {
      ?>

        <!-- <p>Please login to access your plant gallery.</p> -->

        <?php
        //echo_login_form('/', $session_messages);
        ?>

      <?php
      }
      ?>
  </main>

  <?//php include("includes/footer.php"); ?>
</body>

</html>


Solution 1:[1]

You save your files into public/uploads/documents/ but take from different folder public/uploads/. Try to fix the src path like this

<?php
foreach ($records as $record) { ?>
  <li>
    <a href="/document?<?php echo http_build_query(array('id' => $record['id'])); ?>">
      <img class="flower" src="/public/uploads/documents/<?php echo $record['id'] . '.' . $record['file_ext']; ?>" alt="<?php echo htmlspecialchars($record['id']); ?>" />
      <p><?php echo ucfirst($record['plant_name']); ?></p>
    </a>
  </li>
<?php
} ?>

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 pgood