You need to sign in or sign up before continuing.
hookehuyr

图片上传模块功能整理

...@@ -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) {
......