javascript - FileReader 从浏览器窗口拖动图像

标签 javascript jquery html

我有一个 div,用户可以在其中拖放图像,然后使用 FileReader 获取图像的 base64。工作正常。

dropper.ondrop = function (e) {

    e.preventDefault();

    var file = e.dataTransfer.files[0];

    var reader = new FileReader();
    reader.readAsDataURL(file);
};

我的问题是,如果我打开浏览器窗口并从浏览器中拖放图像,我会收到错误消息:

Failed to execute 'readAsDataURL' on 'FileReader': 
parameter 1 is not of type 'Blob'.

现在,是否有任何方法可以从浏览器窗口中获取图像的 base64 格式?

最终,有没有办法通过服务器端 curl 请求获取图像 URL,然后获取实际的 base64?

有什么想法吗?

最佳答案

您可以使用 e.dataTransfer.getData('url') 判断是否有可用的 URL。像这样:

var url = e.dataTransfer.getData('url');
if(url){
    console.log('Url');
    console.log(url);
}else{
    console.log('File');
    var file = e.dataTransfer.files[0];
    var reader = new FileReader();
    reader.readAsDataURL(file);
}

然后,有了 URL,您就可以加载一个 img 元素并使用它在 canvas 上绘制以获取 base64 表示。像这样:

var img = document.createElement('img');
img.crossOrigin = 'anonymous';
img.onload = function(){
    var canvas = document.createElement('canvas');
    canvas.width = this.width;
    canvas.height = this.height;
    var context = canvas.getContext('2d');
    context.drawImage(this, 0, 0);
    console.log(canvas.toDataURL());
};
img.src = url;

这将是“最终”产品:

var dropper = document.querySelector('div');
dropper.ondragover = function(e) {
    e.preventDefault();
}
dropper.ondrop = function (e) {
    e.preventDefault();
    var url = e.dataTransfer.getData('url');
    if(url){
        console.log('Url');
        console.log(url);
        var img = document.createElement('img');
        img.crossOrigin = 'anonymous';
        img.onload = function(){
            var canvas = document.createElement('canvas');
            canvas.width = this.width;
            canvas.height = this.height;
            var context = canvas.getContext('2d');
            context.drawImage(this, 0, 0);
            console.log(canvas.toDataURL());
        };
        img.src = url;
    }else{
        console.log('File');
        var file = e.dataTransfer.files[0];
        var reader = new FileReader();
        reader.readAsDataURL(file);
    }
};
div{
    border:1px solid red;
    height:240px;
    width:100%;
}
<div>Drop here</div>

也可以在这里找到:https://jsfiddle.net/8u6Lprrb/1/

关于javascript - FileReader 从浏览器窗口拖动图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46405701/

相关文章:

php - Yii 使用 Jquery 从单选按钮列表中获取选定的值

html - XPATH 选择 "td"标签和 <h2> 标签之间或 "h2"标签和 </table> 标签之间的 "h2"元素,以直接者为准

html - 删除 HTML CSS 中的下划线格式

javascript - Famo.us IframeSurface

javascript - 如何根据呼吸内容使我所有的 div 的高度相同

javascript - 使用 jquery 在键入时更改表单的内容

javascript - 当其他 Div 展开时,将 Div 保持在底部

javascript - 从 .csv 中提取的变量不会添加

javascript - 类型错误 : Cannot set property 'user' of undefined at

javascript - 单击 TAB 时,焦点应位于下一个文本框上