【问题标题】:Get filenames from folder从文件夹中获取文件名
【发布时间】:2015-07-20 17:37:26
【问题描述】:

我想让用户通过点击上传按钮来选择一个文件夹。在提交时,我想(递归)从文件夹中检索所有文件名,而不上传任何文件或文件夹。

例如, 假设有文件夹名称 Test 具有以下文件夹结构:
Test
- 1.txt
- 2.pdf
- 3.avi
- Test2(文件夹,包含多个文件)
- 4.mp4

点击上传按钮选择测试文件夹,输出应该是: 1.txt , 2.pdf , 3.avi, Test2 (文件夹内的文件名) , 4.mp4

我不需要获取文件中的内容,只需获取文件名。

我应该怎么做? 我知道有允许文件夹上传的 chrome webkit 目录

<?php
$count = 0;
$name2 = array();
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
foreach ($_FILES['files']['name'] as $i => $name) {
    if (strlen($_FILES['files']['name'][$i]) > 1) {
        $count++;

        array_push($name2, $_FILES['files']['name'][$i]);
    }
}
}
?>

<!DOCTYPE HTML>
<html>

<body>
  <form method="post" enctype="multipart/form-data">
    <input type="file" name="files[]" id="files" multiple="" directory="" webkitdirectory="" mozdirectory="">
    <input class="button" type="submit" value="Upload" />
  </form>
</body>

</html>

$name2 数组返回文件名列表
以上代码不适用于视频文件,并且与其他浏览器不兼容。

还有其他方法吗?

【问题讨论】:

  • 这和python有什么关系?

标签: javascript php


【解决方案1】:

PHP 为您提供了一个名为 filesystemiterator 的对象,旨在帮助您遍历指定的文件夹。在你的情况下,我会做一个看起来像这样的递归函数:

function readFolder($folder)
{
    $retArray = array();
    $folder = new FilesystemIterator("path/to/folder", FilesystemIterator::SKIP_DOTS);
    foreach($folder as $file)
    {
        if(is_dir($file->getPathname())
            $retArray[] = readFolder($file->getPathname());
        else
            $retArray[] = $file->getFilename();
    }

    return $retArray;
}

这一切的好处在于 getPathname() 方法返回文件的完整路径,而如果您只需要文件名,则可以使用 getFilename() 方法。这是 PHP 网站上文档的链接:

http://php.net/manual/en/class.filesystemiterator.php

此外,出于安全考虑,现代网络浏览器在您使用“文件”输入类型时不包含文件的完整路径。

【讨论】:

  • 这行不通,因为它只能访问服务器文件系统,我相信 umang 需要用户能够在客户端选择文件夹。
  • 您希望您的服务器访问远程计算机?那不是……侵入性的吗?
  • @Osuwariboy 为什么它是侵入性的?与上传文件夹相同,由文件名组成,上传与否由用户选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多