通过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可以检测文件夹,因此我通过执行以下两个步骤解决了此问题:
{
'foldername/': {'file1.txt','file2.txt},
'foldername/folder2': {'foo.txt', 'bar.png'}
}
$_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);
}
}
}
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。