[update 83990] 上传heic格式图片处理
This commit is contained in:
Generated
+5
@@ -10630,6 +10630,11 @@
|
|||||||
"resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
|
"resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
|
||||||
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
|
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
|
||||||
},
|
},
|
||||||
|
"heic2any": {
|
||||||
|
"version": "0.0.4",
|
||||||
|
"resolved": "https://registry.npmmirror.com/heic2any/-/heic2any-0.0.4.tgz",
|
||||||
|
"integrity": "sha512-3lLnZiDELfabVH87htnRolZ2iehX9zwpRyGNz22GKXIu0fznlblf0/ftppXKNqS26dqFSeqfIBhAmAj/uSp0cA=="
|
||||||
|
},
|
||||||
"hex-color-regex": {
|
"hex-color-regex": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
|
"resolved": "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
"dom-align": "1.12.0",
|
"dom-align": "1.12.0",
|
||||||
"echarts": "^5.4.2",
|
"echarts": "^5.4.2",
|
||||||
"enquire.js": "^2.1.6",
|
"enquire.js": "^2.1.6",
|
||||||
|
"heic2any": "0.0.4",
|
||||||
"js-base64": "^3.6.0",
|
"js-base64": "^3.6.0",
|
||||||
"js-cookie": "^2.2.0",
|
"js-cookie": "^2.2.0",
|
||||||
"jsencrypt": "^3.0.0-rc.1",
|
"jsencrypt": "^3.0.0-rc.1",
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
:max-size="global.maxUploadFileSize"
|
:max-size="global.maxUploadFileSize"
|
||||||
@oversize="onOversize"
|
@oversize="onOversize"
|
||||||
v-model="fileList"
|
v-model="fileList"
|
||||||
|
:after-read="handleAfterRead"
|
||||||
max-count="1"></van-uploader>
|
max-count="1"></van-uploader>
|
||||||
</div>
|
</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
@@ -49,7 +50,9 @@ import { queryDepartTreeList } from '@api/api'
|
|||||||
import DictPicker from '@comp/vant/DictPicker'
|
import DictPicker from '@comp/vant/DictPicker'
|
||||||
import SelectPicker from '@comp/vant/SelectPicker'
|
import SelectPicker from '@comp/vant/SelectPicker'
|
||||||
import { getAction, getFileAccessHttpUrl } from '@api/manage'
|
import { getAction, getFileAccessHttpUrl } from '@api/manage'
|
||||||
|
import heic2any from 'heic2any'
|
||||||
import { Toast } from 'vant'
|
import { Toast } from 'vant'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Mine',
|
name: 'Mine',
|
||||||
components: { SelectPicker, DictPicker },
|
components: { SelectPicker, DictPicker },
|
||||||
@@ -90,6 +93,71 @@ export default {
|
|||||||
this.getUserDeparts(this.model.id)
|
this.getUserDeparts(this.model.id)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 文件读取完成
|
||||||
|
handleAfterRead (file) {
|
||||||
|
// 先不回显图片(上传中)
|
||||||
|
this.fileList = [{ status: 'uploading' }]
|
||||||
|
// 判断是否heic格式与后缀不对的图片
|
||||||
|
this.isHEICFile(file.file)
|
||||||
|
// 如果是heic转成真正的后缀图片,否则就展示当前的图片
|
||||||
|
.then(bool => {
|
||||||
|
console.log(bool, 'isHEICFile')
|
||||||
|
if (bool) {
|
||||||
|
return heic2any({
|
||||||
|
blob: file.file,
|
||||||
|
toType: file.file.type,
|
||||||
|
quality: 1
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.fileList = [{
|
||||||
|
isImage: true,
|
||||||
|
url: URL.createObjectURL(file.file)
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 成功了就显示转换后的图片
|
||||||
|
.then(blob => {
|
||||||
|
if (blob) {
|
||||||
|
this.fileList = [{
|
||||||
|
url: URL.createObjectURL(blob),
|
||||||
|
isImage: true
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// 失败了就不显示
|
||||||
|
.catch(err => {
|
||||||
|
console.log(err.message)
|
||||||
|
Toast('上传图片格式有误,请重试')
|
||||||
|
this.fileList = []
|
||||||
|
})
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 判断文件是否heic图片
|
||||||
|
* @param file
|
||||||
|
* @description heic格式hex参考 https://www.garykessler.net/library/file_sigs.html
|
||||||
|
* @return {Promise<unknown>}
|
||||||
|
*/
|
||||||
|
isHEICFile (file) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const reader = new FileReader()
|
||||||
|
const offset = 4
|
||||||
|
const blob = file.slice(offset, 8 + offset) // 取文件的前8位,偏移4位
|
||||||
|
|
||||||
|
reader.onload = function () {
|
||||||
|
const uint8Arr = new Uint8Array(reader.result)
|
||||||
|
const HEIC_HEADER = [0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63]
|
||||||
|
for (let i = 0; i < HEIC_HEADER.length; i++) {
|
||||||
|
if (uint8Arr[i] !== HEIC_HEADER[i]) {
|
||||||
|
resolve(false)
|
||||||
|
}
|
||||||
|
if (i === HEIC_HEADER.length - 1) {
|
||||||
|
resolve(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reader.readAsArrayBuffer(blob)
|
||||||
|
})
|
||||||
|
},
|
||||||
onOversize () {
|
onOversize () {
|
||||||
Toast('最大上传图片20MB')
|
Toast('最大上传图片20MB')
|
||||||
},
|
},
|
||||||
@@ -168,6 +236,9 @@ export default {
|
|||||||
width: 1.2rem;
|
width: 1.2rem;
|
||||||
height: 1.2rem;
|
height: 1.2rem;
|
||||||
}
|
}
|
||||||
|
/deep/ .van-uploader__file {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
/deep/ .van-uploader__preview-image {
|
/deep/ .van-uploader__preview-image {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
@@ -181,6 +252,9 @@ export default {
|
|||||||
font-size: 0.16rem;
|
font-size: 0.16rem;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
/deep/ .van-uploader__mask {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
Reference in New Issue
Block a user