I've put together the following script which allows users to view their uploaded images in the original folder structure that they were saved.
UPDATED CODE
<?php session_start();
$_SESSION['username']=$_POST['username'];
$_SESSION['locationid']=$_POST['locationid'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<?php
//This variable specifies relative path to the folder, where the gallery with uploaded files is located.
$galleryPath = 'UploadedFiles/' . $_SESSION['username'] . '/' . $_SESSION['locationid'] . '/';
//let's DEBUG the above assignment
if (!is_dir($galleryPath)) { die("No folder exists at $galleryPath!"); }
$absGalleryPath = realpath($galleryPath);
//let's DEBUG this one too
if (!is_dir($absGalleryPath)) { die("No folder exists at $absGalleryPath!"); }
$descriptions = new DOMDocument('1.0');
// DEBUG: let's check for the XML while we're at it
//if (!file_exists($absGalleryPath.'files.xml')) { die("No XML found at $absGalleryPath"."files.xml"); }
$descriptions->load($absGalleryPath . '/' . 'files.xml');
$items = array();
for ($i = 0; $i < $descriptions->documentElement->childNodes->length; $i++) {
$xmlFile = $descriptions->documentElement->childNodes->item($i);
$path = $xmlFile->getAttribute('name');
$path = explode('/', $path);
$t = &$items;
for ($j = 0; $j < count($path); $j++) {
if (empty($t[$path[$j]])) {
$t[$path[$j]] = array();
}
$t = &$t[$path[$j]];
}
$t['/src/'] = $xmlFile->getAttribute('source');
$t['description'] = $xmlFile->getAttribute('description');
$t['size'] = $xmlFile->getAttribute('size');
}
$basePath = empty($_GET['path']) ? '' : $_GET['path'];
if ($basePath) {
$basePath = explode('/', $basePath);
for ($j = 0; $j < count($basePath); $j++) {
$items = &$items[$basePath[$j]];
}
}
$files = array();
$dirs = array();
function urlpartencode(&$item, $index) {
$item = rawurlencode($item);
}
foreach ($items as $key => $value) {
if (isset($value['/src/'])) {
$value['/src/'] = explode('/', $value['/src/']);
array_walk($value['/src/'], 'urlpartencode');
$value['/src/'] = implode('/', $value['/src/']);
$files[] = array(
'name' => $key,
'src' => $value['/src/'],
'description' => htmlentities($value['description'], ENT_COMPAT, 'UTF-8'),
'size' => htmlentities($value['size'], ENT_COMPAT, 'UTF-8')
);
} else {
$dirs[] = $key;
}
}
$basePath = empty($_GET['path']) ? '' : $_GET['path'];
$up = dirname($basePath);
if ($up == '.') {
$up = '';
}
sort($files);
sort($dirs);
?>
<head>
<title>View Image Folders</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="Styles/style.css" rel="stylesheet" type="text/css" />
<script src="Libraries/jquery/jquery-1.4.3.min.js" type="text/javascript"></script>
<style type="text/css">
<!--
.style1 {
font-size: 14px;
margin-top: 5px;
margin-right: -50px;
}
-->
</style>
<body style="font-family: Calibri; color: #505050; margin-right: 160px; margin-left: -180px;">
<div align="right" class="style1"> <a href = "index.php" /> Add Images <a/> → <a href = "javascript:document.imagefolders.submit()"> View All Images </a> </div>
<form id="imagefolders" name="imagefolders" class="page" action="gallery.php" method="post" enctype="application/x-www-form-urlencoded">
<div id="container">
</div>
<div id="center">
<div class="aB">
<div class="aB-B">
<?php if ('Uploaded files' != $current['title']) :?>
<?php endif;?>
<div class="demo">
<input name="username" type="hidden" id="username" value="IRHM73" />
<input name="locationid" type="hidden" id="locationid" value="1" />
<div class="inner">
<div class="container">
<div class="gallery">
<table class="gallery-link-table" cellpadding="0" cellspacing="0">
<thead>
<tr class="head">
<th class="col-name">
Name
</th>
<th class="col-size">
Size
</th>
<th class="col-description">
Description
</th>
</tr>
</thead>
<tbody>
<tr class="directory odd">
<td class="col-name">
<a href="?path=<?php echo rawurlencode($up); ?>">..</a>
</td>
<td class="col-size">
</td>
<td class="col-description">
</td>
</tr>
<?php $i = 1; ?>
<?php foreach ($dirs as $dir) : ?>
<tr class="directory <?php $i++; echo ($i % 2 == 0 ? 'even' : 'odd'); ?>">
<td><a href="?path=<?php echo rawurlencode(($basePath ? $basePath . '/' : '') . $dir); ?>"><?php echo htmlentities($dir, ENT_COMPAT, 'UTF-8'); ?></a></td>
<td>Folder</td>
<td></td>
</tr>
<?php endforeach; ?>
<?php foreach ($files as $file) : ?>
<tr class="<?php $i++; echo ($i % 2 == 0 ? 'even' : 'odd'); ?>">
<td><a target="_blank" href="<?php echo $galleryPath . $file['src']; ?>"><?php echo htmlentities($file['name'], ENT_COMPAT, 'UTF-8'); ?></a></td>
<td><?php echo htmlentities($file['size'], ENT_COMPAT, 'UTF-8'); ?></td>
<td><?php echo htmlentities($file['description'], ENT_COMPAT, 'UTF-8'); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
</body>
</html>
I can correctly show the folders, but when I click on the folder to drill down to the individual images I receive the following error:
Warning: DOMDocument::load() [domdocument.load]: I/O warning : failed to load external entity "/homepages/2/d333603417/htdocs/development/UploadedFiles/files.xml" in /homepages/2/d333603417/htdocs/development/imagefolders.php on line 25 Warning: Invalid argument supplied for foreach() in /homepages/2/d333603417/htdocs/development/imagefolders.php on line 65
Line 25 is this line $descriptions->load($absGalleryPath . '/' . 'files.xml'); and line 65 is this:
foreach ($items as $key => $value) {`
My initial script didn't use session variables and I didn't have any issues. However I now need to include these, so I'm sure that there is a conflict between these and the foreach
command. I've done quite a bit of research to see if anyone else has had similar issues, but can't find anything.
I just wondered whether someone could look at this and let me know where I'm gong wrong.
Many thanks and regards
Warning: DOMDocument::load() [domdocument.load]: I/O warning : failed to load external entity "/homepages/2/d333603417/htdocs/development/UploadedFiles/files.xml"
The Origin of the Problem is $descriptions->load($absGalleryPath . '/' . 'files.xml');
It is bad practice trying to load file you are not sure it exists or is readable
Something like this is better and make sure you catch exception
$file = $absGalleryPath . '/' . 'files.xml' ;
if(!is_readable($file) || !file_exists($file))
{
throw new Exception("Missing XML File");
}
Warning: Invalid argument supplied for foreach() in /homepages/2/d333603417/htdocs/development/imagefolders.php on line 65
A. Since you are not able to load the first xml
document ... trying to continue the process would result to this error
B. foreach ($items as $key => $value) {
so it would run independently where it is populated or not
C. Too many Referencing would make your code more difficult to understand and debug ...
I think you should post the content of files.xml
you would be surprised it innovative solutions and ore effective code people would come up with
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With