Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

move_uploaded_file doesn't work, no error

I am running running a script which moves an uploaded file with move_uploaded_file(). I have done this thousands of times but for some reason it's not working. I have confimred the following:

  1. <form> using method="post" and correct enctype
  2. correct file referenced from form
  3. directory has permissions 777
  4. all the memory_limit, max_execution_time, etc are set to super high settings to avoid timeouts

Basically, the script below returns with just Your image is too big.. I have also enabled ALL errors to display and still don't get an error. Any ideas?

$time = time();
$target_path = "/absolute/path/to/temp/directory/temp/";

$target_path = $target_path.$time.'.jpg'; 

if(move_uploaded_file($_FILES['image']['tmp_name'], $target_path)) {            

} else{
        $error .= '<li>Your image is too big.</li>';
}

Using 1and1 hosting with the php.ini hack :P

UPDATE 1

I would like to add that response from the script occurs exactly after 60 seconds.

UPDATE 2

We might be getting somewhere with this. Just print_r($_FILES) and this is the result of the array:

Array ( 
    [image] => Array ( 
        [name] => P2120267.JPG 
        [type] => 
        [tmp_name] => 
        [error] => 1 
        [size] => 0 
    ) 
) 

So that leads me to believe that the file isn't be uploaded correctly to the server or something? I have checked and the post form is <form action="" method="post" enctype="multipart/form-data">. So, from what I can tell, the file isn't being uploaded to the server's temp area?

UPDATE 3

Noticed the [error] => 1 in the above array. This is apparently down to the filesize being larger than the upload_max_filesize. However, when i set this as 128M, I get a white screen of death after 60 seconds. The file I'm uploading is 2.5MB

Here is my php.ini file:

register_globals=off
memory_limit = 128M 
max_execution_time=3600 
post_max_size = 128M
upload_max_filesize= 128M 

UPDATE 4

With details above, it appears that I am getting a WSOD, but the image is being upoaded. So, how to stop the WSOD? I can't find any errors related anywhere.

UPDATE 5 - FOUND IT!

Shame on me for not giving you guys all the code. It looks like its to do with this line:

resizeImage($feedBurnerStatsSource, PHOTOMSGDIR.'temp/'.$time.'-tmp.jpg',$width,$height);

In the following code:

function resizeImage($source, $destination = NULL,$wdt, $height = NULL){
    if(empty($height)){
            // Height is nit set so we are keeping the same aspect ratio.
            list($width, $height) = getimagesize($source);
            if($width > $height){
                    $w = $wdt;
                    $h = ($height / $width) * $w;
                    $w = $w;
            }else{
                    $w = $wdt;
                    $h = $w;
                    $w = ($width / $height) * $w;
            }
    }else{
            // Both width and Height are set.
            // this will reshape to the new sizes.
            $w = $wdt;
            $h = $height;
    }
    $source_image = @file_get_contents($source) or die('Could not open'.$source);
    $source_image = @imagecreatefromstring($source_image) or die($source.' is not a valid image');
    $sw = imagesx($source_image);
    $sh = imagesy($source_image);
    $ar = $sw/$sh;
    $tar = $w/$h;
    if($ar >= $tar){
            $x1 = round(($sw - ($sw * ($tar/$ar)))/2);
            $x2 = round($sw * ($tar/$ar));
            $y1 = 0;
            $y2 = $sh;
    }else{
            $x1 = 0;
            $y1 = 0;
            $x2 = $sw;
            $y2 = round($sw/$tar);
    }
    $slate = @imagecreatetruecolor($w, $h) or die('Invalid thumbnail dimmensions');
    imagecopyresampled($slate, $source_image, 0, 0, $x1, $y1, $w, $h, $x2, $y2);
    // If $destination is not set this will output the raw image to the browser and not save the file
    if(!$destination) header('Content-type: image/jpeg');
    @imagejpeg($slate, $destination, 75) or die('Directory permission problem');
    ImageDestroy($slate);
    ImageDestroy($source_image);
    if(!$destination) exit;
    return true;
}

So, WSOD means that its some sort of die without a message. Any ideas?

like image 965
David Avatar asked Apr 13 '11 21:04

David


People also ask

Does move_uploaded_file overwrite?

The move_uploaded_file() function moves an uploaded file to a new destination. Note: This function only works on files uploaded via PHP's HTTP POST upload mechanism. Note: If the destination file already exists, it will be overwritten.

How to get path of uploaded file in PHP?

php $dir = dirname(__FILE__); echo "<p>Full path to this dir: " . $dir . "</p>"; echo "<p>Full path to a . htpasswd file in this dir: " .

What is $_ files in PHP?

$_FILES is a two-dimensional associative global array of items which are being uploaded via the HTTP POST method and holds the attributes of files such as: Attribute. Description. [name] Name of file which is uploading.


2 Answers

Just to verify is the post_max_filesize set to a high level? Because according to php.net:

If the size of post data is greater than post_max_size, the $_POST and $_FILES superglobals are empty. This can be tracked in various ways, e.g. by passing the $_GET variable to the script processing the data, i.e. <form action="edit.php?processed=1">, and then checking if $_GET['processed'] is set.

Something to consider.

for more info see this link and scroll down to the post_max_filesize section

UPDATE

In my experience if you're getting a WSOD it's usually do to error_reporting and display_errors being turned off OR the memory_limit being reached. In the script at the top I usually set the memory_limit to 1024M to verify that isn't the problem and the turn on error_reporting and display_errors... so put this before the file upload:

error_reporting(E_ALL); // or E_STRICT
ini_set("display_errors",1);
ini_set("memory_limit","1024M");

That normally gets rid of the WSOD and gives you and error to work with.

UPDATE

Have you tried taking off the @ error suppression in front of all your functions to see they are producing a specific error? Also what are you execution and input timeouts? and Can you verify what headers are being sent? (make sure it is Content-Type=text/html;)

like image 68
sbditto85 Avatar answered Sep 21 '22 04:09

sbditto85


Try changing the target path to a non temp directory.

After some of the updates here is the resolution:

set_time_limit(0);
ini_set('upload_max_filesize', '500M');
ini_set('post_max_size', '500M');
ini_set('max_input_time', 4000); // Play with the values
ini_set('max_execution_time', 4000); // Play with the values

...add this to the beginning of your file that processes the upload.

like image 43
Brant Messenger Avatar answered Sep 22 '22 04:09

Brant Messenger