如何使用Javascript

时间:2019-01-12 18:06:20

标签: javascript php directory scandir

上下文

您好,我想列出一个文件夹中的所有文件,因此我首先考虑使用PHP scandir()函数在 php 中进行操作,结果如下:

<?php
$dir = "/images/";

// Sort in ascending order - this is default
$a = scandir($dir);

// Sort in descending order
$b = scandir($dir,1);

print_r($a);
print_r($b);
?>

结果:

Array
(
[0] => .
[1] => ..
[2] => film1.mkv
[3] => film2.mkv
[4] => film3.mkv
[5] => film4.mkv
)
Array
(
[0] => film4.mkv
[1] => film3.mkv
[2] => film2.mkv
[3] => film1.mkv
[4] => ..
[5] => .
)

但是后来我意识到,我想扫描文件夹中的所有视频以便显示它们,并选择让本地用户选择其中任何一个。使用 JavaScript 是个好主意。

问题

是否可以用Javascript完成?用它代替php是个好主意吗?

编辑:此操作的最终目的是发布一部电影,就像Netflix或所有著名的电影相关网站所做的一样

4 个答案:

答案 0 :(得分:2)

鉴于您对制作类似于Netflix克隆的内容的评论,我建议的建议是制作一个PHP端点,将文件列表导出为JSON。话虽如此,我建议您构建一个允许用户输入的文件浏览器,因为在许多情况下,这将使您容易受到目录遍历攻击,并且恶意用户可能能够访问您的整个服务器。 可以正确完成,但是很棘手。

相反,为什么不拥有一个包含文件名,类型,路径,关键字,缩略图图像路径等的数据库。然后使用客户端javascript通过ajax向PHP脚本发出请求,该脚本处理数据库访问并完全控制文件访问。这样,当用户单击视频时,您可以调用另一个端点,该端点启动用于视频流的websocket,并且该用户不能在服务器中恶意徘徊或直接下载/窃取视频文件。

这里是列出服务器中某些文件的示例。为了简化代码,我在这里假设使用jQuery,但是您可以使用其他库或本机XMLHttpRequest对象:

$.ajax({
    url: '/movies/list-all.php',
    method: 'GET',
    dataType: 'json'
}).done(function(data) {
    if (typeof data === 'object' && typeof data !== null) {
        // List the movies
        for(var movie in data.movies) {
            var movieDiv = '<div class="movie-item" data-id="' + movie.id + '">' +
                '<img src="' + movie.thumbnail_path + '"><br>' +
                '<p>' + movie.title + '</p>' +
                '</div>';
            $('#my-container-div').append(movieDiv);
        }
    }
});

示例PHP端点以列出电影:

<?php

    /**
     * list-all.php
     *
     * Assumes you have a PDO database connection setup already here as $db.
     */

    $stmt = $db->query("SELECT * FROM movies");
    if ($stmt instanceof PDOStatement) {
        $movies = $stmt->fetchAll();
        $response = (object) [
            'total'  => count($movies),
            'movies' => $movies,
        ];
    } else {
        $response = (object) [
            'total' => 0,
            'movies' => [],
        ]
    }

    header('Content-Type: application/json');
    echo(json_encode($response));

演示(某种):

var movieData = {
  count: 3,
  movies: [{
      id: 1,
      title: "Movie A",
      thumb: "https://via.placeholder.com/150"
    },
    {
      id: 2,
      title: "Movie B",
      thumb: "https://via.placeholder.com/150"
    },
    {
      id: 3,
      title: "Movie C",
      thumb: "https://via.placeholder.com/150"
    },
  ]
};

$(document).ready(function() {

  if (typeof movieData === 'object' && typeof movieData !== null) {
    // List the movies
    for (var i in movieData.movies) {
      var movie = movieData.movies[i];
      var movieDiv = '<div class="movie-item" data-id="' + movie.id + '">' +
        '<img src="' + movie.thumb + '"><br>' +
        '<p>' + movie.title + '</p>' +
        '</div>';
      $('#movies').append(movieDiv);
    }
  }

});
.movie-item {
  display: inline-block;
  border: 2px solid #DDD;
  margin: 10px;
  text-align: center;
}

.movie-item:hover {
  border: 2px solid #00aaca;
  cursor: pointer;
}

.movie-item p {
  color: #00aaca;
  font-weight: bold;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<html>

<head></head>

<body>
  <h1>Movies</h1>
  <div id="movies"></div>
</body>

</html>

答案 1 :(得分:2)

浏览器无法读取用户的文件。 但是,使用Node和内置的“ fs”模块非常容易(并且很常见)。

const { readdirSync } = require('fs');

const PATH_TO_YOUR_FOLDER = '/Users/me/Downloads';

console.log(readdirSync(PATH_TO_YOUR_FOLDER));
// output: array of the file names in my downloads directory

您需要安装Node: https://nodejs.org/en/

以下是fs文档: https://nodejs.org/api/fs.html#fs_fs_readdirsync_path_options

然后将上面的代码保存在.js文件中,并在node(使用终端)上运行它:

node ./my-code.js

答案 2 :(得分:0)

否,除非您运行节点服务器。

您可以做的是,在HTML内打印$a$b,如下所示:

<html>
  <head>
    <script>
      var files = <?php echo $a ?>
      // then do whatever to display it
  </head>
</html>

我可能无法准确地使用echo,欢迎您使用printprintr以其他方式打印它。 而且您可能还需要进行额外的工作才能将$a打印为正确的js对象

答案 3 :(得分:0)

示例1

单独使用PHP获取文件内容。

include 'db.php';// Your DB connection file
$dir = "/images/";
$fi = scandir($dir);
$num_fi = count($fi)-2;
$dh = opendir($dir);
$file = readdir($dh);
$res = "";$i=0;
if (is_dir($dir)){
    if ($dh = opendir($dir)){
        if ($i < $num_fi){

            while (false !== ($file = readdir($dh))){
                 if($file !== "." && $file !== ".." && $file !== ".htaccess" && $file !== "Thumbs.db"){
            $i++;
            echo "<div><iframe src=\"".$dir.$files."\"></iframe><div>" 
            } else {
            echo "<div>No Videos.</div>";
            }
        }
    }   
}
closedir($dh);

示例2

Ajax示例将使用2个文件,其中一个包含HTML和Javascript,另一个包含调用PHP的文件。 Ajax用于调用诸如onclick之类的事件,或者您可以只调用如下所示的ajax函数。

PHP将获取文件内容,并通过while循环将每个视频放入iframe中。将PHP文件“ videos.php”命名为与Ajax查找的文件相同的名称。

if(isset($_POST['data'])){
include 'db.php';// Your DB connection file
$dir = "/images/";
$fi = scandir($dir);
$num_fi = count($fi)-2;
$dh = opendir($dir);
$file = readdir($dh);
$res = "";$i=0;
if (is_dir($dir)){
if ($dh = opendir($dir)){
if ($i < $num_fi){

while (false !== ($file = readdir($dh))){
if($file !== "." && $file !== ".." && $file !== ".htaccess" && $file !== "Thumbs.db"){
$i++;
$res .= "<div><iframe src=\"".$dir.$files."\"></iframe><div>" 
} else {
$res .= "<div>No Videos.</div>";}
}
}
closedir($dh);
} 
echo $res;

这是Javascript Ajax调用。它将通过此​​行RequestObject.open(“ POST”,“ videos.php”)来调用您的PHP文件。

var RequestObject = false;
if (window.XMLHttpRequest) {
  RequestObject = new XMLHttpRequest();
} else if (window.ActiveXObject) {
  RequestObject = new ActiveXObject("Microsoft.XMLHTTP");
}

function chooseVideos() {
  if (RequestObject) {
    RequestObject.open("POST", "videos.php");
    RequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    RequestObject.onreadystatechange = function() {
      if (RequestObject.readyState == 4 && RequestObject.status == 200) {
        document.getElementById('videoPanel').innerHTML = RequestObject.responseText;
      }
    }
    var data = "vidData";
    RequestObject.send("data=" + data);
  }
  return false;
}

chooseVideos();
<form method="post">
  <div id="videoPanel"></div>
</form>

以上是您的HTML容器,用于显示Ajax调用的结果document.getElementById('videoPanel')。innerHTML = RequestObject.responseText;