【问题标题】:Drag File in Data URI format from Browser to Desktop将 Data URI 格式的文件从浏览器拖到桌面
【发布时间】:2025-12-05 11:45:01
【问题描述】:

正如this blog post 指出的那样,有一种方法可以通过从浏览器拖放到桌面来下载文件。

我想将数据 uri 格式的文件(例如“data:application/octet-stream;base64,eNcoDEdFiLEStuFf”)拖到桌面。由于安全原因,我无法提供服务器下载的完整 URL(文件需要在客户端处理)。

当我尝试博客文章示例中给出的内容时,会创建一个内容和名称为当前时间戳的文件:

item.addEventListener("dragstart", function(evt) {
    evt.dataTransfer.setData("DownloadURL", "data:application/octet-stream;base64,eNcoDEdFiLEStuFf");
}

我已经尝试更改格式参数,稍微调整数据格式并事先进行解构,但没有任何效果,我从来没有将任何数据放到我的桌面上。至少在某些浏览器中,有什么方法可以完成我正在寻找的东西吗?

顺便说一下,我们不使用 jQuery。因此,如果有一个使用 jQuery 的解决方案可能会很有趣,但这很可能不适用于我们的项目。

【问题讨论】:

    标签: javascript html


    【解决方案1】:

    据我所知,下载 URL 应具有以下格式: 哑剧类型:文件名:URL。是 URL 是您的数据 URI。 对于您的情况:

    item.addEventListener("dragstart", function(evt) {
        evt.dataTransfer.setData("DownloadURL", "application/octet-stream:fileName.bin:data:application/octet-stream;base64,eNcoDEdFiLEStuFf");
    }
    

    应该创建fileName.bin文件。

    看看http://jsfiddle.net/Andrei_Yanovich/jqym7wdh/ 但看起来它只适用于chrome

    【讨论】:

    • 我也试过那个,没有用...创建了与其他方式相同的“时间戳文件”
    • 好的,我重新检查了你的 jsfiddle 和我的代码。虽然这绝对是您的工作方式,但它不在我的代码中,但这是我的问题:( 对于遇到此问题的其他人:我在 dragstart 期间使用异步调用并在其调用 evt.dataTransfer.setData()响应。看来,这个函数只能在事件处理程序的开头调用。
    最近更新 更多