常见方法
FormData
前端
1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input type="file" id="fileInp" accept="image/*">
<br>
<img src="" alt="" id="serverImg">
<script src="./js/md5.min.js"></script>
<script src="./js/ajax.js"></script>
<script>
const limitType = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif']
const limitSize = 100 * 1024
fileInp.onchange = async function() {
let file = fileInp.files[0]
if(!file) return
if(!limitType.includes(file.type)){
alert('文件格式不支持!')
fileInp.value = null
return
}
if(file.size > limitSize) {
alert('文件大小超限!')
fileInp.value = null
return
}
let formData = new FormData() // Content-Type: mutilpart/form-data
formData.append('chunk', file)
formData.append('filename', $formatFileName(file.name).filename)
const result = await $ajax({
url: 'http://127.0.0.1:5678/single',
data: formData
})
if (result.code == 0) {
serverImg.src = result.path
}
}
</script>
</body>
</html>
js/ajax.js
function $ajax(options) {
options = Object.assign({
url: '',
method: 'post',
data: null,
headers: {}
}, options)
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest
xhr.open(options.method, options.url)
Object.keys(options.headers).forEach(key => {
xhr.setRequestHeader(key, options.headers[key])
})
xhr.onreadystatechange = () => {
if(xhr.readyState === 4) {
if(/^(2|3)\d{2}$/.test(xhr.status)) {
resolve(JSON.parse(xhr.responseText))
return
}
reject(xhr)
}
}
xhr.send(options.data)
})
}
function $formatFileName(filename) {
const dotIndex = filename.lastIndexOf('.')
let name = filename.substring(0, dotIndex)
const ext = filename.substring(dotIndex+1)
name = md5(name) + new Date().getTime()
return {
hash: name,
ext,
filename: `${name}.${ext}`
}
}