【问题标题】:Get all filenames of files in local directory with Javascript使用Javascript获取本地目录中文件的所有文件名
【发布时间】:2019-12-07 14:35:59
【问题描述】:

我正在使用烧瓶在 Pi 上托管一个网站。 我有一个文件夹,我在其中不断添加 jpg 文件。 我希望能够检查文件夹中的文件而无需刷新页面。 在我使用 Javascript 显示文件的页面上,我想显示网站上的最新图像。 每个图像都有一个类似 Rxxxxyyyyzzzz 的文件名,其中 x 和 y 是包含有关图像的一些信息的数字。 zzzz 只是一个增量数字,我想用它来做这个。

我希望这不能用正则表达式来做,问题是获取目录中所有文件的所有名称,所以我可以搜索它。

我找到了应该为我做的这个 php:

var files = <?php $out = array();
foreach (glob('file/*.jpg') as $filename) {
    $p = pathinfo($filename);
    $out[] = $p['filename'];
}

echo json_encode($out); ?>;

在 Html 中,脚本的 src 应该是包含它的文件。因此:

<Script src="/templates/dir.php" language="javascript">
//Code here
</Script>

但是当我这样做时,我会收到此警告和错误:

来自“http://192.168.137.210:2000/static/dir.php”的脚本是 即使它的 MIME 类型(“application/octet-stream”)不是 有效的 JavaScript MIME 类型。

SyntaxError: 预期的表达式,得到 '

我真的不知道任何关于这件事的 javascript 或 php,所以任何帮助表示赞赏 ​

【问题讨论】:

  • 制作php文件并编写php代码并递归包含所有文件。 var files = &lt;?php $out = array(); foreach (glob('file/*.jpg') as $filename) { $p = pathinfo($filename); echo '&lt;Script src="'.$p['filename'].'" language="javascript"&gt;&lt;/Script&gt;' } ?&gt;;
  • 在您的dir.php 中,您可能希望在任何代码之前包含正确的标头。即:header('Content-Type: text/javascript');

标签: php html file flask


【解决方案1】:

&lt;Script src="/templates/dir.php" language="javascript"&gt;

您正在尝试在客户端执行 PHP 脚本。它行不通。 JS解释器遇到PHP开始标签时会抛出错误。

【讨论】:

    【解决方案2】:

    尝试使用 Ajax:

      $.ajax({
          url: "/templates/dir.php",
          type: "POST",
          success: function(output) {
              console.log(output);
          }
      });
    

    【讨论】:

    • 抱歉,我对此不太了解,但这不需要刷新页面吗?或者它可以签入一个javascript函数吗?
    • 不,您不必刷新页面。是的,您将此代码放在 javascript 函数中。
    • 如果你还没有这样做,你需要引入 jQuery。w3schools.com/jquery/default.asp
    • 我试过这个,但我没有得到任何输出。也没有错误,所以我不知道问题是什么。我尝试更改文件路径,但没有更改
    • Jup,好像 ajax 块内的所有内容都被跳过了。尝试在其中添加一些 console.logs,但它们都没有被记录
    【解决方案3】:

    有几种方法可以实现您的既定目标,我使用不同的方法创建了两个工作版本。以下使用AJAX 每隔几秒查询一次服务器,这可能是最简单的方法。任何长轮询 ajax 的问题在于它产生的流量,但在某些情况下,这不是问题。

    在问题中,您展示了如何尝试将 PHP 脚本作为外部文件包含在 Javascript 标记中。这是可能的,但您需要在 php 文件中指定 Content-Type 标头(如 text/javascript 或类似名称)。也就是说,PHP 运行一次,然后在调用任何客户端代码之前终止,因此所述 javascript(PHP) 文件的内容将是静态的 - 你将如何获取新文件信息??

    如果您使用 Ajax,则无需重新加载页面即可获取新文件信息 - 您可以安排 ajax 函数每 X 秒运行一次,并使用回调函数来操作 DOM 并显示图像。

    <?php
        if( $_SERVER['REQUEST_METHOD']=='POST' ){
            ob_clean();
    
            $path=explode( '/', $_SERVER['SCRIPT_NAME'] );
            array_pop( $path );     
    
    
            $dir=__DIR__ . '/images/tmp';   #   sub-directory of current working directory
            $path=implode( '/', $path );    #   suitable path for use in displaying images - root relative
    
    
            /* scan the directory for jpg, jpeg and png images */
            $col=preg_grep( '@(\.jpg|\.jpeg|\.png)@i', glob( $dir . '/*.*' ) );
    
    
            /* Most recent file - sort array by comparing file modification timestamps */
            usort( $col, function( $a, $b ){
                return filemtime( $a ) < filemtime( $b ) ? 1 : 0;
            });
    
    
            /* tweak the sorted array to create suitable image paths */
            array_walk( $col, function( &$item, $key ) use ( $path ){
                $item=str_replace( __DIR__, $path, $item );
            });     
    
    
            $payload=array(
                'latest'    =>  array_shift( $col ),
                'oldest'    =>  array_pop( $col )
            );
    
    
            exit( json_encode( $payload, JSON_UNESCAPED_SLASHES ) );
        }
    ?>
    <!DOCTYPE html>
    <html lang='en'>
        <head>
            <meta charset='utf-8' />
            <title>Directory monitor using ajax</title>
            <script>
    
                document.addEventListener('DOMContentLoaded',()=>{
                    const output=document.querySelector('output');
                    const image=document.querySelector('img');
                    const span=document.querySelector('span');
    
                    const loadimage=function( url ){
                        return new Promise( ( resolve, reject )=>{
                            let img=new Image();
                                img.onload=resolve( img );
                                img.onerror=reject( new Error( `Bogus!\n\nUnable to load ${url}` ) );
                                img.src=url;
                        });
                    };
                    const ajax=function(url,callback){
                        let xhr=new XMLHttpRequest();
                        xhr.onload=function(){
                            if( this.status==200 && this.readyState==4 )callback( this.response )
                        };
                        xhr.onerror=function(e){
                            alert(e)
                        };
                        xhr.open( 'POST', url, true );
                        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                        xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');
                        xhr.send();
                    };
                    const ajaxcallback=function(r){
                        let json=JSON.parse( r );
                        if( json.latest!=null ){
                            loadimage( json.latest ).then( img=>{ image.src=img.src } ).catch( err=>{ alert(err) } );
                        }
                    };
    
                    /* anonymous, self-executing function to re-query every X seconds or whatever... */
                    (function(){
                        ajax( location.href, ajaxcallback )
                        setTimeout( arguments.callee, 1000 * 5 );
                    })();
    
                });
            </script>
            <style></style>
        </head>
        <body>
            <div>
                <h1>Directory Monitor using ajax</h1>
                <output></output>
                <span><img /></span>
            </div>
        </body>
    </html>
    

    上面查看了名为 images 的 current working directory 的子目录,并通过定期将新文件复制到所述目录中进行了测试,只要新复制的文件设置了 Last Modified 时间,这种方法就可以正常工作到复制操作的时间 - filemtime 毕竟获取文件修改时间。

    / monitor.php
    └─
       images/
             └─
                pic1.jpg
                pic2.jpg
    

    我尝试(并且更喜欢)的另一种方法是使用EventSource 连接,该连接在无限循环中使用 PHP 来查询您的目录并发回消息。这使用从 Javascript 到 PHP 脚本的单个连接,只要页面打开(或直到显式终止),该脚本就会保持打开状态

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多