文件上传方式
Ajax做文件上传就会有兼容性的问题。只有一些高版本的浏览器可以实现文件上传的功能。Ie6 ie7 低版本浏览器不能实现。因为ajax文件上传用到Formdata,它是h5新增的,有兼容问题,低版本浏览器不支持。
数据往formdata中加:
调用formdata的append方法,用原生dom对象的file的第0个获取到上传的文件。发aiax请求,用post请求方式,添加属性。
原生ajax上传代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<p>data</p><input id='data' type="file" name="data" />
<p>type</p><input id='input1' type="text" value='image/jpg' name="type" />
<input type="button" value="添加文件" id="btn" />
</body>
</html>
<script>
btn.onclick = function () {
// 前后端交互
var xhr = new XMLHttpRequest();
xhr.open("POST", "请求接口", true);// 把数据传过去,true:异步 false:同步
var formData = new FormData();
formData.append("type", input1.value);
formData.append("data", data.files[0]);
xhr.send(formData);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
var flag = xhr.responseText;//把响应拿回来
console.log(flag);
}
}
}
</script>
Jquery ajax
上传代码
注意:在ajax
发送请求时要加上以下三个属性:不加会报错
Cache:false
processData:false
contentType:false
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<p>data</p><input id='data' type="file" name="data" />
<p>type</p><input id='input1' type="text" value='image/jpg' name="type" />
<input type="button" value="添加文件" id="btn" onclick="test();" />
</body>
</html>
<script>
function test() {
var formData = new FormData();
formData.append("type", input1.value);
formData.append("data", data.files[0]);
$.ajax({
url: "请求接口",
method: "POST",
cache: false, // 文件不设置缓存
data: formData,
processData: false, // 数据不被转换为字符串
contentType: false, // 上传文件时使用,避免 JQuery 对其操作
success: function (result) {
console.log(result);
}
})
}
</script>
axios
上传代码
let formData = new FormData();
formData.append('type', input1.value);
formData.append('data', data.files[0]);
axios({
method: 'post',
url: "请求接口",
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
},
onUploadProgress: function (e) {
// 对原生进度事件的处理
console.log('上传进度计算',(e.loaded/e.total*100).toFixed(2)+'%')
}
})
.then(res => {
})
.catch(err => {
});
Axios
上传阿里云
const res = await axios({
method: 'put',
url,
data: data.file,// 流文件
headers: {
'Content-Type':'application/octet-stream', // 设置特定的头部
},
// `onUploadProgress` 允许为上传处理进度事件
onUploadProgress: function (e) {
// 对原生进度事件的处理
console.log('上传进度计算',(e.loaded/e.total*100).toFixed(2)+'%')
}
})
console.log('上传结果1111',res)
在线演示:传送门
Base64
转换成流
// ------------------将base64转换为blob----------------
let arr = data.content.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let bstr = atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
let blob = new Blob([u8arr], { type: mime })
// ------------------将base64转换为blob----------------
// 向流文件中添加相关参数
blob.lastModifiedDate = new Date()
blob.name = data.file.name
let formData = new FormData()
formData.append('businessNo', '20191218OTHER217C10233')
formData.append('businessType', 'DEMO')
formData.append('systemType', "DEMO")
formData.append('uploadType', 'formfile')
formData.append('isNeedPub', '0')
formData.append('pubLimitTime', 43200)
formData.append('upload', theBlob, theBlob.name)
formData.append('data', blob, blob.name)
Vue
项目中封装配置
/*----- http.js -----*/
upLoadFile(url, method, data, callback) {
return axios({
method: method,
url,
data,
headers: {
'Content-Type': 'multipart/form-data', // 设置特定的头部
},
onUploadProgress: function (e) {
// 对原生进度事件的处理 (e.loaded/e.total*100).toFixed(2)+'%'
let progress = (e.loaded / e.total * 100).toFixed(2)
callback && callback(progress, e)
}
})
}
/*------api.js-----*/
import http from '@/utils/http'
const URL = process.env.VUE_APP_BASE_LOCAL
export default {
// 名单导入
nameImportUpData (params, callback) {
return http.upLoadFile(URL + '/ImportController/importData', 'POST', params, callback)
}
}
<!-- template.vue -->
<template>
<section>
<el-button @click="uploadFile">一键导入</el-button>
</section>
</template>
<script>
import nameImport from '@/api/nameImport'
export default {
methods: {
uploadFile () {
const input = document.createElement('input')
input.style.display = 'none'
input.type = 'file'
input.accept = '.xls,.xlsx'
document.body.appendChild(input)
input.click()
input.onchange = () => {
const fileTypes = ['xls', 'xlsx']
const file = input.files[0]
const fileType = file.name.split('.')[1]
const flag = fileTypes.includes(fileType)
if (!flag) {
this.$message.error('请选择excel文件上传!')
return
}
const formData = new FormData()
formData.append('excelFile', file)
document.body.removeChild(input)
nameImport.nameImportUpData(formData, (progress) => {
console.log('进度', progress)
}).then((res) => {
console.log(res)
if (res && res.result === '0') {
this.$message.success('导入成功!')
} else {
this.$message.error(res.resultMessage)
}
})
}
}
}
}
</script>