js增加属性_前端js实现文件下载

前端js实现文件下载

why?为什么需要前端下载文件?

简单,相对于流下载,然后解析。
用浏览器自身暴露的一些钩子函数和特性,相对来说会更简单,做起来也会更加方便

how? 怎么做前端下载?

常见的几种下载模式

  • a标签下载
  • canvas下载
    ### why?为啥可以用标签下载?
  • 原因
    因为浏览器提供了钩子,而且在html5当中新增了download属性。
    浏览器支持,当改属性的链接被点击时,浏览器会以下载文件的方式下载href的属性上的链接
    这就是所谓的“钩子”,不过这个是通过标签属性做的(其实js和python的精髓,个人认为也是最底层细节的封装和“钩子函数的暴露”)
  • 兼容性

2ce656aa21dc2b5e6d346a906993f5be.png

所以IE是不支持的,但是如果是做内部的后台业务,download属性是很合适的,同时electron做客户端的话, 也是可以的。

ps:download是绑定的a标签上的

  • 所以?show me the code
function download(href, title) {
    const a = document.createElement('a');
    a.setAttribute('href', href);
    a.setAttribute('download', title);
    a.click();
}

其实原理很简单,就是动态的增加一个a标签,然后动态的去增加download属性,然后click一下,完事。
href是http/https可以这样干,那么如果href是data url呢?
如果协议是data协议呢?
download('data:,Hello%2C%20World!', 'data-uris.txt');
没啥区别

  • 那你说的canvas下载是啥意思啊?
    当url时data协议的时候,可以通过toDataURL()获取data urls的内容 const canvas = document.querySelector('#canvas');download(canvas.toDataURL(), 'download-image'); 那么这样也是可以下载下来的
    #如果我一定要兼容ie呢?
    那就不要用前端下载了,用Blob格式去下载,不要去那json格式,而是让后端用Blob格式,传输文件数据。
关于 Vue 实现文本的拖拽,可以使用 Vue 的指令来实现。首先需要在元素上绑定 `v-draggable` 指令,然后在指令中实现拖拽的逻辑。 以下是一个简单的实现示例: ``` <template> <div v-draggable> 拖拽我 </div> </template> <script> export default { directives: { draggable: { bind: function (el, binding) { let startX, startY, initialMouseX, initialMouseY function onMouseDown (event) { startX = el.style.left || '0px' startY = el.style.top || '0px' initialMouseX = event.clientX initialMouseY = event.clientY document.addEventListener('mousemove', onMouseMove) document.addEventListener('mouseup', onMouseUp) } function onMouseMove (event) { const dx = event.clientX - initialMouseX const dy = event.clientY - initialMouseY el.style.left = parseInt(startX) + dx + 'px' el.style.top = parseInt(startY) + dy + 'px' } function onMouseUp () { document.removeEventListener('mousemove', onMouseMove) document.removeEventListener('mouseup', onMouseUp) } el.addEventListener('mousedown', onMouseDown) } } } } </script> ``` 关于前端实现文件下载,可以使用 JavaScript 的 `Blob` 和 `URL.createObjectURL` 方法来实现。首先需要创建一个 `Blob` 对象,然后使用 `URL.createObjectURL` 方法生成一个 URL,将这个 URL 赋值给 `<a>` 标签的 `href` 属性,最后模拟点击这个 `<a>` 标签即可。 以下是一个简单的实现示例: ``` <template> <div> <button @click="downloadFile">下载文件</button> </div> </template> <script> export default { methods: { downloadFile () { const content = '这是要下载的文件内容' const blob = new Blob([content], { type: 'text/plain;charset=utf-8' }) const url = URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = 'file.txt' link.click() URL.revokeObjectURL(url) } } } </script> ``` 关于前端实现拖拽上传,可以使用 HTML5 的 `drag` 和 `drop` 事件来实现。首先需要在元素上监听 `dragover` 和 `drop` 事件,并阻止默认行为,然后在 `drop` 事件中获取拖拽的文件,最后将文件上传至服务器即可。 以下是一个简单的实现示例: ``` <template> <div @dragover.prevent @drop.prevent="uploadFile"> 拖拽文件上传 </div> </template> <script> export default { methods: { uploadFile (event) { const files = event.dataTransfer.files // 将文件上传至服务器 } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值