Php reading files from directory - php

I have this code which reads files from directory:
//directory to read
$dir = ($_REQUEST['dir']);
if(file_exists($dir)==false){
echo 'Directory \'', $dir, '\' not found!';
}else if( !is_readable($dir) ) {
echo 'Directory \'', $dir, '\' is not readable! Check your permissions.';
}else{
$di = new RecursiveDirectoryIterator($dir);
foreach (new RecursiveIteratorIterator($di) as $filename => $file) {
$file_type = explode(".", $filename);
$extension = strtolower(array_pop($file_type));
if(in_array($extension, $allowed_files) == true){
$mediaArr[] = $filename;
}
}
echo json_encode($mediaArr);
}
If I enter path as this:
http://www.mydomain.com/some_folder/
I get an error "Directory http://www.mydomain.com/some_folder/ not found"
Why is this?

The PHP file system functions work with file system paths. There are different protocol wrappers you can use with the file system functions, but I don't see how they would be of any help here.
Just use the file system paths.

Related

move_uploaded_file() in php returns true but file not found inside the directory

Please i need help on this.
I was uploading an image to my server using the move_uploaded_file() method, the method returns true bu the uploaded file was not found inside the specified directory on my server. i have checked thoroughly, searched for the file on the server in case it was uploaded to another directory, checked the permission on the directory but all seems perfect. i really dont know what went wrong .
Here is the snippet of the code.
$uploaddir = './upload_dir/';
$allowed = array('gif', 'png', 'jpg','bmp');
$filename = $_FILES['uploadfile']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$data = array();
if (!in_array($ext, $allowed)) {
$data['status'] = 'error';
$data['error_message'] = 'Invalid file type';
}
else{
$file_name = time() . '_' . uniqid() . '_' . basename($_FILES['uploadfile']['name']);
$file_name = preg_replace('/[^a-z0-9_\.\-]+/i', '_', $file_name);
$file = $uploaddir . $file_name;
if (isset($_FILES['uploadfile']['tmp_name']) && move_uploaded_file($_FILES['uploadfile']['tmp_name'], $file)) {
$data['status'] = 'success';
$data['file_name'] = $file_name;
} else {
$data['status'] = 'error';
}
echo json_encode($data);
}
Thanks in advance.
Please use is_uploaded_file($_FILES['uploadfile']['tmp_name']) instead of isset($_FILES['uploadfile']['tmp_name']) for security reason check here
And for the upload dir use $uploaddir = $_SERVER['DOCUMENT_ROOT'] . "/upload_dir/"; instead of $uploaddir = './upload_dir/'; to get absolute path instead of relative one.
thanks everyone. I gave the wrong permission to the folder. that seems to be the problem for my own case.

move_uploaded_file(): Unable to move

$targetFolder = '/LP/media/image'; // Relative to the root
if (!empty($_FILES)) {
$tmpName = $_FILES['Filedata']['tmp_name'];
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
//$ext = end(explode('.', $_FILES['Filedata']['name']));
$targetFile = rtrim($targetPath, '/') . '/' . $_FILES['Filedata']['name'];
// Validate the file type
echo $targetFile;
$fileParts = pathinfo($_FILES['Filedata']['name']);
$fileTypes = array('jpg', 'jpeg', 'png','JPG','JPEG','PNG'); // File extensions
if (in_array($fileParts['extension'], $fileTypes)) {
move_uploaded_file($tmpName, $targetFile);
//echo '1'.$fileParts['filename'];
// echo $fileParts['filename'];
$aimage = file_get_contents($tmpName);
// echo '<img src="data:image/jpeg;base64,' . base64_encode($aimage) . '" width=\'100\' height=\'100\' />';
} else {
echo 'Invalid file type.';
}
}
?>
Same code is working on my local machine, but deployed on remote server. Then getting below error.
/home/username/public_html/LP/media/image/default_avatar.png
Warning: move_uploaded_file(/home/username/public_html/LP/media/image/default_avatar.png): failed to open stream: No such file or directory in /home/username/public_html/uploadify/gallery.php on line 28
Warning: move_uploaded_file(): Unable to move '/tmp/phpoe0fBd' to '/home/username/public_html/LP/media/image/default_avatar.png' in /home/username/public_html/uploadify/gallery.php on line 28
The code you provide isn't very clear to tell the source of the problem, so I will provide you with a full snippet where you can take better conclusions.
In this case, I sent an array from JavaScript to my PHP file using a formdata under the name "documents". I also modify the name of the file so it becomes: "filename_optional_$i(int)".
for($i=0; $i<count($_FILES['documents']['name']); $i++){
list($dump, $extention) = explode(".", (string)$_FILES['documents']['name'][$i]);
$document_name = $file_name.'_optionnel'.$i;
if(($_FILES['documents']['size'][$i] < 500000)){
if ($_FILES['documents']["error"][$i] > 0){
echo 'Erreur.';
}else{
if(file_exists( $directory_path . $document_name . "." . $extention)) {
echo 'Le fichier existe déjà.';
}else{
$sourcePath = $_FILES['documents']['tmp_name'][$i];
$targetPath = $directory_path . $file_name ."/". $document_name . "." . $extention;
array_push($attachments, $targetPath);
move_uploaded_file($sourcePath, $targetPath);
}
}
}else{
echo 'Le fichier est trop grand.';
}
}
Make sure your path variables are pointing to the correct folder. Say, for instance, if you want your file to go to the foldier images, you have to do:
path_to_folder/images/ and not path_to_folder/images
EDIT:
Here's how your filename and directory path variables should look like:
/*$nom, $prenom and $user_id come from database values*/
$file_name = $nom."_".$prenom."_".$user_id;
$directory_path = dirname( __FILE__ ) . '/user_docs/';
/* Create mask */
$oldmask = umask(0);
/* Create the folder for user */
$directory = mkdir($directory_path.$file_name, 0777);
/* redo the mask */
umask($oldmask);
I'm quite new to this site, but the least I can do for you is offer you this code I've done to help you out. I've written some comments to guide you through.
Full code source for upload
I have this little function (not the best) but it "works" in my case the uploaded files must be moved or they get deleted, so I move them to a folder next to my PHP file and echo a link to it (you can them move it any where else, rename it or whatever:
function save_file() {
$gs_name = $_FILES['uploaded_files']['tmp_name'];
if(is_readable($gs_name) && $_FILES['uploaded_files']['error'] == 0) { //Tells whether a file exists and is readable. no error during upload (0)
move_uploaded_file($gs_name, 'upload/'.$_FILES['uploaded_files']['name']);
echo "saved.<a href='upload/".$_FILES['uploaded_files']['name']."' target='_blank'/>".$_FILES['uploaded_files']['name']."</a><br/>";
echo "<p><a href='upload/' target='_self'>Uploaded files.</a></p>";
echo "<p><a href='upload_file.php' target='_self'>Continue...</a></p>";
}
}
The important part about it is this if:
if(is_readable($gs_name) && $_FILES['uploaded_files']['error'] == 0)
it allow it to check if the file can be copied and if there were no errors that could leave the file damage... I point at this because the path seems to be ok, other already mention the file and folder permissions.
Try the following code. It should be easy to identify the error:
<?php
$upload_dir = $_SERVER['DOCUMENT_ROOT'] . '/LP/media/image';
if (isset($_FILES['Filedata'])) {
$file = $_FILES['Filedata'];
if ($file['error'] !== UPLOAD_ERR_OK) {
echo 'error: ', $file['error'], PHP_EOL;
exit;
}
$allowed = array('jpg', 'jpeg', 'png');
$extension = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (!in_array($extension, $allowed)) {
echo 'error: invalid file extension', PHP_EOL;
exit;
}
$target = $upload_dir . '/' . basename($file['name']);
if (!move_uploaded_file($file['tmp_name'], $target)) {
echo 'error: move_uploaded_file failed', PHP_EOL;
print_r(error_get_last());
exit;
}
echo 'success', PHP_EOL;
echo $target, PHP_EOL;
}
whom still have this problem after tried all solutions suggested here.. they have to try this small thing is to respect the letter sensitive case of the name of folders.. folder "Upload" <> "upload".. thx

PHP file not uploading to localhost

I've set up an XAMPP server and trying to upload image files using a custom admin page. The page works fine when I set it up on a online server running ubuntu.
But when trying the same script in localhost gives me the following error.
Warning : move_upload_file(../img/products/fw000001.jpg) : failed to open stream. No such file or directory in C:\xampp\htdocs\OBS\store\kish\bin\functions.php on line 64
Here is the file upload part of functions.php
function upload_image($image,$code)
{
define("UPLOAD_DIR", "../img/products/");
if (!empty($image)) {
$myFile = $image;
if ($myFile["error"] !== UPLOAD_ERR_OK) {
return null;
}
//check if the file is an image
$fileType = exif_imagetype($_FILES["image"]["tmp_name"]);
$allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
if (!in_array($fileType, $allowed)) {
exit();
}
// ensure a safe filename
$name = $myFile["name"];
$parts = pathinfo($name);
$extension = $parts["extension"];
$savename = $code . "." . $extension;
// don't overwrite an existing file
$i = 0;
if(file_exists(UPLOAD_DIR . $savename)) {
unlink(UPLOAD_DIR . $savename);
}
// preserve file from temporary directory
$success = move_uploaded_file($myFile["tmp_name"],
UPLOAD_DIR . $savename);
if (!$success) {
exit();
}
else
{
return $savename;
}
// set proper permissions on the new file
chmod(UPLOAD_DIR . $name, 0644);
}
}
I'm not pretty sure about directory separator. Directory separator is represent with (/) on Linux based OS. Widows is using ( \ ) for directory separator. So, please change this line and tested it.
define("UPLOAD_DIR", "../img/products/");
to
define("UPLOAD_DIR", "..".DIRECTORY_SEPARATOR."img".DIRECTORY_SEPARATOR."products".DIRECTORY_SEPARATOR.");
Change this line
// preserve file from temporary directory
$success = move_uploaded_file($_FILES["image"]["tmp_name"],UPLOAD_DIR . $savename);

PHP rename folder in directory

How can i get $filename to be one specific path? Not a specific folder?
I want to rename several folders in folder named output.
I tried this:
$fileName = '/path/folder/output';
Here is my original code:
<?php
$fileName = '351437-367628';
$newNametemp = explode("-",$fileName);
if(is_array($newNametemp)){
$newName = $newNametemp[0];
print_r($newName); // lar navnet stå att etter første bindestrek
rename($fileName, $newName);
}
?>
$file_path = "uploads/";
$input = $_POST['name_of _the_folder_You WIsh']; // this is the new folder you'll create
$file_path .= $input . '/';
if (!file_exists($file_path)) {
mkdir($file_path);
}
chmod($file_path, 0777);
$file_path = $file_path . basename( $_FILES['uploaded_file']['name']);
if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) {
echo "success";
} else{
echo "fail";
}
Here is a sample script that does (I think) what you're looking for. It loops through a directory, renaming all subdirectories.
Save code to demo.php, and chmod +x demo.php && ./demo.php.
If you'd prefer an object-oriented approach, or need any changes let me know and I'll modify the code.
#!/usr/bin/php
<?php
//root directory
$outputDir = '/path/folder/output';
//get all subdirectories in the root directory
$dirs = scandir($outputDir);
if ($dirs === FALSE) {
echo "scandir() failed.\n";
exit(1);
}
//loop through each subdirectory and rename.
foreach($dirs as $dir) {
$newName = "${dir}.tmp"; //rename as needed; here we append ".tmp" to the subdirectory.
$success = rename($dir, $newName);
if (!$success)
echo "Rename of $dir failed.\n"; //there was an error during rename, handle it.
}

PHP zip does not work

I made a drupal module, one of function of the module is to compress some files to be a zip package. It works fine in my local environment(xampp), but fails on server. My server does has php zip extension enabled, since I can see zip information on php info and I can unzip file with php as well.
Besides, I already chmod files to be 0777 .
My code:
$folder = file_directory_path();
$zip = new ZipArchive();
if ($zip->open('b.zip', ZIPARCHIVE::CREATE) === TRUE) {
foreach ( $files as $file ) {
drupal_set_message(t($file)); // I can see the the message on this stpe
$zip->addFile($file);
}
$zip->close();
if (file_exists('b.zip')) {
copy('b.zip', $folder . '/b.zip');
unlink('b.zip');
global $base_url;
variable_set('zippath', $base_url . $folder . '/b.zip');
drupal_set_message(t('new zip package has been created'));
}
} else {
drupal_set_message(t('new zip package failed'));
}
Yes .. i know what you mean .. this are the 3 possibility
You have write permissions
You Did not use full path
You are including folders as file
You can try this
error_reporting(E_ALL);
ini_set("display_errors", "On");
$fullPath = __DIR__ ; // <-------- Full Path to directory
$fileZip = __DIR__ . "/b.zip"; // <--- Full path to zip
if(!is_writable($fullPath))
{
trigger_error("You can't Write here");
}
$files = scandir($fullPath); // <--- Just to emulate your files
touch($fileZip); // <----------------- Try Creating the file temopary
$zip = new ZipArchive();
if ($zip->open($fileZip, ZIPARCHIVE::CREATE) === TRUE) {
foreach ( $files as $file ) {
if ($file == "." || $file == "..")
continue;
$fileFull = $fullPath . "/$file";
if (is_file($fileFull)) { // <-------------- Make Sure its a file
$zip->addFile($fileFull, $file);
}
// Play your ball
}
$zip->close();
} else {
echo "Failed";
}
I would recommend you to use rar or zip command to make zip. I am using linux and doing in my php system as
$folder = 'your_folder'; // folder contains files to be archived
$zipFileName = 'Your_file_name'; // zip file name
$command = 'rar a -r ' . $zipFileName . ' ' . $folder . '/';
exec($command);
Its very quick. but you need to install rar package in your system.
Thanks

Categories