通过HTML表单上传整个目录

通过HTML表单上传整个目录,html,forms,file-upload,directory,Html,Forms,File Upload,Directory,是否可以在浏览器中上载带有文件输入的文件夹 我搜索并发现这可能是浏览器的限制,我可能需要使用Java小程序或Flash。请参阅-基于Flash的方法一次上载多个文件。无论如何,无法上载文件夹,只能上载文件夹中的所有文件。可以通过拖放方式一次上载多个文件,而无需任何浏览器插件。这是HTML5和javascript的一项新开发,因此您可能需要为较旧的浏览器提供备用 它被称为“”。我还没有使用过它,所以我不能给你示例代码,但是搜索这个短语,阅读链接的Mozilla博客文章可能会给你一些提示。使用web

是否可以在浏览器中上载带有文件输入的文件夹


我搜索并发现这可能是浏览器的限制,我可能需要使用Java小程序或Flash。

请参阅-基于Flash的方法一次上载多个文件。无论如何,无法上载文件夹,只能上载文件夹中的所有文件。

可以通过拖放方式一次上载多个文件,而无需任何浏览器插件。这是HTML5和javascript的一项新开发,因此您可能需要为较旧的浏览器提供备用


它被称为“”。我还没有使用过它,所以我不能给你示例代码,但是搜索这个短语,阅读链接的Mozilla博客文章可能会给你一些提示。

使用webkitdirectory是可能的

<input type="file" webkitdirectory directory multiple />


自Firefox 50、Chrome 30、Safari 11.1、Edge 14以来一直受支持,但自2019年起大多数移动浏览器均不支持:

请尝试此选项以上载文件夹:



您可以使用类似于
tar
的内容对目录进行归档,然后将其作为一个文件上载。但请小心,您可能会超过默认设置为2MB的php upload max。但这是可配置的。

要在php中上载文件夹,请使用以下步骤

<form id="form1" action="myCurrent.php" method="post">
<label>Upload All Files From Folder</label> <br/>
<input id="input" name="input[]" type="file" multiple webkitdirectory >
<div id="errorBlock" class="help-block"></div> <br/>

<input type="submit" name="btnDesFolder" id="btnDesFolder" value="send file" />
</form>

<?php
if(isset($_POST['btnDesFolder'])){
    $myFiles = $_POST['input-folder-2'];

    if(isset($_POST['input-folder-2'])){
        $files = scandir("path/to/your/folder");
        $oldfolder = "path/to/your/folder/";

        $newfolder = "path/to/new/folder";

        foreach($files as $fname) {
            if($fname != '.' && $fname != '..' && $fname != 'index.php') {
                rename($oldfolder.$fname, $newfolder.$fname);
            }
        }
    }
}
?>

从文件夹上载所有文件


仅使用PHP似乎不可能上载文件夹,但Javascript可以检测文件夹,因此我通过执行以下两个步骤解决了此问题:

  • 创建一个Javascript函数,读取将上载的目录和文件,并将其添加到将与POST一起发送的数组(我称之为文件结构)。例如:

    {
        'foldername/': {'file1.txt','file2.txt}, 
        'foldername/folder2': {'foo.txt', 'bar.png'} 
    }
    
  • Dropzone.js中有一个类似的函数已经处理了这个问题,我不得不修改它(\u addFilesFromDirectory())。但是您可以创建自己的函数来实现这一点。如果您需要更多的帮助,请参阅此

  • 在Php中,您应该首先让您的文件上传到某个文件夹,在那里它们将被临时存储。上传文件后,您需要将javascript数组传递到phpcode。 在那里,您需要迭代数组并创建文件夹,然后将上载的文件从临时文件夹移动到各自的位置。 例如:

    $_filetree = $_POST['filetree'];
    
    function createFoldersAndMoveFiles($_filetree) 
    {
    
        $nFolders = count($_filetree);
    
        foreach ($_filetree as $folder => $files) {
            createFolder($folder);
            moveFiles($files, $folder);
    
        }
    }
    
    function moveFiles($_files, $_folder) {
    
        $source = 'tmpuploads/';
        $destination = 'mypath/';
    
        $nFiles = count($_files);
        for($i = 0; $i < $nFiles; $i++) {
            $file = $_files[$i];
            rename($source . $file, $destination .$_folder. '/' .$file);
          }
    }
    
    function createFolder($foldername) {
        $folders = explode("/", $foldername);
    
        $path = 'mypath/';
        $nFolders = count($folders);
        for($i = 0; $i < $nFolders; $i++){
            $newFolder = '/' . $folders[$i];
            $path .= $newFolder;
    
            if (!file_exists($path) && !is_dir($path)) {
                mkdir($path);
            }
    
        }
    }
    
    $\u filetree=$\u POST['filetree'];
    函数createFoldersAndMoveFiles($\u filetree)
    {
    $n文件夹=计数($\u文件树);
    foreach($\文件树为$folder=>$files){
    createFolder($folder);
    移动文件($files,$folder);
    }
    }
    函数移动文件($\u文件,$\u文件夹){
    $source='tmpuploads/';
    $destination='mypath/';
    $n文件=计数($\u文件);
    对于($i=0;$i<$n文件;$i++){
    $file=$\u文件[$i];
    重命名($source.$file,$destination.$\文件夹'/'.$file);
    }
    }
    函数createFolder($foldername){
    $folders=explode(“/”,$foldername);
    $path='mypath/';
    $nFolders=计数($folders);
    对于($i=0;$i<$n文件夹;$i++){
    $newFolder='/'.$folders[$i];
    $path.=$newFolder;
    如果(!file_exists($path)&&!is_dir($path)){
    mkdir($path);
    }
    }
    }
    
  • 我希望这有帮助。

    如果您使用dropzone: dropzone扫描已删除目录中的文件,并对每个文件向后端发出请求的相应子目录。 已捕获此文件的原始完整路径

    PD:使用的lodash(u.without)例如:

    sendingEvent(file, xhr, formData){
    
        if (file.fullPath) { //file.fullPath only exist if file is inside a directory
            var directoryStructure = _.without(file.fullPath.split("/"), file.name);
            formData.append('directory-structure', directoryStructure.join(",") );
        }
    }
    
    您已收到以下请求:

    • 目录结构:路径
    • 文件:二进制
    现在,您可以在后端使用此文件夹名称。
    dropzone可以单独进行多次上传,不会出现任何问题,并且适合您的使用情况。

    它如何在服务器上获取文件夹?似乎它将上载文件夹中的所有文件,而不包含有关文件夹结构/子文件夹的信息。请给出建议。这里有一个关于PHP的开放bugreport。仅仅通过PHP获得文件夹结构几乎是不可能的
    multiple
    无法与
    webkitdirectory
    目录一起使用,因为不再支持flash。