通过 HTML 表单上传整个目录

问题描述 投票:0回答:9

是否可以上传在浏览器中输入文件的文件夹?

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

html forms file-upload directory
9个回答
26
投票

使用 webkitdirectory 使这一切成为可能。

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

自 Firefox 50、Chrome 30、Safari 11.1、Edge 14 起受支持,但截至 2019 年大多数移动浏览器均不受支持:https://caniuse.com/#feat=input-file-directory


12
投票

请尝试此上传文件夹:

<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>
`

$count = 0;
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
    foreach ($_FILES['files']['name'] as $i => $name) {
        if (strlen($_FILES['files']['name'][$i]) > 1) {
            if (move_uploaded_file($_FILES['files']['tmp_name'][$i], 'folder/'.$name)) {
                $count++;
            }
        }
    }
}

`


2
投票

可以通过拖放一次上传多个文件,无需任何浏览器插件。这是使用 HTML5 和 javascript 进行的新开发,因此您可能需要针对旧版浏览器的后备方案。

这就是“HTML5拖放”。我还没有使用过它,所以我不能给你示例代码,但搜索该短语并阅读链接的 Mozilla 博客文章可能会给你一些指导。


2
投票

仅使用 PHP 似乎无法上传文件夹,但 Javascript 可以检测文件夹,所以我通过执行以下两个步骤解决了这个问题:

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

    {
        'foldername/': {'file1.txt','file2.txt}, 
        'foldername/folder2': {'foo.txt', 'bar.png'} 
    }
    

Dropzone.js 中有一个类似的函数已经处理了这个问题,我必须修改它(_addFilesFromDirectory())。但您可以创建自己的函数来执行此操作。如果您需要更多帮助,请参阅此https://stackoverflow.com/a/20431117/6760554

  1. 在 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);
            }
    
        }
    }
    

我希望这有帮助。


1
投票

要在 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);
            }
        }
    }
}
?>

0
投票

参见 swfupload - 一种基于 Flash 的方法,可以一次上传多个文件。无论如何,无法上传文件夹,只能上传文件夹中的所有文件。


0
投票

您可以使用类似

tar
的方式存档目录,然后将其作为一个文件上传。但要小心,您可能会超过 php 上传最大值,默认设置为 2MB。但这是可配置的。


0
投票

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

https://www.dropzonejs.com/#event-sending

PD:使用 lodash (_.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 可以单独进行多个上传,不会出现任何问题,并且适合您的用例。


0
投票

<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>

© www.soinside.com 2019 - 2024. All rights reserved.