接口下载文件
(1)直接使用一个 a 标签,其接口必须是使用 GET 请求
<a href="后端文件下载接口地址" >下载文件</a>//=> 或者动态生成var aLink = document.createElement('a');aLink.href = url;aLink.click();aLink = null;
但是这样存在问题,就是在接口报错时,没有办法处理。使用这种方式必须明确接口没有问题
(2)请求之后自己生成链接或者再创建 a 标签进行手动点击
需要与后端约定,错误时,返回错误信息和标识,成功时返回流
$.ajax({url,success(res) {// 成功之后// code 为 1 时返回 错误信息if(res.code == '1') {// res.messagereturn;}// 返回流时进行处理// 1. 自己生成 blob 链接var data = res.response;var aLink = document.createElement('a');var blob = new Blob([data]);var blobUrl = window.URL.createObjectURL(blob);aLink.href = url;aLink.download = "filename"; // 这种方式必须要手动设置文件名aLink.click();aLink = null;// 2. 创建 a 标签手动点击var aLink = document.createElement('a');aLink.href = url;aLink.click();aLink = null;},error(err) {// err}})
保存文本数据为 JSON、TXT、HTML 等文件
function saveAsJson(data) {let blob = new Blob([JSON.stringify(data)], { type: "" });let alink = document.createElement("a");alink.id = "download";alink.href = URL.createObjectURL(blob);alink.setAttribute('download', 'data.json');alink.click();alink = null;}
保存 SVG 为 PNG
function saveAsPng(svg) {var serializer = new XMLSerializer();var source = '<?xml version="1.0" standalone="no"?>\r\n' + serializer.serializeToString(svg);var image = new Image;image.src = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(source);var canvas = document.createElement("canvas");canvas.width = svg.width;canvas.height = svg.width;var context = canvas.getContext("2d");context.fillStyle = '#fff';//#fff设置保存后的PNG 是白色的context.fillRect(0, 0, 10000, 10000);image.onload = function() {context.drawImage(image, 0, 0);var a = document.createElement("a");a.download = "name.png";a.href = canvas.toDataURL("image/png");a.click();};}
上传特定文件
只需要设定 input 框的 accept 属性即可:值为字符串。
可以指定特定的后缀:
<input type="file" accept=".jpg,.jpeg,.png,.gif" /> // 指定后缀
也可以指定类型:
<input id="fileId1" type="file" accept="image/png,image/gif" name="file" /> // png 和 gif 图片<input type="file" accept="image/*" /> // 所有图片
即值为 MIME 类型,多个可以使用逗号隔开。
常用的 MIME 类型
后缀名 MIME名称*.3gpp audio/3gpp, video/3gpp*.ac3 audio/ac3*.asf allpication/vnd.ms-asf*.au audio/basic*.css text/css*.csv text/csv*.doc application/msword*.dot application/msword*.dtd application/xml-dtd*.dwg image/vnd.dwg*.dxf image/vnd.dxf*.gif image/gif*.htm text/html*.html text/html*.jp2 image/jp2*.jpe image/jpeg*.jpeg image/jpeg*.jpg image/jpeg*.js text/javascript, application/javascript*.json application/json*.mp2 audio/mpeg, video/mpeg*.mp3 audio/mpeg*.mp4 audio/mp4, video/mp4*.mpeg video/mpeg*.mpg video/mpeg*.mpp application/vnd.ms-project*.ogg application/ogg, audio/ogg*.pdf application/pdf*.png image/png*.pot application/vnd.ms-powerpoint*.pps application/vnd.ms-powerpoint*.ppt application/vnd.ms-powerpoint*.rtf application/rtf, text/rtf*.svf image/vnd.svf*.tif image/tiff*.tiff image/tiff*.txt text/plain*.wdb application/vnd.ms-works*.wps application/vnd.ms-works*.xhtml application/xhtml+xml*.xlc application/vnd.ms-excel*.xlm application/vnd.ms-excel*.xls application/vnd.ms-excel*.xlt application/vnd.ms-excel*.xlw application/vnd.ms-excel*.xml text/xml, application/xml*.zip aplication/zip*.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
读取文件内容
当文件上传成功后,使用 FileReader 来读取文件内容:
input.addEventListener('change', (e) => {let reader = new FileReader();reader.readAsText(e.target.files[0], "UTF-8");reader.onload = (ev) => {let result = ev.target.result;}})
