图片分辨率
getImageInfo(url, callback) {
const reader = new FileReader()
reader.readAsDataURL(url)
reader.onload = function() {
if (reader.readyState === 2) {
const img = new Image()
img.src = reader.result
img.onload = function() {
callback(img.width, img.height)
}
}
}
},
that.getImageInfo(files[0], function(width, height) {
// 在这里面使用
})
<template>
<div class="content">
<div class="uploadbox">
<el-upload
ref="upload"
:show-file-list="false"
drag
action="#"
:before-upload="handleChange"
:http-request="uploadHttpRequest"
accept=".zip"
>
<i class="el-icon-upload" />
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div slot="tip" class="el-upload__tip">
只能上传zip文件
</div>
</el-upload>
</div>
<el-dialog
title="上传"
:visible.sync="dialogVisible"
width="500px"
:close-on-press-escape="false"
:close-on-click-modal="false"
:show-close="zippercent == 100 || zippercent == -1"
@close="closeDialog"
>
<div class="redtext">注意:上传过程中请勿刷新或关闭当前网页</div>
<div class="namebox">
<div class="left">
{{ zipname }}
</div>
<div v-if="zippercent == -1">
<i class="el-icon-warning" /><span
class="ml10"
>上传失败</span>
</div>
<div v-else-if="zippercent == -2">
<i class="el-icon-loading" />
<span class="ml10">文件检验中</span>
</div>
<div v-else>
<div v-if="zippercent != 100" class="right">
{{ zippercent }}%
<span
class="ml10"
>{{
parseInt(num) + Math.floor(Math.random() * 100 + 1)
}}kb/s</span>
</div>
<div v-if="zippercent == 100">
<i class="el-icon-success" />
<span class="ml10">上传成功</span>
</div>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import { dictList } from '@/api/index'
import { materialAdd } from '@/api/v2.0/upload'
import messageup from '@/utils/resetMessage'
import JsZip from 'jszip'
const getDate = function() {
const D = new Date()
const year = D.getFullYear()
const month = D.getMonth() + 1
const date = D.getDate()
const hours = D.getHours()
const mins = D.getMinutes()
const secs = D.getSeconds()
return `${year}${month}${date}${hours}${mins}${secs}`
}
export default {
name: 'Upload',
data() {
return {
zippercent: 0,
dialogVisible: false,
num: 0,
zipname: '',
accepts: ['application/zip', 'application/x-zip-compressed', 'application/x-zip'],
filenameArray: [],
saveFile: '',
typeList: [],
saveZipurl: '',
saveResolute: '',
savexMax: '',
saveyMax: '',
savetargetName: [],
isWidthHeight: false,
saveFolder: ''
}
},
watch: {},
created() {},
mounted() {
this.getTypeList()
},
methods: {
// 获取类型枚举
getTypeList() {
dictList().then(res => {
this.typeList = res.datas.typeList
})
},
// 具体规则看 assets/book.jpg
uploadHttpRequest() {},
isAllTypeName(array) {
if (array.length > 0) {
return !array.some(function(value, index) {
return value !== array[0]
})
} else {
return true
}
},
isAllWidthHeight(array) {
if (array.length > 0) {
return !array.some(function(value, index) {
return (
value.height !== array[0].height || value.width !== array[0].width
)
})
} else {
return true
}
},
handleChange(file) {
console.log(file)
const that = this
that.zippercent = 0
that.saveFile = file
that.zipname = file.name.substring(0, file.name.lastIndexOf('.'))
const isAccept = that.accepts.includes(file.type)
if (!isAccept) {
that.$message.warning('请上传zip格式文件')
return
}
that.dialogVisible = true
that.zippercent = -2
var new_zip = new JsZip()
new_zip.loadAsync(file).then(zip => {
var isExistDir = false
that.filenameArray = []
for (const name in zip.files) {
const target = zip.files[name]
that.filenameArray.push(zip.files[name])
if (target.dir) {
isExistDir = true
continue
}
}
if (isExistDir) {
that.$message.warning(
'压缩包内仅包含图片文件,不得有其他文件或文件夹'
)
that.dialogVisible = false
return
} else {
const length = Object.keys(zip.files).length
if (
length === 72 ||
length === 120 ||
length === 360 ||
length === 200 ||
length === 648
) {
console.log('开始校验promise', new Date())
const promises = []
for (let i = 0; i < length; i++) {
var name = that.filenameArray[i].name
promises.push(
new Promise((resolve, reject) => {
// 解压图片并转换为base64
zip
.file(name)
.async('base64')
.then(base64 => {
const img = new Image()
img.onload = e => {
const { width, height } = img
if (width !== height) {
reject('有文件尺寸错误,请上传1:1比例的图片')
that.dialogVisible = false
return
} else {
resolve(img)
}
}
img.onerror = e => {
reject('有文件读取失败,请检查该文件是否正常')
that.dialogVisible = false
}
img.src = `data:image/png;base64,${base64}`
})
})
)
}
Promise.all(promises)
.then(list => {
console.log('promise结束', new Date())
var istrueState = false
for (let index = 0; index < list.length; index++) {
that.saveResolute = {
width: list[0].width,
height: list[0].height
}
if (
list[index].width < 1500 ||
list[index].width > 3000 ||
list[index].height < 1500 ||
list[index].height > 3000
) {
istrueState = true
continue
}
}
if (istrueState) {
messageup({
type: 'warning',
showClose: false,
message: '分辨率要求在1500~3000之间'
})
that.dialogVisible = false
return
}
// console.log('length', length)
// console.log(that.isAllWidthHeightnum(list))
if (that.isAllWidthHeight(list) === true) {
if (length === 72) {
that.saveType = that.typeList.find(item => {
return item.name === '360'
})
that.savexMax = 72
that.saveyMax = 1
that.threeSixzero(zip, length, '360')
} else if (length === 120) {
that.saveType = that.typeList.find(item => {
return item.name === '540'
})
that.savexMax = 20
that.saveyMax = 5
that.fiveFourzero(zip, length, '540')
} else if (length === 360) {
that.saveType = that.typeList.find(item => {
return item.name === '540 Pro'
})
that.savexMax = 36
that.saveyMax = 9
that.fiveFourzeropro(zip, length, '540Pro')
} else if (length === 200) {
that.saveType = that.typeList.find(item => {
return item.name === '720'
})
that.savexMax = 20
that.saveyMax = 5
that.sevenTwozero(zip, length, '720')
} else if (length === 648) {
that.saveType = that.typeList.find(item => {
return item.name === '720 Pro'
})
that.savexMax = 36
that.saveyMax = 9
that.sevenTwozeropro(zip, length, '720Pro')
}
} else {
that.$message.warning('素材图片分辨率不一致')
that.dialogVisible = false
return
}
})
.catch(msg => {
messageup({
type: 'warning',
showClose: false,
message: msg
})
})
} else {
that.$message.warning(
'压缩包内图片数量错误,请校对各个模式(360,540,540 Pro,720,720 Pro)下的数量规则'
)
that.dialogVisible = false
return
}
}
})
},
// 360判断 72
threeSixzero(zip, length, typeName) {
const that = this
var isNametrue = false
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
that.savetargetName.push(target.name)
if (target.name.split('.')[0] === '00') {
isNametrue = true
continue
}
if (parseInt(target.name.split('.')[0]) > 72) {
isNametrue = true
continue
}
if (!/^([0-9][0-9]).(jpg)$/.test(target.name)) {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
} else {
that.uploadZip(that.saveFile, length, typeName)
}
},
// 540判断 120
fiveFourzero(zip, length, typeName) {
const that = this
var isNametrue = false
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
const first_num = target.name.split('.')[0].split('-')[0]
const second_num = target.name.split('.')[0].split('-')[1]
const imgType = target.name.split('.')[1]
that.savetargetName.push(target.name)
if (!/^([0][0-5])$/.test(first_num)) {
isNametrue = true
continue
}
if (!/^([0-2][0-9])$/.test(second_num)) {
isNametrue = true
continue
}
if (parseInt(second_num) === 0) {
isNametrue = true
continue
}
if (parseInt(second_num) > 20) {
isNametrue = true
continue
}
if (imgType !== 'jpg') {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
that.uploadZip(that.saveFile, length, typeName)
},
// 540pro判断 360
fiveFourzeropro(zip, length, typeName) {
const that = this
var isNametrue = false
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
that.savetargetName.push(target.name)
const first_num = target.name.split('.')[0].split('-')[0]
const second_num = target.name.split('.')[0].split('-')[1]
const imgType = target.name.split('.')[1]
if (!/^([0][0-9])$/.test(first_num)) {
isNametrue = true
continue
}
if (!/^([0-3][0-9])$/.test(second_num)) {
isNametrue = true
continue
}
if (parseInt(second_num) === 0) {
isNametrue = true
continue
}
if (parseInt(second_num) > 36) {
isNametrue = true
continue
}
if (imgType !== 'jpg') {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
that.uploadZip(that.saveFile, length, typeName)
},
// 720判断 200
sevenTwozero(zip, length, typeName) {
const that = this
var isNametrue = false
var Narray = []
var Sarray = []
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
that.savetargetName.push(target.name)
const NS = target.name.split('.')[0].split('-')[0]
if (NS === 'N') {
Narray.push(NS)
}
if (NS === 'S') {
Sarray.push(NS)
}
if (NS !== 'N' && NS !== 'S') {
isNametrue = true
continue
}
const first_num = target.name.split('.')[0].split('-')[1]
const second_num = target.name.split('.')[0].split('-')[2]
const imgType = target.name.split('.')[1]
if (!/^([0][1-5])$/.test(first_num)) {
isNametrue = true
continue
}
if (!/^([0-2][0-9])$/.test(second_num)) {
isNametrue = true
continue
}
if (parseInt(second_num) === 0) {
isNametrue = true
continue
}
if (parseInt(second_num) > 20) {
isNametrue = true
continue
}
if (imgType !== 'jpg') {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
if (Narray.length !== 100 || Sarray.length !== 100) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
that.uploadZip(that.saveFile, length, typeName)
},
// 720pro判断 648
sevenTwozeropro(zip, length, typeName) {
const that = this
var isNametrue = false
var Narray = []
var Sarray = []
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
that.savetargetName.push(target.name)
const NS = target.name.split('.')[0].split('-')[0]
if (NS === 'N') {
Narray.push(NS)
}
if (NS === 'S') {
Sarray.push(NS)
}
if (NS !== 'N' && NS !== 'S') {
isNametrue = true
continue
}
const first_num = target.name.split('.')[0].split('-')[1]
const second_num = target.name.split('.')[0].split('-')[2]
const imgType = target.name.split('.')[1]
if (!/^([0][1-9])$/.test(first_num)) {
isNametrue = true
continue
}
if (!/^([0-3][0-9])$/.test(second_num)) {
isNametrue = true
continue
}
if (parseInt(second_num) === 0) {
isNametrue = true
continue
}
if (parseInt(second_num) > 36) {
isNametrue = true
continue
}
if (imgType !== 'jpg') {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
if (Narray.length !== 324 || Sarray.length !== 324) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
that.uploadZip(that.saveFile, length, typeName)
},
uploadZip(file, length, typeName) {
const that = this
that.saveFolder = getDate() + '_' + typeName
that.zippercent = 0
that.$newalioss
.upload({
file,
// folder: 'zipmoviebooktest-decompression',
// folder: 'srczipmoviebooktest',
folder: that.saveFolder,
progress: percent => {
percent = ~~(percent * 100)
that.num = (percent - that.zippercent) * (file.size / 1024) * 0.01
that.zippercent = percent === 100 ? 99 : percent
}
})
.then(({ relative, absolute }) => {
// console.log(relative)
console.log(absolute)
that.saveZipurl = absolute
console.log('得到zip包地址开始交互', new Date())
that._materialAdd(Number(length))
// 调取一个接口this.zippercent = 100
})
.catch(msg => {
that.zippercent = -1
})
.finally(e => {})
},
_materialAdd(length) {
const that = this
// console.log(that.savetargetName)
// https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/2022627211258_540/00-01.jpg
const img_urlarr = that.savetargetName
const img_urlobj = {}
img_urlarr.forEach(item => {
img_urlobj[item.substring(0, item.lastIndexOf('.'))] =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/' +
item
})
const params = {
name: that.zipname,
type: that.saveType.id,
zip_url: that.saveZipurl,
img_url: img_urlobj,
xMax: that.savexMax,
yMax: that.saveyMax,
poster: '',
poster_url: '',
resolute: that.saveResolute
}
if (length === 72) {
params.poster = '01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/01.jpg'
} else if (length === 120) {
params.poster = '00-01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/00-01.jpg'
} else if (length === 360) {
params.poster = '00-01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/00-01.jpg'
} else if (length === 200) {
params.poster = 'N-01-01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/N-01-01.jpg'
} else if (length === 648) {
params.poster = 'N-01-01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/N-01-01.jpg'
}
materialAdd(params).then(res => {
if (res.status === 200) {
that.zippercent = 100
console.log('zip包地址接口上传成功等待解压', new Date())
} else {
that.$message.error(res.msg)
that.zippercent = -1
}
})
},
closeDialog() {
if (this.zippercent === -2 || this.zippercent === -1) {
return
}
if (
navigator.userAgent.indexOf('Firefox') !== -1 ||
navigator.userAgent.indexOf('Chrome') !== -1
) {
window.location.href = 'about:blank'
window.close()
} else {
window.opener = null
window.open('', '_self')
window.close()
}
}
}
}
</script>
<style lang="scss" scoped>
.content {
width: 100vw;
height: 100vh;
min-height: 500px;
display: flex;
.uploadbox {
margin: 15vh auto 0;
}
}
.el-upload__tip {
text-align: center;
padding-top: 10px;
}
.redtext {
font-weight: 400;
font-size: 12px;
color: rgb(255, 56, 56);
margin-top: 10px;
margin-left: 50px;
}
.namebox {
margin-left: 50px;
display: flex;
margin-top: 30px;
padding-bottom: 50px;
.left {
width: 250px;
color: rgba(0, 0, 0, 0.4);
font-size: 14px;
margin-right: 20px;
}
.right {
font-size: 14px;
color: rgb(29, 30, 31);
}
}
.el-icon-loading {
color: rgb(0, 168, 112);
}
.el-icon-success {
color: rgb(0, 168, 112);
}
.el-icon-warning {
color: rgb(227, 77, 89);
}
.ml10 {
margin-left: 10px;
}
</style>
'use strict'
import Vue from 'vue'
// import md5 from 'js-md5'
import OSS from 'ali-oss'
const client = new OSS({
region: 'oss-cn-beijing',
accessKeyId: 'LTAI5tMnN82db9sVbu1DEpXu',
accessKeySecret: 'dlXJjQNd27VS3lLH36zCUGwZRTwzHy',
bucket: 'media-manual',
secure: true
})
// const uuid = function() {
// function S4() {
// return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
// }
// return (S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4())
// }
const getDate = function() {
const D = new Date()
const year = D.getFullYear()
const month = D.getMonth() + 1
const date = D.getDate()
const hours = D.getHours()
const mins = D.getMinutes()
const secs = D.getSeconds()
return `${year}${month}${date}${hours}${mins}${secs}`
}
/**
* 阿里云OSS文件上传
* @param {file} file 需要上传的文件
* @param {string} folder 存储的文件夹
* @param {function} progress 进度回调
*/
Vue.prototype.$alioss = {
// folder 模型id商品id prefix项目名称 fileName:自带的文件名
upload({ file = null, folder, productid, modelid, progress = null }) {
if (productid === undefined) {
productid = 0
}
return new Promise((resolve, reject) => {
!file && reject('文件不能为空')
// console.log(file)
const { env } = window // 环境
const base =
env === 'development'
? 'test'
: ['dev', 'test'].includes(env)
? `${env}`
: ''
const prefix = '/htdocs/uploads/' // 前缀
// const suffix = (file.name || '').split('.').pop() // 文件后缀
// const fileName = `${getDate()}${md5(uuid())}.${suffix}` // 文件名
const modelnum = String(modelid) === '0' ? getDate() : modelid
const fileName = getDate() + '/' + productid + '/' + modelnum + '/' + window.encodeURIComponent(file.name) // 文件名
const intactPath = `${base}${prefix}${folder}/${fileName}` // 完整路径
const headers = {
// 指定该Object被下载时网页的缓存行为。
'Cache-Control': 'no-cache',
// 指定该Object被下载时的名称。
// 'Content-Disposition': 'oss_download.txt',
// 指定该Object被下载时的内容编码格式。
// 'Content-Encoding': 'UTF-8',
// 指定过期时间。
'Expires': getDate(),
// 指定Object的存储类型。
// 'x-oss-storage-class': 'Standard',
// 指定Object的访问权限。
// 'x-oss-object-acl': 'private',
// 设置Object的标签,可同时设置多个标签。
// 'x-oss-tagging': 'Tag1=1&Tag2=2',
// 指定CopyObject操作时是否覆盖同名目标Object。此处设置为true,表示禁止覆盖同名Object。
'x-oss-forbid-overwrite': 'false'
}
// console.log(fileName)
// console.log(intactPath)
// console.log(file)
// console.log(progress)
// client.options.key = fileName
// return
client
.multipartUpload(intactPath, file, { progress }, { headers })
.then(({ res }) => {
// status:出错请求的HTTP状态码
// statusCode:OSS的错误码
// message:OSS的错误信息
// eslint-disable-next-line no-unused-vars
const { status, statusCode, message, requestUrls } = res
if (status === 200 && statusCode === 200) {
// console.log(prefix + folder + fileName)
const path = {
relative: `${prefix}${folder}/${fileName}`, // 相对地址
absolute: requestUrls[0].split('?')[0] // oss绝对地址
}
// console.log(requestUrls[0])
// console.log(requestUrls[0].split('?')[0])
// console.log(path, message)
resolve(path)
} else {
// reject( message );
reject(null)
}
})
.catch(() => {
// reject( err.message );
reject(null)
})
})
}
}
/**
Vue.prototype.$alioss = function({ file = null, folder = 'other', progress = null }) {
return new Promise((resolve, reject) => {
!file && reject('文件不能为空');
let { env } = window //环境
, base = ['dev', 'test'].includes(env) ? `${env}` : ''
, prefix = '/htdocs/uploads/' //前缀
, suffix = (file.name || '').split('.').pop() //文件后缀
, fileName = `${getDate()}${md5(uuid())}.${suffix}` //文件名
, intactPath = `${base}${prefix}${folder}/${fileName}`; //完整路径
client.multipartUpload( intactPath, file, { progress }).then(({ res }) => {
let path = {
relative: `${prefix}${folder}/${fileName}`, //相对地址
absolute: res.requestUrls[0].split('?')[0] //oss绝对地址
};
console.log( path );
resolve( path );
}).catch( err => {
reject( err );
});
});
};
*/
/**
* 调用示例
this.$alioss({ file, folder: 'goodsPdf',
progress: percent => {
console.log(`${percent}%`);
}
}).then( src => {
console.log(src);
}).catch( e => {
this.$message.error( e );
});
*/
<template>
<div class="content">
<div class="uploadbox">
<el-upload
ref="upload"
:show-file-list="false"
drag
action="#"
:before-upload="handleChange"
:http-request="uploadHttpRequest"
accept=".zip"
>
<i class="el-icon-upload" />
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<div slot="tip" class="el-upload__tip">
只能上传zip文件
</div>
</el-upload>
</div>
<el-dialog
title="上传"
:visible.sync="dialogVisible"
width="500px"
:close-on-press-escape="false"
:close-on-click-modal="false"
:show-close="zippercent == 100 || zippercent == -1"
@close="closeDialog"
>
<div class="redtext">注意:上传过程中请勿刷新或关闭当前网页</div>
<div class="namebox">
<div class="left">
{{ zipname }}
</div>
<div v-if="zippercent == -1">
<i class="el-icon-warning" /><span
class="ml10"
>上传失败</span>
</div>
<div v-else-if="zippercent == -2">
<i class="el-icon-loading" />
<span class="ml10">文件检验中</span>
</div>
<div v-else>
<div v-if="zippercent != 100" class="right">
{{ zippercent }}%
<span
class="ml10"
>{{
parseInt(num) + Math.floor(Math.random() * 100 + 1)
}}kb/s</span>
</div>
<div v-if="zippercent == 100">
<i class="el-icon-success" />
<span class="ml10">上传成功</span>
</div>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import { dictList } from '@/api/index'
import { materialAdd } from '@/api/v2.0/upload'
import messageup from '@/utils/resetMessage'
import JsZip from 'jszip'
const getDate = function() {
const D = new Date()
const year = D.getFullYear()
const month = D.getMonth() + 1
const date = D.getDate()
const hours = D.getHours()
const mins = D.getMinutes()
const secs = D.getSeconds()
return `${year}${month}${date}${hours}${mins}${secs}`
}
export default {
name: 'Upload',
data() {
return {
zippercent: 0,
dialogVisible: false,
num: 0,
zipname: '',
accepts: ['application/zip', 'application/x-zip-compressed', 'application/x-zip'],
filenameArray: [],
saveFile: '',
typeList: [],
saveZipurl: '',
saveResolute: '',
savexMax: '',
saveyMax: '',
savetargetName: [],
isWidthHeight: false,
saveFolder: ''
}
},
watch: {},
created() {},
mounted() {
this.getTypeList()
},
methods: {
// 获取类型枚举
getTypeList() {
dictList().then(res => {
this.typeList = res.datas.typeList
})
},
// 具体规则看 assets/book.jpg
uploadHttpRequest() {},
isAllTypeName(array) {
if (array.length > 0) {
return !array.some(function(value, index) {
return value !== array[0]
})
} else {
return true
}
},
isAllWidthHeight(array) {
if (array.length > 0) {
return !array.some(function(value, index) {
return (
value.height !== array[0].height || value.width !== array[0].width
)
})
} else {
return true
}
},
handleChange(file) {
console.log(file)
const that = this
that.zippercent = 0
that.saveFile = file
that.zipname = file.name.substring(0, file.name.lastIndexOf('.'))
const isAccept = that.accepts.includes(file.type)
if (!isAccept) {
that.$message.warning('请上传zip格式文件')
return
}
that.dialogVisible = true
that.zippercent = -2
var new_zip = new JsZip()
new_zip.loadAsync(file).then(zip => {
var isExistDir = false
that.filenameArray = []
for (const name in zip.files) {
const target = zip.files[name]
that.filenameArray.push(zip.files[name])
if (target.dir) {
isExistDir = true
continue
}
}
if (isExistDir) {
that.$message.warning(
'压缩包内仅包含图片文件,不得有其他文件或文件夹'
)
that.dialogVisible = false
return
} else {
const length = Object.keys(zip.files).length
if (
length === 72 ||
length === 120 ||
length === 360 ||
length === 200 ||
length === 648
) {
console.log('开始校验promise', new Date())
const promises = []
for (let i = 0; i < length; i++) {
var name = that.filenameArray[i].name
promises.push(
new Promise((resolve, reject) => {
// 解压图片并转换为base64
zip
.file(name)
.async('base64')
.then(base64 => {
const img = new Image()
img.onload = e => {
const { width, height } = img
if (width !== height) {
reject('有文件尺寸错误,请上传1:1比例的图片')
that.dialogVisible = false
return
} else {
resolve(img)
}
}
img.onerror = e => {
reject('有文件读取失败,请检查该文件是否正常')
that.dialogVisible = false
}
img.src = `data:image/png;base64,${base64}`
})
})
)
}
Promise.all(promises)
.then(list => {
console.log('promise结束', new Date())
var istrueState = false
for (let index = 0; index < list.length; index++) {
that.saveResolute = {
width: list[0].width,
height: list[0].height
}
if (
list[index].width < 1500 ||
list[index].width > 3000 ||
list[index].height < 1500 ||
list[index].height > 3000
) {
istrueState = true
continue
}
}
if (istrueState) {
messageup({
type: 'warning',
showClose: false,
message: '分辨率要求在1500~3000之间'
})
that.dialogVisible = false
return
}
// console.log('length', length)
// console.log(that.isAllWidthHeightnum(list))
if (that.isAllWidthHeight(list) === true) {
if (length === 72) {
that.saveType = that.typeList.find(item => {
return item.name === '360'
})
that.savexMax = 72
that.saveyMax = 1
that.threeSixzero(zip, length, '360')
} else if (length === 120) {
that.saveType = that.typeList.find(item => {
return item.name === '540'
})
that.savexMax = 20
that.saveyMax = 5
that.fiveFourzero(zip, length, '540')
} else if (length === 360) {
that.saveType = that.typeList.find(item => {
return item.name === '540 Pro'
})
that.savexMax = 36
that.saveyMax = 9
that.fiveFourzeropro(zip, length, '540Pro')
} else if (length === 200) {
that.saveType = that.typeList.find(item => {
return item.name === '720'
})
that.savexMax = 20
that.saveyMax = 5
that.sevenTwozero(zip, length, '720')
} else if (length === 648) {
that.saveType = that.typeList.find(item => {
return item.name === '720 Pro'
})
that.savexMax = 36
that.saveyMax = 9
that.sevenTwozeropro(zip, length, '720Pro')
}
} else {
that.$message.warning('素材图片分辨率不一致')
that.dialogVisible = false
return
}
})
.catch(msg => {
messageup({
type: 'warning',
showClose: false,
message: msg
})
})
} else {
that.$message.warning(
'压缩包内图片数量错误,请校对各个模式(360,540,540 Pro,720,720 Pro)下的数量规则'
)
that.dialogVisible = false
return
}
}
})
},
// 360判断 72
threeSixzero(zip, length, typeName) {
const that = this
var isNametrue = false
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
that.savetargetName.push(target.name)
if (target.name.split('.')[0] === '00') {
isNametrue = true
continue
}
if (parseInt(target.name.split('.')[0]) > 72) {
isNametrue = true
continue
}
if (!/^([0-9][0-9]).(jpg)$/.test(target.name)) {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
} else {
that.uploadZip(that.saveFile, length, typeName)
}
},
// 540判断 120
fiveFourzero(zip, length, typeName) {
const that = this
var isNametrue = false
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
const first_num = target.name.split('.')[0].split('-')[0]
const second_num = target.name.split('.')[0].split('-')[1]
const imgType = target.name.split('.')[1]
that.savetargetName.push(target.name)
if (!/^([0][0-5])$/.test(first_num)) {
isNametrue = true
continue
}
if (!/^([0-2][0-9])$/.test(second_num)) {
isNametrue = true
continue
}
if (parseInt(second_num) === 0) {
isNametrue = true
continue
}
if (parseInt(second_num) > 20) {
isNametrue = true
continue
}
if (imgType !== 'jpg') {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
that.uploadZip(that.saveFile, length, typeName)
},
// 540pro判断 360
fiveFourzeropro(zip, length, typeName) {
const that = this
var isNametrue = false
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
that.savetargetName.push(target.name)
const first_num = target.name.split('.')[0].split('-')[0]
const second_num = target.name.split('.')[0].split('-')[1]
const imgType = target.name.split('.')[1]
if (!/^([0][0-9])$/.test(first_num)) {
isNametrue = true
continue
}
if (!/^([0-3][0-9])$/.test(second_num)) {
isNametrue = true
continue
}
if (parseInt(second_num) === 0) {
isNametrue = true
continue
}
if (parseInt(second_num) > 36) {
isNametrue = true
continue
}
if (imgType !== 'jpg') {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
that.uploadZip(that.saveFile, length, typeName)
},
// 720判断 200
sevenTwozero(zip, length, typeName) {
const that = this
var isNametrue = false
var Narray = []
var Sarray = []
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
that.savetargetName.push(target.name)
const NS = target.name.split('.')[0].split('-')[0]
if (NS === 'N') {
Narray.push(NS)
}
if (NS === 'S') {
Sarray.push(NS)
}
if (NS !== 'N' && NS !== 'S') {
isNametrue = true
continue
}
const first_num = target.name.split('.')[0].split('-')[1]
const second_num = target.name.split('.')[0].split('-')[2]
const imgType = target.name.split('.')[1]
if (!/^([0][1-5])$/.test(first_num)) {
isNametrue = true
continue
}
if (!/^([0-2][0-9])$/.test(second_num)) {
isNametrue = true
continue
}
if (parseInt(second_num) === 0) {
isNametrue = true
continue
}
if (parseInt(second_num) > 20) {
isNametrue = true
continue
}
if (imgType !== 'jpg') {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
if (Narray.length !== 100 || Sarray.length !== 100) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
that.uploadZip(that.saveFile, length, typeName)
},
// 720pro判断 648
sevenTwozeropro(zip, length, typeName) {
const that = this
var isNametrue = false
var Narray = []
var Sarray = []
that.savetargetName = []
for (const name in zip.files) {
const target = zip.files[name]
that.savetargetName.push(target.name)
const NS = target.name.split('.')[0].split('-')[0]
if (NS === 'N') {
Narray.push(NS)
}
if (NS === 'S') {
Sarray.push(NS)
}
if (NS !== 'N' && NS !== 'S') {
isNametrue = true
continue
}
const first_num = target.name.split('.')[0].split('-')[1]
const second_num = target.name.split('.')[0].split('-')[2]
const imgType = target.name.split('.')[1]
if (!/^([0][1-9])$/.test(first_num)) {
isNametrue = true
continue
}
if (!/^([0-3][0-9])$/.test(second_num)) {
isNametrue = true
continue
}
if (parseInt(second_num) === 0) {
isNametrue = true
continue
}
if (parseInt(second_num) > 36) {
isNametrue = true
continue
}
if (imgType !== 'jpg') {
isNametrue = true
continue
}
}
if (isNametrue) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
if (Narray.length !== 324 || Sarray.length !== 324) {
messageup({
type: 'warning',
showClose: false,
message: '文件名格式不正确'
})
that.dialogVisible = false
return
}
that.uploadZip(that.saveFile, length, typeName)
},
uploadZip(file, length, typeName) {
const that = this
that.saveFolder = getDate() + '_' + typeName
that.zippercent = 0
that.$newalioss
.upload({
file,
// folder: 'zipmoviebooktest-decompression',
// folder: 'srczipmoviebooktest',
folder: that.saveFolder,
progress: percent => {
percent = ~~(percent * 100)
that.num = (percent - that.zippercent) * (file.size / 1024) * 0.01
that.zippercent = percent === 100 ? 99 : percent
}
})
.then(({ relative, absolute }) => {
// console.log(relative)
console.log(absolute)
that.saveZipurl = absolute
console.log('得到zip包地址开始交互', new Date())
that._materialAdd(Number(length))
// 调取一个接口this.zippercent = 100
})
.catch(msg => {
that.zippercent = -1
})
.finally(e => {})
},
_materialAdd(length) {
const that = this
// console.log(that.savetargetName)
// https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/2022627211258_540/00-01.jpg
const img_urlarr = that.savetargetName
const img_urlobj = {}
img_urlarr.forEach(item => {
img_urlobj[item.substring(0, item.lastIndexOf('.'))] =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/' +
item
})
const params = {
name: that.zipname,
type: that.saveType.id,
zip_url: that.saveZipurl,
img_url: img_urlobj,
xMax: that.savexMax,
yMax: that.saveyMax,
poster: '',
poster_url: '',
resolute: that.saveResolute
}
if (length === 72) {
params.poster = '01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/01.jpg'
} else if (length === 120) {
params.poster = '00-01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/00-01.jpg'
} else if (length === 360) {
params.poster = '00-01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/00-01.jpg'
} else if (length === 200) {
params.poster = 'N-01-01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/N-01-01.jpg'
} else if (length === 648) {
params.poster = 'N-01-01'
params.poster_url =
'https://media-manual.oss-cn-beijing.aliyuncs.com/oss/model/unzip/' +
that.saveFolder +
'/N-01-01.jpg'
}
materialAdd(params).then(res => {
if (res.status === 200) {
that.zippercent = 100
console.log('zip包地址接口上传成功等待解压', new Date())
} else {
that.$message.error(res.msg)
that.zippercent = -1
}
})
},
closeDialog() {
if (this.zippercent === -2 || this.zippercent === -1) {
return
}
if (
navigator.userAgent.indexOf('Firefox') !== -1 ||
navigator.userAgent.indexOf('Chrome') !== -1
) {
window.location.href = 'about:blank'
window.close()
} else {
window.opener = null
window.open('', '_self')
window.close()
}
}
}
}
</script>
<style lang="scss" scoped>
.content {
width: 100vw;
height: 100vh;
min-height: 500px;
display: flex;
.uploadbox {
margin: 15vh auto 0;
}
}
.el-upload__tip {
text-align: center;
padding-top: 10px;
}
.redtext {
font-weight: 400;
font-size: 12px;
color: rgb(255, 56, 56);
margin-top: 10px;
margin-left: 50px;
}
.namebox {
margin-left: 50px;
display: flex;
margin-top: 30px;
padding-bottom: 50px;
.left {
width: 250px;
color: rgba(0, 0, 0, 0.4);
font-size: 14px;
margin-right: 20px;
}
.right {
font-size: 14px;
color: rgb(29, 30, 31);
}
}
.el-icon-loading {
color: rgb(0, 168, 112);
}
.el-icon-success {
color: rgb(0, 168, 112);
}
.el-icon-warning {
color: rgb(227, 77, 89);
}
.ml10 {
margin-left: 10px;
}
</style>
不求大富大贵,但求一生平凡

浙公网安备 33010602011771号