通过HTML表单上传整个目录

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

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

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

php file-upload directory
7个回答
16
投票

使用webkitdirectory变得可能。

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

从Firefox 50,Chrome 30,Safari 11.1,Edge 14开始支持,但截至2019年在大多数移动浏览器上都不支持:https://caniuse.com/#feat=input-file-directory


5
投票

请尝试这个以上传文件夹:

<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++;
            }
        }
    }
}

`


3
投票

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


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

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

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


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

您可以使用tar之类的目录存档目录,然后将其作为一个文件上传。但是请注意,您可能会超过php upload max,默认设置为2MB。这是可配置的。

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