0

I have a token page i need the user to upload an image and when done not able to go back but when I put my direction page for after completion lamp won't upload or complete the task but if i remove the page it complete fine any help from the logic applied here is the code the problem is where the bold line in code is that redirection`

<?PHP
session_start();
if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
    header ("Location: index.php");
}
?>
<?php
$target_dir = "uploads/";
$jobnumber="try_";
$random_digit=rand(0000,9999).$jobnumber;

//combine random digit to you file name to create new file name
//use dot (.) to combile these two variables

$new_file_name=$random_digit. basename($_FILES["fileToUpload"]["name"]);
$target_file = $target_dir .$new_file_name;
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    require_once("mysql_connect.php"); 

    $sql = "INSERT INTO imagepath (jobnumber,imagepath)
VALUES ('$_POST[Name]','$target_file')";

 $result = mysqli_query($connection, $sql);
        **header("location:logout.php");**
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 2000000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";

    } else {
        echo "Sorry, there was an error uploading your file.";
    }

}

?>`
Tim
  • 206
  • 6
  • 16
  • One solution is `output buffering` which helps with redirect headers. Here's a link with info if you don't get a different suitable answer. [Output Buffering](http://stackoverflow.com/questions/2832010/what-is-output-buffering) – lovermanthing Mar 30 '16 at 15:52

1 Answers1

1

You won't be able to do a header if you've output anything to the browser. So here:

if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
    header ("Location: index.php");
}
?>
<?php
$target_dir = "uploads/";

There's no need for your ?> <?php (it just sends a line break to the browser, ruining your header options) so remove those lines. Then, a rough solution would be to, anywhere you echo a result, instead, put it in the $_SESSION, such as:

$_SESSION['upload_error'] = 'File is not an image.';

Then, you would want to modify your logic so that if $uploadOk == 0 you redirect them back to the upload page, and on that page, if $_SESSION['upload_error'] is not empty, display it. Otherwise, redirect them elsewhere. If you need help with that particular logic, let me know.


A crude and quick solution with minimal-ish changes for time's sake. There are definitely some optimizations you could do, but this should work for your needs.

Let's say the image handling file is upload.php, and your form is displayed on something else, like, index.php

<?php

    session_start();

    if (!(isset($_SESSION['login']) && $_SESSION['login'] != '')) {
        header ("Location: index.php");
    }

    $_SESSION['upload_error'] = null;
    $_SESSION['upload_success'] = null;

    $target_dir = "uploads/";
    $jobnumber="try_";
    $random_digit=rand(0000,9999).$jobnumber;

    //combine random digit to you file name to create new file name
    //use dot (.) to combile these two variables

    $new_file_name=$random_digit . basename($_FILES["fileToUpload"]["name"]);
    $target_file = $target_dir . $new_file_name;
    $uploadOk = 1;
    $imageFileType = pathinfo($target_file, PATHINFO_EXTENSION);

    // Check if image file is a actual image or fake image
    if (isset($_POST["submit"])) {
        $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
        if ($check === false) {
            $_SESSION['upload_error'] =  "File is not an image.";
            $uploadOk = 0;
        }
    }

    // Check if file already exists
    if (file_exists($target_file)) {
        $_SESSION['upload_error'] = "File already exists.";
        $uploadOk = 0;
    }

    // Check file size
    if ($_FILES["fileToUpload"]["size"] > 2000000) {
        $_SESSION['upload_error'] = "Your file is too large.";
        $uploadOk = 0;
    }

    // Allow certain file formats
    if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) {
        $_SESSION['upload_error'] = "Only JPG, JPEG, PNG & GIF files are allowed.";
        $uploadOk = 0;
    }

    if ($uploadOk == 1) {
        if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
            $_SESSION['upload_success'] = "The file " . basename( $_FILES["fileToUpload"]["name"]) . " has been uploaded.";
        } else {
            $uploadOk = 0;  
        }
    }

    // Check if $uploadOk is set to 0 by an error
    if ($uploadOk == 1) {
        # This is where I make an obligatory comment about how you should not use user-provided data ($_POST['Name']) directly in a query, 
        # which is 100% true, but is a topic for another question
        require_once("mysql_connect.php"); 
        $sql = "INSERT INTO imagepath (jobnumber, imagepath) VALUES ('" . $_POST['Name'] . "', '$target_file')";
        $result = mysqli_query($connection, $sql);

        header("Location: success.php");
    } else {
        header("Location: index.php"); // send them back to the form, where you will display your error message
    }

?>

And this would be the very bare skeleton of index.php:

<?php

    session_start();

    # This will vary a lot depending on if you're in an MVC setup and/or using a templating engine, etc, but basically:

    // display HTML things like a header, etc

    if (!empty($_SESSION['upload_error'])) {
        echo "Sorry, your file was not uploaded: " . $_SESSION['upload_error'];
    }

    // display the rest of your HTML

?>

success.php would be similar, but obviously you'd display a success message; you could do this on index.php instead, checking in that file that !empty($_SESSION['upload_success']) and displaying it if it's not.

Davis
  • 856
  • 4
  • 11
  • Thanks Davis the actual logic will be great direction thanks in advance – Tim Mar 30 '16 at 16:20
  • @Tim, check my edit for specifics. Please be sure to accept the answer if it works for you. Let me know if you have any problems. – Davis Mar 30 '16 at 17:05