5

ユーザーがアップロードされた画像を、保存された元のフォルダー構造で表示できるようにする次のスクリプトをまとめました。

更新されたコード

        <?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/> &rarr; <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>

フォルダーを正しく表示できますが、フォルダーをクリックして個々の画像にドリルダウンすると、次のエラーが表示されます。

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

25行目はこの行$descriptions->load($absGalleryPath . '/' . 'files.xml'); and line 65 is this:foreach ($items as $key => $value) {`

私の最初のスクリプトはセッション変数を使用していなかったので、何の問題もありませんでした。ただし、これらを含める必要があるため、これらとforeachコマンドの間に競合があると確信しています。他の誰かが同様の問題を抱えているかどうかを確認するためにかなりの調査を行いましたが、何も見つかりません。

誰かがこれを見て、どこが間違っているのか教えてくれるかどうか疑問に思いました.

多くの感謝と敬意

4

3 に答える 3

2

エラー 1

Warning: DOMDocument::load() [domdocument.load]: I/O warning : failed to load external entity "/homepages/2/d333603417/htdocs/development/UploadedFiles/files.xml"

問題の原因は$descriptions->load($absGalleryPath . '/' . 'files.xml');

ファイルが存在するか、読み取り可能かどうかわからないファイルを読み込もうとするのは悪い習慣です

このようなものの方が優れており、必ず例外をキャッチしてください

$file = $absGalleryPath . '/' . 'files.xml' ;
if(!is_readable($file) || !file_exists($file))
{
 throw new Exception("Missing XML File");
}

エラー 2

Warning: Invalid argument supplied for foreach() in /homepages/2/d333603417/htdocs/development/imagefolders.php on line 65

A. 最初のドキュメントを読み込めないためxml、処理を続行しようとすると、このエラーが発生します

B.foreach ($items as $key => $value) {実装されているかどうかに関係なく、独立して実行されるようにするため

C.参照が多すぎると、コードの理解とデバッグが難しくなります...

結論

files.xml 革新的なソリューションや人々が思いつく効果的なコードに驚かれるコンテンツを投稿する必要があると思います

于 2012-04-25T01:53:41.077 に答える
0
  1. var_dumpforeachループは、適切なデータを取得していません。取得するデータをチェックするために..plsを使用します。
  2. あなたのパスをチェックしてくださいXML
于 2012-04-26T03:27:31.757 に答える
0

Invalid argument supplied for foreach()はあなたについてだと思いますforeach ($items as $key => $value)。したがって、その foreach の前に配置して、変数var_dump($items);の完全なダンプを表示します。items配列でさえないようです。

于 2012-04-19T11:23:44.347 に答える