Showing
1 changed file
with
106 additions
and
97 deletions
| ... | @@ -60,13 +60,19 @@ const props = defineProps({ | ... | @@ -60,13 +60,19 @@ const props = defineProps({ |
| 60 | item: Object, | 60 | item: Object, |
| 61 | }); | 61 | }); |
| 62 | const emit = defineEmits(["active"]); | 62 | const emit = defineEmits(["active"]); |
| 63 | - | ||
| 64 | const show_empty = ref(false); | 63 | const show_empty = ref(false); |
| 65 | 64 | ||
| 66 | // 文件类型中文页面显示 | 65 | // 文件类型中文页面显示 |
| 67 | const type_text = computed(() => { | 66 | const type_text = computed(() => { |
| 68 | return props.item.component_props.image_type; | 67 | return props.item.component_props.image_type; |
| 69 | }); | 68 | }); |
| 69 | +// 上传图片集合 | ||
| 70 | +const fileList = ref([ | ||
| 71 | + // { url: "https://fastly.jsdelivr.net/npm/@vant/assets/leaf.jpeg" }, | ||
| 72 | + // Uploader 根据文件后缀来判断是否为图片文件 | ||
| 73 | + // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明 | ||
| 74 | + // { url: 'https://cloud-image', isImage: true }, | ||
| 75 | +]); | ||
| 70 | 76 | ||
| 71 | // 上传前置处理 | 77 | // 上传前置处理 |
| 72 | const beforeRead = (file) => { | 78 | const beforeRead = (file) => { |
| ... | @@ -93,54 +99,79 @@ const beforeRead = (file) => { | ... | @@ -93,54 +99,79 @@ const beforeRead = (file) => { |
| 93 | return flag; | 99 | return flag; |
| 94 | }; | 100 | }; |
| 95 | 101 | ||
| 96 | -/********** 上传七牛云获取图片地址 ***********/ | 102 | +// 文件读取完成后的回调函数 |
| 97 | -const loading = ref(false); | 103 | +const afterRead = async (files) => { |
| 98 | -const formCode = $route.query.code; // 表单code | 104 | + if (Array.isArray(files)) { |
| 99 | -const uuid = () => { | 105 | + // 多张图片上传files是一个数组 |
| 100 | - let s = []; | 106 | + muliUpload(files); |
| 101 | - let hexDigits = "0123456789abcdef"; | 107 | + } else { |
| 102 | - for (var i = 0; i < 36; i++) { | 108 | + const imgUrl = await handleUpload(files); |
| 103 | - s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); | 109 | + // 上传失败提示 |
| 110 | + if (!imgUrl.src) { | ||
| 111 | + files.status = "failed"; | ||
| 112 | + files.message = "上传失败"; | ||
| 113 | + loading.value = false; | ||
| 114 | + } else { | ||
| 115 | + files.status = ""; | ||
| 116 | + files.message = ""; | ||
| 117 | + fileList.value.push({ | ||
| 118 | + meta_id: imgUrl.meta_id, | ||
| 119 | + url: imgUrl.src, | ||
| 120 | + isImage: true, | ||
| 121 | + }); | ||
| 122 | + loading.value = false; | ||
| 123 | + } | ||
| 104 | } | 124 | } |
| 105 | - s[14] = "4"; | 125 | + // 过滤非包含URL的图片 |
| 106 | - s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); | 126 | + fileList.value = fileList.value.filter((item) => { |
| 107 | - s[8] = s[13] = s[18] = s[23] = "-"; | 127 | + if (item.url) return item; |
| 108 | - | 128 | + }); |
| 109 | - var uuid = s.join(""); | 129 | + props.item.value = { |
| 110 | - return uuid; | 130 | + key: "image_uploader", |
| 131 | + filed_name: props.item.key, | ||
| 132 | + // value: fileList.value.map((item) => item.url), | ||
| 133 | + value: fileList.value, | ||
| 134 | + }; | ||
| 135 | + show_empty.value = false; | ||
| 136 | + // 完整数据回调到表单上 | ||
| 137 | + emit("active", props.item.value); | ||
| 138 | + console.warn(fileList.value); | ||
| 111 | }; | 139 | }; |
| 112 | 140 | ||
| 113 | -const uploadQiniu = async (file, token, filename, md5) => { | 141 | +// 文件删除前的回调函数 |
| 114 | - let formData = new FormData(); | 142 | +const beforeDelete = (files) => { |
| 115 | - formData.append("file", file); // 通过append向form对象添加数据 | 143 | + fileList.value = fileList.value.filter((item) => { |
| 116 | - formData.append("token", token); | 144 | + if (item.url !== files.url) return item; |
| 117 | - formData.append("key", filename); | 145 | + }); |
| 118 | - let config = { | 146 | + props.item.value = { |
| 119 | - headers: { "Content-Type": "multipart/form-data" }, | 147 | + key: "image_uploader", |
| 148 | + filed_name: props.item.key, | ||
| 149 | + // value: fileList.value.map((item) => item.url), | ||
| 150 | + value: fileList.value, | ||
| 120 | }; | 151 | }; |
| 121 | - // 自拍图片上传七牛服务器 | 152 | + // 完整数据回调到表单上 |
| 122 | - const { filekey, hash, image_info } = await qiniuUploadAPI( | 153 | + emit("active", props.item.value); |
| 123 | - "http://upload.qiniu.com/", | ||
| 124 | - formData, | ||
| 125 | - config | ||
| 126 | - ); | ||
| 127 | - if (filekey) { | ||
| 128 | - // 保存图片 | ||
| 129 | - const { data } = await saveFileAPI({ | ||
| 130 | - filename, | ||
| 131 | - filekey, | ||
| 132 | - hash: md5, | ||
| 133 | - format: image_info.format, | ||
| 134 | - height: image_info.height, | ||
| 135 | - width: image_info.width, | ||
| 136 | - }); | ||
| 137 | - return data; | ||
| 138 | - } | ||
| 139 | }; | 154 | }; |
| 140 | -/****************** END *******************/ | ||
| 141 | 155 | ||
| 156 | +/********** 上传七牛云获取图片地址 ***********/ | ||
| 157 | +const loading = ref(false); | ||
| 158 | +const formCode = $route.query.code; // 表单code | ||
| 159 | +// const uuid = () => { | ||
| 160 | +// let s = []; | ||
| 161 | +// let hexDigits = "0123456789abcdef"; | ||
| 162 | +// for (var i = 0; i < 36; i++) { | ||
| 163 | +// s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); | ||
| 164 | +// } | ||
| 165 | +// s[14] = "4"; | ||
| 166 | +// s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); | ||
| 167 | +// s[8] = s[13] = s[18] = s[23] = "-"; | ||
| 168 | + | ||
| 169 | +// var uuid = s.join(""); | ||
| 170 | +// return uuid; | ||
| 171 | +// }; | ||
| 172 | + | ||
| 173 | +// 上传图片返回图片URL | ||
| 142 | const handleUpload = async (files) => { | 174 | const handleUpload = async (files) => { |
| 143 | - // 上传图片流程 | ||
| 144 | loading.value = true; | 175 | loading.value = true; |
| 145 | // 获取HASH值 | 176 | // 获取HASH值 |
| 146 | // const hash = getEtag(files.content); | 177 | // const hash = getEtag(files.content); |
| ... | @@ -155,8 +186,7 @@ const handleUpload = async (files) => { | ... | @@ -155,8 +186,7 @@ const handleUpload = async (files) => { |
| 155 | reject(err); | 186 | reject(err); |
| 156 | } | 187 | } |
| 157 | // 获取七牛token | 188 | // 获取七牛token |
| 158 | - const filename = | 189 | + const filename = files.file.name; // 真实文件名 |
| 159 | - "uploadForm/" + formCode + "/" + uuid() + "." + files.file.name.split(".")[1]; | ||
| 160 | const getToken = await qiniuTokenAPI({ | 190 | const getToken = await qiniuTokenAPI({ |
| 161 | name: filename, | 191 | name: filename, |
| 162 | hash: md5, | 192 | hash: md5, |
| ... | @@ -167,6 +197,7 @@ const handleUpload = async (files) => { | ... | @@ -167,6 +197,7 @@ const handleUpload = async (files) => { |
| 167 | if (getToken.token) { | 197 | if (getToken.token) { |
| 168 | files.status = "uploading"; | 198 | files.status = "uploading"; |
| 169 | files.message = "上传中..."; | 199 | files.message = "上传中..."; |
| 200 | + // 返回数据库真实图片地址 | ||
| 170 | imgUrl = await uploadQiniu(files.file, getToken.token, filename, md5); | 201 | imgUrl = await uploadQiniu(files.file, getToken.token, filename, md5); |
| 171 | } | 202 | } |
| 172 | // 重复上传 | 203 | // 重复上传 |
| ... | @@ -195,6 +226,7 @@ var muliUpload = async (files) => { | ... | @@ -195,6 +226,7 @@ var muliUpload = async (files) => { |
| 195 | item.status = ""; | 226 | item.status = ""; |
| 196 | item.message = ""; | 227 | item.message = ""; |
| 197 | fileList.value.push({ | 228 | fileList.value.push({ |
| 229 | + meta_id: res.meta_id, | ||
| 198 | url: res.src, | 230 | url: res.src, |
| 199 | isImage: true, | 231 | isImage: true, |
| 200 | }); | 232 | }); |
| ... | @@ -203,63 +235,40 @@ var muliUpload = async (files) => { | ... | @@ -203,63 +235,40 @@ var muliUpload = async (files) => { |
| 203 | } | 235 | } |
| 204 | }; | 236 | }; |
| 205 | 237 | ||
| 206 | -const afterRead = async (files) => { | 238 | +// 生成数据库真实图片地址 |
| 207 | - if (Array.isArray(files)) { | 239 | +const uploadQiniu = async (file, token, name, md5) => { |
| 208 | - // 多张图片上传files是一个数组 | 240 | + let affix = uuidv4(); |
| 209 | - muliUpload(files); | 241 | + let fileName = `uploadForm/${formCode}/${affix}.${name.split(".")[1]}`; |
| 210 | - } else { | 242 | + let formData = new FormData(); |
| 211 | - const imgUrl = await handleUpload(files); | 243 | + formData.append("file", file); // 通过append向form对象添加数据 |
| 212 | - // 上传失败提示 | 244 | + formData.append("token", token); |
| 213 | - if (!imgUrl.src) { | 245 | + formData.append("key", fileName); |
| 214 | - files.status = "failed"; | 246 | + let config = { |
| 215 | - files.message = "上传失败"; | 247 | + headers: { "Content-Type": "multipart/form-data" }, |
| 216 | - loading.value = false; | ||
| 217 | - } else { | ||
| 218 | - files.status = ""; | ||
| 219 | - files.message = ""; | ||
| 220 | - fileList.value.push({ | ||
| 221 | - meta_id: imgUrl.meta_id, | ||
| 222 | - url: imgUrl.src, | ||
| 223 | - isImage: true, | ||
| 224 | - }); | ||
| 225 | - loading.value = false; | ||
| 226 | - } | ||
| 227 | - } | ||
| 228 | - // 过滤非包含URL的图片 | ||
| 229 | - fileList.value = fileList.value.filter((item) => { | ||
| 230 | - if (item.url) return item; | ||
| 231 | - }); | ||
| 232 | - props.item.value = { | ||
| 233 | - key: "image_uploader", | ||
| 234 | - filed_name: props.item.key, | ||
| 235 | - // value: fileList.value.map((item) => item.url), | ||
| 236 | - value: fileList.value, | ||
| 237 | - }; | ||
| 238 | - show_empty.value = false; | ||
| 239 | - emit("active", props.item.value); | ||
| 240 | - console.warn(fileList.value); | ||
| 241 | -}; | ||
| 242 | - | ||
| 243 | -const beforeDelete = (files) => { | ||
| 244 | - fileList.value = fileList.value.filter((item) => { | ||
| 245 | - if (item.url !== files.url) return item; | ||
| 246 | - }); | ||
| 247 | - props.item.value = { | ||
| 248 | - key: "image_uploader", | ||
| 249 | - filed_name: props.item.key, | ||
| 250 | - // value: fileList.value.map((item) => item.url), | ||
| 251 | - value: fileList.value, | ||
| 252 | }; | 248 | }; |
| 253 | - emit("active", props.item.value); | 249 | + // 自拍图片上传七牛服务器 |
| 250 | + const { filekey, hash, image_info } = await qiniuUploadAPI( | ||
| 251 | + "http://upload.qiniu.com/", | ||
| 252 | + formData, | ||
| 253 | + config | ||
| 254 | + ); | ||
| 255 | + if (filekey) { | ||
| 256 | + // 保存图片 | ||
| 257 | + const { data } = await saveFileAPI({ | ||
| 258 | + name, | ||
| 259 | + filekey, | ||
| 260 | + hash: md5, | ||
| 261 | + // format: image_info.format, | ||
| 262 | + height: image_info.height, | ||
| 263 | + width: image_info.width, | ||
| 264 | + }); | ||
| 265 | + return data; | ||
| 266 | + } | ||
| 254 | }; | 267 | }; |
| 255 | 268 | ||
| 256 | -const fileList = ref([ | 269 | +/****************** END *******************/ |
| 257 | - // { url: "https://fastly.jsdelivr.net/npm/@vant/assets/leaf.jpeg" }, | ||
| 258 | - // Uploader 根据文件后缀来判断是否为图片文件 | ||
| 259 | - // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明 | ||
| 260 | - // { url: 'https://cloud-image', isImage: true }, | ||
| 261 | -]); | ||
| 262 | 270 | ||
| 271 | +// 校验模块 | ||
| 263 | const validImageUploader = () => { | 272 | const validImageUploader = () => { |
| 264 | // 必填项 未上传图片 | 273 | // 必填项 未上传图片 |
| 265 | if (props.item.component_props.required && !fileList.value.length) { | 274 | if (props.item.component_props.required && !fileList.value.length) { | ... | ... |
-
Please register or login to post a comment