`
wxinyu
  • 浏览: 7212 次
文章分类
社区版块
存档分类
最新评论

文件夹实现拖放上传

阅读更多

现要求能在浏览器上直接拖放一个文件夹实现批量上传

 

Html5规范还不支持
但是目前chrome >= 21 浏览器支持

 

现在文件的拖放上传采用的是
jquery-filedrop.js
https://github.com/weixiyen/jquery-filedrop
这个不支持文件夹

我把这个做了改进,可以支持文件夹。

 

原先代码:

   function drop(e) {
      if( opts.drop.call(this, e) === false ) return false;
      files = e.dataTransfer.files;
      if (files === null || files === undefined || files.length === 0) {
        opts.error(errors[0]);
        return false;
      }
      files_count = files.length;
      upload();
      e.preventDefault();
      return false;
    }

 

改进如下:

   function drop(e) {
      if( opts.drop.call(this, e) === false ) return false;

      function walkFileSystem(directory, callback, error) {
        if (!callback.pending) {
          callback.pending = 0;
        }
        if (!callback.files) {
          callback.files = [];
        }

        callback.pending++;

        var reader = directory.createReader(),
        relativePath = directory.fullPath.replace(/^\//, '').replace(/(.+?)\/?$/, '$1/');
        reader.readEntries(function(entries) {
          callback.pending--;
          $.each(entries, function(index, entry) {
            if (entry.isFile) {
              callback.pending++;
              entry.file(function(File) {
                File.path = encodeURIComponent(relativePath);
                callback.files.push(File);
                if (--callback.pending === 0) {
                    callback(callback.files);
                }
              }, error);
            } else {
              walkFileSystem(entry, callback, error);
            }
          });

          if (callback.pending === 0) {
            callback(callback.files);
          }
        }, error);
      }

      var items = e.dataTransfer.items || [], firstEntry;
        if (items[0] && items[0].webkitGetAsEntry && (firstEntry = items[0].webkitGetAsEntry())) {
          // Experimental way of uploading entire folders (only supported by chrome >= 21)
          walkFileSystem(firstEntry.filesystem.root, function(allfiles) {
            files = allfiles;
            files_count = files.length;
            upload();

          }, function() {
            // Fallback to old way when error happens
            files = e.dataTransfer.files;
            files_count = files.length;
            upload();
          });
        } else {
          files = e.dataTransfer.files;
          files_count = files.length;
          upload();
      }

      e.preventDefault();
      return false;
    }

 

以上改进点说明:

如果浏览器支持文件夹拖放,判断类型,如果是文件夹就递归读取文件夹目录树,

找到所有文件,最后在上传。

 

怎样做到按目录树保存文件呢?

 

其实递归读取文件夹时,我给文件赋值了path值,就是相对路径,

这样服务端就可以根据这个path,实现按目录树保存了。

 

其他地方的修改点就不一一列出了,附上修改后的完整代码。

 

分享到:
评论

相关推荐

    一文讲清Python PyQt5的控件如何实现拖放获取文件路径(markdown)

    本篇文章将详细讲解如何使用PyQt5的控件,特别是QLineEdit,来实现拖放操作以获取文件路径。我们将深入理解相关代码,并了解如何将这一功能整合到你的项目中。 首先,让我们了解一下QLineEdit。QLineEdit是PyQt5中...

    拖放选中对象

    实现拖放操作通常需要编程支持,特别是在桌面应用程序和网页开发中。在Windows环境中,可以使用Microsoft的COM接口,如IDataObject和IDropTarget,来实现拖放功能。在Web开发中,HTML5引入了Drag and Drop API,允许...

    局域网类共享文件夹的上传和下载

    3. 上传文件:选择本地文件,拖放到共享文件夹中,或者使用文件管理器的“发送到”功能。 对于文件的下载,步骤如下: 1. 打开共享文件夹:在需要下载文件的计算机上,找到并打开共享文件夹。 2. 下载文件:选中...

    DropItAll:拖放文件上传,包括ASP.NET MVC 5中的文件夹

    二、JavaScript在拖放上传中的作用 JavaScript是实现拖放功能的关键。在DropItAll中,JavaScript负责监听用户的拖放操作,捕获被拖动的文件信息,并与服务器进行通信,完成文件上传。通过监听`dragenter`, `...

    JS实现window下的文件夹选择

    在JavaScript中,实现“窗口下文件夹选择”功能是一个常见的需求,尤其是在开发Web应用程序时,用户可能需要上传或处理整个文件夹的内容。由于浏览器的安全限制,JavaScript原生并不支持直接选择文件夹,但通过HTML5...

    AngularJS封装webupload实现文件夹上传

    设置`dnd`(拖放)属性,开启文件夹选择功能,如`enableFolderSelect: true`,同时配置服务器端处理文件上传的URL。 4. **事件监听**:WebUploader提供了丰富的事件接口,如`onUploadStart`、`onFileQueued`、`...

    千牛云盘怎么上传文件夹.docx

    - 将你需要上传的文件夹通过拖放或者复制粘贴的方式移动到这个同步目录中。千牛云盘会自动检测到新的文件夹并开始上传到云端。 **二、千牛云盘下载文件** 下载千牛云盘中的文件相对简单,但目前仅支持单个文件的...

    vuedropzone一个拖动文件上传的Vuejs组件支持图片预览

    1. **拖放上传**:Vue Dropzone允许用户通过简单的拖放操作将文件添加到上传队列,提高了用户体验。 2. **实时预览**:特别是对于图片文件,Vue Dropzone可以提供即时的预览,让用户在上传前就能看到文件的显示效果...

    vb 实现文件拖拽显示文件路径

    这个功能可以应用于多种情况,如文件上传、文件浏览等。理解并掌握拖放操作对于提升VB应用程序的用户友好性至关重要。同时,你可以根据实际需求进行扩展,例如添加错误处理、文件类型的检查,或者对多个文件的处理...

    javascript 实现的文件拷贝(能够循环遍历所选文件夹)

    在JavaScript中实现文件拷贝是一项常见的任务,尤其是在前端开发中,比如在拖放操作、文件上传或者本地数据备份等场景。下面将详细讲解如何利用JavaScript实现文件或文件夹的遍历与复制。 首先,理解JavaScript在...

    jQuery操作文件夹

    9. **拖放功能**:jQuery UI或第三方插件如`dropzone.js`可以用来实现拖放功能,让用户能方便地将文件拖放到网页上进行操作。 10. **权限管理**:在涉及用户文件操作的应用中,需要考虑权限管理。前端应该只允许...

    vlc + duilib + vs2013

    请务必把debug里的skin替换到release,不知道怎么重新上传 如果编译不通过,须要修改下duilib的...实现OLE的文件/文件夹的拖放播放;  5.在播放屏幕和播放列表上分别添加右键菜单(各自只实现了一个示例,须自行扩展)。

    DropForms_上传_拖拽_

    本文将深入探讨“DropForms_上传_拖拽”这一主题,结合C#编程语言,介绍如何实现拖放操作以及文件上传功能。 首先,让我们了解什么是拖放操作。拖放是一种用户交互技术,允许用户通过鼠标或其他输入设备从一个位置...

    jsp 大文件/文件夹上传控件

    在JSP中实现大文件或文件夹上传,通常涉及到前端和后端的协同工作。 **前端部分:** 前端上传控件是用户与系统交互的界面,它的主要任务是收集用户选择的文件或文件夹,并将这些信息发送到服务器。在现代Web开发中...

    JQ实现拖拽上传并显示

    // 监听文件输入框的change事件,用于非拖放上传 $('#file-input').on('change', function(e) { handleFiles(this.files); }); }); function handleFiles(files) { // 这里可以处理文件,如读取文件内容,预览...

    带有进度条和拖放功能的多个文件上传的文件夹树

    4. **拖放功能**:HTML5的`drag and drop` API使得在浏览器中实现拖放操作成为可能。通过JavaScript或jQuery,可以监听拖放事件,将文件从本地文件系统拖放到网页的指定区域进行上传。 5. **进度条**:为了提升用户...

    html5实现多图片上传预览(源码,已测试)

    至于`control`和`core`两个文件夹,它们可能是额外的JavaScript库或工具,可能包含了对上传过程的进一步控制和核心功能的实现。 总的来说,这个项目展示了如何利用HTML5的File API和拖放API实现多图片上传预览的...

    无插件拖拽上传图片实例html源码.rar

    标题中的“无插件拖拽上传图片实例html源码”是指一种基于HTML5技术实现的图片上传功能,它不需要依赖任何外部插件,用户可以通过直接拖放图片到网页上来完成图片上传操作。这个实例通常会涉及到HTML5的新特性,如`...

    Dropper:一个用于简单拖放上传的 jQuery 插件

    Dropper 是一个基于 jQuery 的轻量级插件,专为实现简单、直观的拖放上传功能而设计。它允许用户通过拖拽文件到指定区域来上传文件,极大地提升了用户体验,特别是对于需要频繁上传文件的网站来说,这种交互方式更为...

    node-wiki:HTML5编辑器支持的Wiki,具有拖放文件上传功能和易于创建的页面

    该项目现已开始发展成为一个具有标签,最近页面,自动保存和拖放文件上传功能的不错的Wiki平台。 ##简单 Node-Wiki旨在为内容编辑者提供任何便利。 创建新页面和编辑现有页面的两个主要Wiki操作非常简单。 与...

Global site tag (gtag.js) - Google Analytics