接口下载文件
(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.message
return;
}
// 返回流时进行处理
// 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;
}
})