文件下载
传统的文件下载有两种方法:
- 使用<a/>标签,href属性直接连接到服务器的文件路径
- window.location.href="url"
这两种方法效果一样。但有个很大的问题,如果下载出现异常(连接路径失效、文件不存在、网络问题等),会导致原本的页面被覆盖掉,显示404等错误信息。
大致的优化思路如下:
- 使用<a/>标签HTML5新的属性download。
- 使用<iframe><iframe/>元素进行下载。
- 使用ajax、axios、fetch等方法异步下载。
- 使用websocket下载。
我们来逐一分析:
- <a/>标签的download属性,需要和href一起用,download的作用是为下载的文件赋文件名。
- 如果服务端没有指定文件名,就以此属性规定的名称命名。
- 如果下载出现异常,该属性的存在能够保证页面不会出问题。
- 如果服务端返回的不是文件、而是字符,如果download=‘’error.txt”,能够通过打开此文件查看到返回的文本信息。
- <iframe>标签可以做到在现有的页面下,内嵌一个子页面。当用户点击文件下载时,将隐藏的iframe元素的src属性指向文件下载路径。
- 如果没有异常,文件将会直接下载。
- 如果出现异常,iframe子页面会报错,父页面不会受任何影响。
- 使用异步请求进行下载。
- 在网上看了看,大致的流程是:发送异步请求时设置responseType为blob,即接收流数据为blob对象保存在内存中。接收完成后,生成链接地址(1.通过FileReader对象将blob对象生成base64编码 2.通过URL.createObjectURL生成指向文件内存的链接),写入<a/>标签的href属性,然后模拟点击<a/>按标签实现下载。
- 此方法最大的问题是,因无法直接操作磁盘,故接收的文件必须先存放在内存中(且只有传输完成后才能构建blob对象),才能转化成文件。因此,大文件的下载可能会把你的浏览器挤爆。
- 使用websocket下载。
- 需要额外开启websocket服务,此方法未做实践。
总结以上方法,最推荐前两种,方便简单。
附上后端Django代码(适用于前两种方法):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
参考链接:
https://scarletsky.github.io/2016/07/03/download-file-using-javascript/
https://my.oschina.net/watcher/blog/1525962
文件上传
概述
文件上传需要处理的问题有:
1.多文件上传 2.异步上传 3.拖拽上传 4.上传限制(限制大小、类型) 5.显示上传进度、上传速度、中途取消上传 6.预览文件
HTML DEMO
1 2 |
|
一、多文件上传
1 |
|
二、异步上传
通过ajax等方式异步上传,FormData对象支持传输文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
三、拖拽上传
默认文本、图像和链接可以被拖动。其它的元素想要被拖动,只需为标签加一个draggable="true"属性
1 |
|
HTML5 API drag 和 drop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
参考链接:
https://developer.mozilla.org/zh-CN/docs/Web/API/HTML_Drag_and_Drop_API
https://developer.mozilla.org/zh-CN/docs/Web/API/DataTransfer
https://www.zhangxinxu.com/wordpress/2018/09/drag-drop-datatransfer-js/
http://www.sohu.com/a/198973397_291052
四、上传限制
1 |
|
此外,获取到的File对象中有type属性可以得知文件类型,size属性的得知文件大小
五、上传进度、上传速度、中途取消上传
原生API
1 2 3 4 5 6 7 8 9 10 11 12 |
|
单文件上传 或 多文件串行上传 Demo:(该Demo只会有一个进度条,显示上传总进度。对应“异步上传”的代码)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
多文件并行上传进度显示:(多个进度条,分别上传)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
|
六、预览文件
预览图片
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
七、前后端汇总Demo
前端
HTML
1 2 |
|
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
|
Django后端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
参考:
https://www.cnblogs.com/potatog/p/9342448.html
https://www.w3cmm.com/ajax/progress-events.html
文章来源:https://www.cnblogs.com/V587Chinese/p/11371380.html