PHP: file missing after upload - php

After an upload, the print_r output for the image field is as follows
Array
(
[name] => foo.png
[type] => image/png
[tmp_name] => /tmp/php63EvNo
[error] => 0
[size] => 19115
)
Since the error is zero, and the filesize is non-zero I assume that the upload is successful.
A subsequent call to move uploaded file fails: move_uploaded_file(...): failed to open stream: Permission denied
Upon inspecting /tmp, the file named in tmp_name is not there.
What causes this behaviour/ how to rectify?
Thanks!
Extra info:
LAMP stack, running PHP5, CakePHP 2.0
The form:
php/ cake code:
echo $form->input('Foo.image', array('type' => 'file'));
html that is rendered:
<input type="file" name="data[Foo][image]" id="FooImage"/>

The temporary uploaded files in /tmp are deleted at the end of the request -- they are not kept around long-term. You have to use move_uploaded_file during the request that received an upload if you care about the file.

Most likely a permissions issue. Also consider using the cakePHP folder variables. The upload component I have looks like this:
$file = $this->request->data['Client']['image'];
$filename = $file['tmp_name'];
$filePath = WWW_ROOT . DS . 'files' . DS . $file['name'];
if(move_uploaded_file($filename, $filePath))
return '/files/'.$file['name']; // saves location of uploaded file

Related

Uploaded file's tmp_name does not exist

I've been wrangling my brain for the last day trying to fix this.
Basically, the temp file set in $_FILES['logo']['tmp_name'] does not exist.
The file is apparently getting uploaded, as shown in the below print_r() of $_FILES:
Array
(
[logo] => Array
(
[name] => Channelcat.jpg
[type] => image/jpeg
[tmp_name] => /tmp/php26YfhY
[error] => 0
[size] => 152142
)
)
The file permissions on my /tmp directory are apparently 777. I suspect that this problem may have to do with the shared hosting it's using though.
And below is basically what I'm trying to do with the file.
$logo = $_FILES['logo'];
if($logo['size'] > (1024000)) {
die('File size is too large.');
}
$path = __DIR__ . '/uploads/'. $logo['name'];
move_uploaded_file($logo['tmp_name'], $path);
I've tried using is_uploaded_file($logo['tmp_name']), which returns false and realpath($logo['tmp_name']) which returns an empty string.
move_uploaded_file doesn't error, but doesn't move the file to the specified directory either.
When you have set some open_basedir variable in the php.ini file, the file upload works, the $_FILE array gets populated and even shows the tmp_name subkey, still files are not written to disk, which results in a puzzling situation, as no further errors are reported being the error subkey set to 0.
Solution is to set the temp folder to some subfolder inside the open_basedir php.ini variable.

"move_uploaded_file" function not working in SugarCRM logic hook

I am trying to move uploaded files to new location using SugarCRM's logic hook either after_save or before_save. But I am unable to do so. Kindly find my logic hook code:
class attachment
{
public function attachment(&$bean, $event, $arguments)
{
if(!empty($bean->filename_new))
{
$upload_dir = $GLOBALS['sugar_config']['upload_dir'];
$target_file = $upload_dir . basename($_FILES["filename_new_file"]["name"]);
if (move_uploaded_file($_FILES["filename_new_file"]["tmp_name"], $target_file))
{
$GLOBALS['log']->fatal("The file has been uploaded");
}
else
{
$GLOBALS['log']->fatal("Sorry, there was an error uploading your file.");
}
}
}
}
Here, when I print $_FILES, I am getting desired output:
Array
(
[name] => twitter.png
[type] => image/png
[tmp_name] => /tmp/php5wBmgK
[error] => 0
[size] => 203
)
Now I have seen many posts, where they mentioned solution for this is to make sure the correct file permission and file ownership. I tried that, but didn't work out.
Lastly, to remove the possibility of issue with file permission or file ownership, I made one file upload script and run that script outside of CRM and that time move_uploaded_file function worked as it should.
But when I try to achieve the same with the use of logic hook, I am unable to get desired output. Kindly guide me here.
If you are using UNIX please check Permission also.
Check this file Rootapp/include/upload_file.php you will get different function related to file .I use this to copy file.
And you want to change location of file where file saving then ,
If you look at your config.php file, you will see a line that looks like this.
'upload_dir' => 'upload/',
to copy a file i did like this,
$bean->file_mime_type = $result->file_mime_type;
$bean->filename = $result->filename;
require_once('include/upload_file.php');
$uploadFile = new UploadFile();
$upoad_atachment =
$uploadFile->duplicate_file($result->id, $bean->id)
IN logic hook after save when i get email with attachment i copy that attachment and insert that files into my custom module.
Every image have some id , the image name uploaded with that id, so find that id , for email that attachment information save into notes module, In your case you find in your module. then get that information in your result and copy that in other module.

How to upload a file to public html folder to the server and save the path to mysql database?

I want to upload my file into public html folder using php code at the time of uploading i want to insert the file path,size,mime type like this. Please any one give me proper solution because totally I wasted nearly one day for this
Thanks in Advance
If your upload field is named file, you can get all the informations from the $_FILES array:
Array
(
[file] => Array
(
[name] => MyFile.txt
[type] => text/plain
[tmp_name] => /tmp/php/php1h4j1o
[error] => UPLOAD_ERR_OK
[size] => 123
)
)
For the path, you set it yourself with move_uploaded_file:
$path = '/files/MyFile.txt';
move_uploaded_file($_FILE['file']['tmp_name'], $path);
Destination dir must be writable and you should check the return value of move_uploaded_files.

PHP File Upload - Can't Upload / Debug

I'm trying to upload a file but i doesnt work:
Usefull Info: Running IIS Express (with PHP 5.3) - Windows 7 Professional 32 Bits
Code:
move_uploaded_file($_FILES["imagem"]["name"], "/images/" . $_FILES["imagem"]["name"]) or die ("Error:".print_r($_FILES));
It Prints: Array ( [imagem] => Array ( [name] => Chrysanthemum.jpg [type] => image/jpeg [tmp_name] => C:\Windows\Temp\php3D85.tmp [error] => 0 [size] => 879394 ) )
I'm sure the path is correct and i also did chmod() to set permissions but still, doesn't upload.
Any sugestions?
Your destination path should start with a proper path to the images directory (dirname(__FILE__) can help). As it stands, "/images/" . $_FILES["imagem"]["name"] means it'll try to write to C:/images/ (assuming the script is in the C: drive) which probably doesn't exist.
Since its is inside of an array you need to execute the move uploaded file function inside of foreach loop.
foreach($_FILES['imagem'] as $f){
move_uploaded_file($f['tmp_name'], "/images/" . $f["name"]);
}
You might wanna try using my class:
http://code.google.com/p/daves-upload-class/source/browse/upload_class.php

PHP Uploading issue Getting Error 0 but move_uploaded_file() is returning false

PHP Uploading issue Getting Error 0 but move_uploaded_file() is returning false. When I print out $_FILES I get
Array ( [uploadedfile] => Array ( [name] => flashlog.txt [type] =>
text/plain [tmp_name] => /tmp/php0XYQgd [error] => 0 [size] => 3334 ) )
I'm using a basic html/php tutorial which leaves me to believe that it might be a server issue. I check the php.ini and have upload_max_filesize:2M, post_max_size:8M. So I'm really confused as I thought error of 0 told me that it was successful.
The code I'm using is
<?php
// Where the file is going to be placed
$target_path = 'Test/';
$target_path = $target_path. basename( $_FILES['uploadedfile']['name']);
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path))
{
echo "The file ". basename( $_FILES['uploadedfile']['name']).
" has been uploaded";
}
else
{
echo "There was an error uploading the file, please try again!";
echo print_r($_FILES);
}
?>
move_uploaded_file() will also return false if it can't write to the target directory.
Most PHP code I see to handle uploads skips checking some major piece of the process. Upload code should do the following steps:
Check that $_FILES[] exists and the correct entry is populated.
Look in the error field to see if it got to the server at all -- a lot of code just checks that it's 0, which means it can't return any decent error to the user.
Be certain the destination where you need to move the file actually exists.
Call move_uploaded_file() to do the move - too many just do a file copy, which bypasses the security checks that move_uploaded_file() does.
These are discrete steps: as you seem to be seeing, the actual upload can succeed, yet move_uploaded_file() can fail. Your question assumes that if the latter failed, so did the former.
Oh yes: call move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $destination). Using $_FILES['uploadedfile']['name'] won't work.
I got same error in my project there is not any fault in your code but there is issue in file name like i can't upload image named ("IMAG0889.jpg", "IMAG0892.jpg", "IMAG0893.jpg" etc) it gave me error 0. after rename file like("Deep2.jpg", "IMG_20160925_093715_1.jpg") I successfully uploaded my image file. So try to upload file after rename it.
Change this line ----
$target_path = $target_path. basename( $_FILES['uploadedfile']['name']);
With these ----
$target_path = $_SERVER["DOCUMENT_ROOT"].'/folder_name/'. $_FILES['uploadedfile']['name']);
This works for me.

Categories