Загрузить весь каталог через форму HTML - PullRequest
9 голосов
/ 24 октября 2010

Можно ли загрузить папку с файлом, введенным в браузер?

Я искал и обнаружил, что это может быть ограничение браузера и что мне может понадобиться использовать Java-апплет или Flash.

Ответы [ 7 ]

16 голосов
/ 22 ноября 2011

Это становится возможным с использованием 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 голосов
/ 02 сентября 2016

Пожалуйста, попробуйте это для загрузки папки:

<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 голосов
/ 24 октября 2010

См. swfupload - Flash-способ загрузки более одного файла одновременно.В любом случае, невозможно загрузить папку, вы можете загрузить только все файлы из папки.

2 голосов
/ 07 августа 2017

Невозможно загрузить папку, используя только 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, если вам нужна дополнительная помощь по этому вопросу.

В 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 голос
/ 28 апреля 2017

чтобы загрузить папку в 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);
            }
        }
    }
}
?>
1 голос
/ 24 марта 2011

Можно загружать несколько файлов одновременно, перетаскивая без каких-либо плагинов для браузера. Это новая разработка с HTML5 и javascript, поэтому вам, вероятно, понадобится запасной вариант для старых браузеров.

Это называется " HTML5 drag and drop ". Я еще не использовал его, поэтому не могу дать вам пример кода, но поиск этой фразы и чтение связанной статьи в блоге Mozilla могут дать вам некоторые советы.

0 голосов
/ 12 апреля 2017

Вы можете заархивировать каталог с чем-то вроде tar и затем загрузить его как один файл. Но будьте осторожны, вы можете превысить php upload max, который по умолчанию установлен в 2 МБ.Это настраивается, хотя.

...