HTML代码
<input type="file" name="" id="upload">
JS代码
const upload = document.getElementById('upload')
upload.addEventListener('change', (e) => changeCallback(e))
function changeCallback(e) {
const FILE_SIZE = 4 * 1024 * 1024
const FILE_DESC = '1MB'
const FILE_TYPE = ['image/png', 'image/gif']
const [file] = e.target.files
const {
size: fileSize,
type: fileType
} = file
const index = FILE_TYPE.findIndex(item => {
return item === fileType
})
if (index < 0) {
alert(`不支持[${fileType}]文件类型`)
upload.value = ''
return
}
if (fileSize > FILE_SIZE) {
alert(`文件大于${FILE_DESC}`)
upload.value = ''
return
}
convertImageBase64(file, (base64Image) => compress(base64Image, uploadToServer))
}
function convertImageBase64(file, callback) {
const reader = new FileReader()
reader.addEventListener('load', (e) => {
const base64 = e.target.result
callback && callback(base64)
})
reader.readAsDataURL(file)
}
function compress(base64Image, callback) {
let maxW = 1024
let maxH = 1024
const image = new Image()
image.addEventListener('load', (e) => {
let ratio
let needCompress = false
const imageW = image.naturalWidth
const imageH = image.naturalHeight
if (maxW < imageW) {
needCompress = true
ratio = imageW / maxW
maxH = imageH / ratio
}
if (maxH < imageH) {
needCompress = true
ratio = imageH / maxH
maxW = imageW / ratio
}
if (!needCompress) {
maxW = imageW
maxH = imageH
}
const canvas = document.createElement('canvas')
canvas.setAttribute('id', '__compress__')
canvas.width = maxW
canvas.height = maxH
canvas.style.visibility = 'hidden'
document.body.appendChild(canvas)
const ctx = canvas.getContext('2d')
ctx.clearRect(0, 0, maxW, maxH)
ctx.drawImage(image, 0, 0, maxW, maxH)
const compressImage = canvas.toDataURL('image/jpeg', 0.9)
callback(compressImage)
canvas.remove()
const __image__ = new Image()
__image__.src = compressImage
document.body.appendChild(__image__)
})
image.src = base64Image
document.body.appendChild(image)
}
function uploadToServer(compressImage) {
console.log('upload to server ...');
}