【问题标题】:Dropzone js - Drag n Drop file from same pageDropzone js - 从同一页面拖放文件
【发布时间】:2015-08-29 05:58:40
【问题描述】:

我正在使用Dropzone 插件来实现多个文件拖放功能。当我从我的笔记本电脑/台式机上传图片时,拖放工作正常。

我的问题是 - 如何将 n 个放置图像从同一页面拖放到 dropzone 中。假设我有一个 dropzone div,并且我有另一个 div 有多个图像。我想将这些图像拖放到 dropzone 中。

【问题讨论】:

    标签: php jquery html drag-and-drop dropzone.js


    【解决方案1】:
    this.on("drop", function(event) {
      var imageUrl = event.dataTransfer.getData('URL');
      var fileName = imageUrl.split('/').pop();
    
      // set the effectAllowed for the drag item
      event.dataTransfer.effectAllowed = 'copy';
    
      function getDataUri(url, callback) {
        var image = new Image();
    
        image.onload = function() {
          var canvas = document.createElement('canvas');
          canvas.width = this.naturalWidth; // or 'width' if you want a special/scaled size
          canvas.height = this.naturalHeight; // or 'height' if you want a special/scaled size
    
          canvas.getContext('2d').drawImage(this, 0, 0);
    
          // Get raw image data
          // callback(canvas.toDataURL('image/png').replace(/^data:image\/(png|jpg);base64,/, ''));
    
          // ... or get as Data URI
          callback(canvas.toDataURL('image/jpeg'));
        };
    
        image.setAttribute('crossOrigin', 'anonymous');
        image.src = url;
      }
    
      function dataURItoBlob(dataURI) {
        var byteString,
            mimestring
    
        if (dataURI.split(',')[0].indexOf('base64') !== -1) {
          byteString = atob(dataURI.split(',')[1])
        } else {
          byteString = decodeURI(dataURI.split(',')[1])
        }
    
        mimestring = dataURI.split(',')[0].split(':')[1].split(';')[0]
    
        var content = new Array();
        for (var i = 0; i < byteString.length; i++) {
          content[i] = byteString.charCodeAt(i)
        }
    
        return new Blob([new Uint8Array(content)], {
          type: mimestring
        });
      }
    
      getDataUri(imageUrl, function(dataUri) {
        var blob = dataURItoBlob(dataUri);
        blob.name = fileName;
        myDropzone.addFile(blob);
      });
    });
    

    http://codepen.io/BartSitek/pen/ZeMGjV

    这是我解决问题的方法。数据转换功能是在互联网上找到的。下面是对实际情况的一点解释:

    • 在“drop”事件期间,抓取您正在拖动的图像的 URL
    • 将该 URL 转换为数据 URI 格式
    • 将数据 URI 转换为 Blob
    • 将 Blob 添加到 Dropzone 表单

    【讨论】:

    • 这仅适用于同一域中的图像。它要求服务器设置正确的 CORS 标头。 (尝试从 dropzone 内的其他选项卡中拖动图像)。如果服务器没有设置 CORS 标头,它将永远无法到达 img.onload 函数。
    • 有没有办法在某些事件中以编程方式进行拖放?
    猜你喜欢
    • 2022-01-20
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多