将文件夹中的图像加载到 HTML 页面,以便在添加到文件夹时自动显示在 gallery/album 中

Load images from folder into HTML page for display in gallery/album automatically as they are added to folder

我最近发现并购买了一个漂亮的 HTML5 Ajax 模板,它在页面的主要内容部分包含一个图库部分,如下所示:

<!-- Main Content -->
<div class="ajax-inserted-content">

    <!-- Section Gallery -->
    <section class="section gallery grid layout-4-col">

        <div class="container">
            <div class="row">

                <!-- Gallery Item -->
                <div class="col-3 col-lg-4 col-md-6 col-sm-12">

                    <div class="gallery-item">
                        <div class="gallery-img">
                            <img data-lazy-image
                                 src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzIDIiPjwvc3ZnPg=="
                                 data-src="img/demo-img-2.jpg" alt="Demo img">
                        </div>
                    </div>

                </div>
                <!-- /Gallery Item -->

现在,我可以通过 copy/pasting“图库项目”部分和添加图片 src 等方式将图片手动添加到图库和 HTML 文件中,但我有整个文件夹充满图像(都是 .jpg,但标题不同)所以这不是一个选项。

大约十年前,我有一个 Flash 网站,它有一个画廊,该画廊是从文件夹中填充的——据我所知——一个 XML/PHP 组合。无需编辑实际的 HTML 文档。我希望这个现代摄影模板有一个(简单的)PHP/XML 选项,但是唉。模板的开发者也帮不了我,所以如果我不能自动填充画廊和相册,我现在只能使用一个漂亮但无用的模板。

因此我的问题如下:

  1. 是否有可自定义的工具(如插件?)可以为我自动执行此操作,我可以安装服务器端,这样我就有一个所见即所得的选项来上传图像(拖放、从文件夹上传等)并指向到需要显示图像的 HTML page/code/gallery 部分?
  2. 如果选项 1 不可用,那么是否有 ready-made XML/JSON/PHP 脚本可以在任何地方使用,只需最少的自定义编码(可能只需要上传图像)文件并编辑 XML 文件以使图像正确显示在 HTML 图库页面中)?
  3. 如果选项 1 和 2 不可行,是否有人对此问题有解决方案?

我知道有很多选择,并且发现了各种 simple-looking (PHP/JS) 脚本和代码声称可以做到这一点,但它们都涉及创建一个简单的 HTML 页面和画廊从头开始。我不知道如何自定义所有代码以与我的 HTML/CSS/JS 网站一起使用...

所以我非常希望你的建议能给我一个 budget-friendly 解决方案,否则我将不得不给我买一个带有自动图库脚本的全新模板 built-in

PHP方式

scadir() 生成的 PHP 循环将使这非常容易。 https://www.php.net/manual/en/function.scandir.php

我假设 src="data:image/svg+xml;base64,PH... 是占位符,每张图片都相同

<div class="ajax-inserted-content">
  <!-- Section Gallery -->
  <section class="section gallery grid layout-4-col">
   <div class="container">
     <div class="row">
     <?php
        $imagesPath = '/imgportfolio/';
        // this is assuming your website has a folder at the document-root level called 'portfolio-images'.
        // document-root means where your top level index.html (or index.php) is.
        $dir = $_SERVER['DOCUMENT_ROOT'] .  $imagesPath; 
        $files = scandir($dir);
        $exts = ['png','jpg','jpeg','gif','bmp','webp'];
        foreach ($files as $file) {
          if ($file === '..' || $file === '.') continue;  
          $ext = explode(".", $file);
          $ext = strToLower($ext[count($ext)-1]);
          if (!in_array($ext, $exts)) continue; // if not a valid image file, skip 
     ?>
  <div class="col-3 col-lg-4 col-md-6 col-sm-12">
     <div class="gallery-item">
       <div class="gallery-img">
         <img data-svg="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzIDIiPjwvc3ZnPg==" src="<?php echo $imagesPath . $file;?>" alt="Demo img">

         <!-- <img data-lazy-image src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzIDIiPjwvc3ZnPg==" data-src="<?php echo $imagesPath . $file;?>" alt="Demo img"> -->
       </div>
     </div>
   </div>
        
    <?php }?>

此外,为了测试(如果您怀疑 PHP 错误),您可以将其放在页面顶部

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
?>

(我不想用)PHP方式

有一些实验性功能可以使用 javascript 读取文件系统。在大多数情况下,它们并没有被所有现代浏览器所接受(IE 根本不允许使用它们),并且它们引入的复杂性超出了您可能想要处理的范围。

但是,过去我曾使用此技巧来创建一个简单的投资组合。它要求您(重新)命名您的图像以可预测的数字顺序排列,例如

1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg, 6.jpg, 7.jpg, etc...

在您的情况下,实现将如下所示:

<div class="ajax-inserted-content">
    <section class="section gallery grid layout-4-col">
        <div class="container">
            <div class="row" id='gallery-items'>
            </div>
        </div>
    </section>
</div>
<script>
function doPortItem(n) {
    let img = document.createElement('img');
    img.src = './imgportfolio/' + n + '.jpg';
    img.addEventListener('load', () => {
        let div = `<div class="col-3 col-lg-4 col-md-6 col-sm-12">
     <div class="gallery-item">
       <div class="gallery-img">
         <img data-lazy-image data-src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzIDIiPjwvc3ZnPg==" src="${img.src}" alt="Demo img"> 
       </div>
     </div>
   </div>`;
        document.querySelector('#gallery-items').innerHTML += div;
        doPortItem(++n)
    })
}
doPortItem(1)
</script>

注意事项 - 文件必须以 1.jpg 开头并且必须是连续的。它循环遍历数字,直到找到不存在的 X.jpg,然后停止。此外,这会在与 .html 文件相同的目录中查找名为 imgportfolio 的文件夹。已经过测试并且有效!