PHP Upload system not moving file from temp to specified directory - php

So I've tried to create a basic PHP/MySQL picture upload system using the W3Schools example as a reference, however I cannot for the life of me work out why the uploaded file is not being copied to the destination specified.
Here is my PHP code:
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
$uploads_dir = 'img/houses';
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& in_array($extension, $allowedExts)) {
if ($_FILES["file"]["error"] > 0) {
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
} else {
move_uploaded_file($_FILES["file"]["tmp_name"],
$uploads_dir . $_FILES["file"]["name"]);
echo "Stored in: " . $uploads_dir . $_FILES["file"]["name"];
}
} else {
echo "Invalid file";
}
And here is the HTML upload form:
<form action="uploadHousePic.php" method="post" enctype="multipart/form-data">
Image: <input type="file" name="file" id="file"/>
<br><br>
Price: £ <input type="text" name="Price">
<br><br>
Type of house: <input type="text" name="Type">
<br><br>
Location: <input type="text" name="Location">
<br><br>
Description: <textarea rows="6" cols="60" input type="text" name="Description"></textarea>
<br><br>
<input type="submit" value="Submit" />
</form>
Finally, I have the destination code on another php page where the picture + info will be inserted:
<?php
// this is used to connect to the database on the mysql server called houselist
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();// if there is a problem with the connection and it can't connect it will display this error to the user.
}
$result = mysqli_query($con,"SELECT * FROM tbl_house_info");//this setups the query to be used in order to gather the data to be displayed on the page. it will select all the data from the tbl_house_page.
while($row = mysqli_fetch_array($result)) {//this then will run a loop and fetch all the results from the database in an array and display them in order row by row.
echo '<div class="housepost">';//this is used to add the format of the web page that was used.
echo '<img src="img/houses/', $row['Image'],'" width="270px" height="190px" alt="" />';// this line adds the image to the div and adds in the destination of the image, the image will have been placed here from the upload and now adding in the file name from the database it will display the full image on the page.
echo '<h2>' , '£' ,$row['Price'] , '</h2>' , '<p>'. $row['Type'] , '</p>' , '<p>' . $row['Location'] , '</p>' , '<p>' , $row['Description'] , '</p>';// this will then add some more formatting as well as displaying the other columns of data which are the price, type, location and destination on the web page to the user.
echo "</div>";
}
?>
Any help would be greatly appreciated. This is for a College project that I am working on, so I wanted to try and figure it out for myself; but when both you and your teacher cannot find the problem something is wrong...
Thanks :)

Check if max file size and max post size in php.ini are big enough! :)
file_uploads = On
upload_max_filesize = xxxM
post_max_size = xxxM
For 70% it's bad config.
EDIT: Restart server (Xampp, apache, wampp or any other) :)

Change your path from $uploads_dir = 'img/houses'; to $uploads_dir = 'img/houses/';
Also check whether you have the write privileges for this directory.
You can also use is_writable() function to check whether writable.
Refer http://www.php.net/manual/en/function.is-writable.php

Related

Moving uploaded files with php

I am having issues moving files once uploaded. The upload appears to pass ok with no errors reported. I have 777 on the folder to upload to. The system is wordpress and I have no idea what I am doing wrong.
It should be noted that the form is inside another form. The eventual outcome is to have an image upload (this form, which is inside the larger one) that will allow the user to crop the image and add tags, title description etc before submitting the second form. The final submission of the second form will post to a custom post type and that is working fine. just the moving files and jcrop I am concerned about.
can anyone see a typo in there?
I cannot.
<form method="POST" action="" enctype="multipart/form-data">
<label for="image_upload">Image Upload</label>
<input id="image_upload" type="file" class="text_input" value="" name="file">
<input id="image-upload" type="submit" class="button" value="Upload" name="upload">
<!-- <img id="image-upload" src="<?php echo get_template_directory_uri(); ?>/images/sago.jpg" alt=""> -->
<?php
// Process the upload
if (!empty ($_POST['upload'])) {
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 100000)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "<div> Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br> </div>";
//set temp dir path
$path = $_SERVER['DOCUMENT_ROOT'];
$upload_dir = $path . '/wp-content/uploads/jcrop_temp/';
if (file_exists($path . '/wp-content/uploads/jcrop_temp/' . $_FILES["file"]["name"]))
{
echo "<div style='border: solid 1px #BF5738; color: #BF5738; padding: 1em;'> The File: <span style='color: black;'>" . $_FILES["file"]["name"] . "</span> already exists. Please rename the file before trying again. </div>";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);
echo "Stored in: " . $upload_dir . $_FILES["file"]["name"];
echo "<div style='border:solid 1px #E1E1E1; max-width: 710px; text-align: center;'>
<img id='image-upload' src='" . "/wp-content/uploads/jcrop_temp/" . $_FILES["file"]["name"] . "'>
</div>
";
}
}
}
else
{
echo "Invalid file";
}
//end upolad if
}
?>
</form>
The issue is with this line:
move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]);
You need to specify the uploaded directory in your second parameter, like so:
move_uploaded_file($_FILES["file"]["tmp_name"], $upload_dir.$_FILES["file"]["name"]);
OK, So it is a convoluted process. Simple enough outside of Wordpress but inside.... its a pain.
There were a few thing I needed to change, firstly the file size was in bytes not kb! Idiot!...(Thanks to Panama Jack for making me look at it again and reminding me to not assume things.)
Secondly, the move_uploaded_file() function does NOT work inside wordpress. Instead I cobbled together something out of this useful post:http://wordpress.org/support/topic/using-move_uploaded_file-in-a-plugin
$path_array = wp_upload_dir();
$path = str_replace('\\', '/', $path_array['path']);
$old_name = $_FILES["image_upload_path"]["name"];
$split_name = explode('.',$old_name);
$time = time();
$file_name = $time.".".$split_name[1];
move_uploaded_file($_FILES["image_upload_path"]["tmp_name"],$path. "/" . $file_name);
(Please note if you use this code you WILL need to know what you are doing as the references in the question and answer do not correlate.)
With this I was able to send the uploaded file to the uploads directory and generate the various image sizes that wordpress likes (80x80 thumb, medium, large etc).
Why WP doesnt allow move_uploaded_file is beyond be....anyone?
Either way, it is possible, just a pain. I hope this helps.
Other Resources I used to get it working:
http://cube3x.com/2013/03/upload-files-to-wordpress-media-library-using-php/
move_uploaded_file() wordpress plugin

php uploads and zero filesize

I would so appreciate some help here please. I have been struggling without success for a full day to upload images to a shared host running Zeus (rather than apache--yes I know, they are changing!). The host blames the code yet wont tell me why "as they are not programmers" I have tried so many different version of the form script I am out of options. I have of course checked the upload limits on the php ini file configs (which I am not allowed to change by the host) and they are both 128meg. So it looks unlikely that is the cause. The outcome of the scripts is that we get to the final ''successfully loaded the file'' message but the files size loaded is zero (so there is nothing new in the target directory). I am relatively new to php so please do go easy on the jargon. Thank you.
Here are the two files>> First the form...
<form enctype="multipart/form-data" action="anewupload.php" method="POST">
Please choose a file: <input name="uploaded" type="file" /><br />
<input type="submit" value="Upload" />
</form>
and the php file refered to by the form...
<?php
$target = "uploads/";
$target = $target . basename( $_FILES['uploaded']['name']) ;
$ok=1;
//This is our size condition
if ($uploaded_size >350000)
{
echo "Your file is too large.<br>";
$ok=0;
}
//This is our limit file type condition
if ($uploaded_type =="text/php")
{
echo "No PHP files<br>";
$ok=0;
}
//Here we check that $ok was not set to 0 by an error
if ($ok==0)
{
Echo "Sorry your file was not uploaded";
}
//If everything is ok we try to upload it
else
{
if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target))
{
echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded to..";
echo $target;
echo "..The uploaded file size is $uploaded_size";
}
else
{
echo "Sorry, there was a problem uploading your file.";
}
}
?>
First make sure the uploads folder exists and that is has write permissions set to either 755 or 777
Plus, you have two unassigned variables, $uploaded_size and $uploaded_type, so that will fail.
You would need to use something like if ($_FILES["file"]["size"] <350000) etc. probably another reason why it's failing.
Give this a try, see if this works for you, it's what I use:
Modify $allowedExts = array("gif", "jpeg", "jpg", "png"); for permitted file extensions.
It will upload only if size is less than 350000
NOTE: Change <input name="uploaded" type="file" /> to <input name="file" type="file" /> see form under handler code.
<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 350000)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
if (file_exists("uploads/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"uploads/" . $_FILES["file"]["name"]);
echo "Stored in: " . "uploads/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
Also change your form to this to reflect the PHP handler:
<form enctype="multipart/form-data" action="anewupload.php" method="POST">
Please choose a file: <input name="file" type="file" /><br />
<input type="submit" value="Upload" />
</form>

pass a text field to be a field in a linked php file in order to create a parameter

I have a form on a page which uploads a file. This form also has a 'ship_id' field to identify which record the file belongs to. Basically I need to pass the 'ship_id' field into 'upload_update.php' so that the link to 'update_ship.php' has two parameters, the name of the ship (which works perfectly well) AND the 'ship_id' which isn't working.... not sure how to achieve this.
Many thanks
Main form:
<form action="upload_update.php" method="post"
enctype="multipart/form-data">
<p>
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input name="ship_id" type="text" value="<?php echo $_GET['ship_id']; ?>" />
<input type="submit" name="submit" value="Submit">
</p>
</form>
upload_update.php file:
<?php
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/png"))
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Image succsefuly uploaded. " . "<br>" . "<br>";
?>
Click Hereto return to Add Ship page
<?php
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"../images/ships/" . $_FILES["file"]["name"]);
}
}
}
else
{
echo "Invalid file";
}
?>
with $_GET['ship_id'] you get the field as a GET parameter.
Then you submit it in the form as a POST parameter. So in the upload_update.php you should get it with
$_POST['ship_id']
Also you might consider sending it in the form as a hidden field:
<input name="ship_id" type="hidden" value="<?php echo $_GET['ship_id']; ?>" />

Uploading Image [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 9 years ago.
Improve this question
i am trying to upload an image.
<input name="files" type="file" id="files">
<input type="submit" name="submit" id="submit" value="Add" />
After Posting Data,
<?php
if(isset($_POST['submit']))
{
$path="panel/images"."/".$_FILES["file"]["name"];
move_uploaded_file($_FILES["files"]["tmp_name"], $path);
}
?>
but it does not upload the file.
make sure that you have specified enctype in form tag
<form action="test.php" enctype="multipart/form-data" method="POST">
Change this:-
$path="panel/images"."/".$_FILES["file"]["name"];
to
$path="panel/images"."/". basename($_FILES["files"]["name"]);
You have used id="files" in form but you are using "file" in your php code.
i think it should be like
$_FILES["files"]["name"] not $_FILES["file"]["name"]
in your $path
YOU have error in
if(isset($_POST['submit']))
{
$path="panel/images"."/".$_FILES["files"]["name"];
//This Line Your element name is files not file
move_uploaded_file($_FILES["files"]["tmp_name"], $path);
}
According to wat I understood ur problem is with only file upload..So I have briefed the php and html file for you..Comments are there in the code and I have tried to keep things easy. You can get the idea about the code through the comments. Any more queries wud be appreciated.
//This is the php code for upload file..
<?php
//allowedExts variable is an array consisting of file types that can be supported.we are uploading image so image file extensions are used.
$allowedExts = array("gif", "jpeg", "jpg", "png");
//explode function breaks the string, here used to get the file extension, whenever
//a dot(.) would be found in the filename,say abc.jpg, the extension jpg would be
//retrived.
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
{
//if any error in file, display it
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
//else upload the file
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
//file will be uploaded in the upload directory..but also need to check whether
//the directory consists a same filename already or not..if it does contains
// a file say abc.jpg already..it would display the msg file already exist
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
//else it will upload it in upload directory, you can name the directory acc to you..
//but conventionally upload is used as the directory name
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
//php file ends here
//this is the html file..frame it according to wat u need
<html>
<body>
//the most important thing is that you should keep the
//enctype(encryption type)=multipart/form-data. This is mandatory for media files
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>

PHP File upload form not working

I've used this code in another site I've made and it works absolutely fine so I'm really confused as to why this isn't working properly. The only things I have changed are the directories for the file to be moved to, but the files never get uploaded. I've triple checked everything and it all seems fine. The code all executes without errors and all of the info gets entered into the database correctly, the only problem is the file not uploading. I'm going mad trying to get this to work! please help!
HTML FORM:
<p>
<h2>Add News</h2><br />
REQUIRED *<br /><br />
<form enctype="multipart/form-data" action='addnews2.php' method='post' onsubmit="chose.value = uploadForm()" name="newsform">
<p>Headline: *
<br>
<input name="title" type="text" size="75">
<br />
<br/>
News: *<br>
<textarea name="text" cols="75" rows="10" width="200"></textarea><br /><br />
Image File:
<br>
<input type="file" name="filetoupload" id="filetoupload"><br/><br />
<input type="submit" name="choose" value="Submit" />
</p>
</form>
</p>
Processing Page:
$date=date("l F d, Y");
$title=stripslashes($_POST['title']);
$text=stripslashes($_POST['text']);
if (($_FILES["filetoupload"]["type"] == "image/gif")
|| ($_FILES["filetoupload"]["type"] == "image/jpeg")
|| ($_FILES["filetoupload"]["type"] == "image/pjpeg")
|| ($_FILES["filetoupload"]["type"] == "image/png")
|| ($_FILES["filetoupload"]["type"] == "image/jpg"))
{
if ($_FILES["filetoupload"]["error"] > 0)
{
echo "Return Code: " . $_FILES["filetoupload"]["error"] . "<br />";
}
else
{
if (file_exists("images/news/" . $_FILES["filetoupload"]["name"]))
{
echo $_FILES["filetoupload"]["name"] . " already exists. ";
}
move_uploaded_file($_FILES["filetoupload"]["tmp_name"],
"images/news/" . $_FILES["filetoupload"]["name"]);
}
}
$image = "images/news/".$_FILES['filetoupload']['name'];
if($title==""||$text==""){
die("You need to fill in all details");
}
connect_to_db();
$query="insert into news (date, title, text, image) values ('".$date."','".mysql_real_escape_string($title)."','".mysql_real_escape_string($text)."','".$image."')";
$result=mysql_query($query);
if(mysql_affected_rows()==1){
header("Location:index.php?page=Admin&news=added");
}
else{
die("there was a problem");
}
mysql_close();
Looks like you are missing an else statement possibly, the code formatting is off and causes confusion:
if (file_exists("images/news/" . $_FILES["filetoupload"]["name"]))
{
echo $_FILES["filetoupload"]["name"] . " already exists. ";
}else {
move_uploaded_file($_FILES["filetoupload"]["tmp_name"],
"images/news/" . $_FILES["filetoupload"]["name"]);
}
Give that a shot. If not that, check your permissions etc. And make sure that the file isn't being uploaded, just not in the spot you expected it to be.
Just a bit of information, I would do the $title and $text check before you do the image check. As you probably do not want to upload the image to the site if both of those are null. You should also escape the file name in the image path prior to inserting:
$image = "images/news/".mysql_real_escape_string($_FILES['filetoupload']['name']);
As that could also be prone to injection.

Categories