Vue图片上传那些坑,你踩过几个?
创作时间:
作者:
@小白创作中心
Vue图片上传那些坑,你踩过几个?
引用
CSDN
等
12
来源
1.
https://blog.csdn.net/m0_63586335/article/details/140613344
2.
https://blog.csdn.net/weixin_45356258/article/details/139352946
3.
https://blog.csdn.net/m0_66879773/article/details/136732038
4.
https://blog.csdn.net/torpidcat/article/details/140131206
5.
https://blog.csdn.net/weixin_47597807/article/details/119361697
6.
https://blog.csdn.net/m0_54195598/article/details/143975166
7.
https://blog.csdn.net/sinat_41200024/article/details/139298793
8.
https://cloud.baidu.com/article/3236059
9.
https://blog.csdn.net/qq_39291270/article/details/143587598
10.
https://www.showapi.com/news/article/67027ef64ddd79f11a32ea3e
11.
https://juejin.cn/post/7402845471646285864
12.
https://docs.pingcode.com/baike/2331190
在Vue项目中处理图片上传功能时,开发者经常会遇到一些令人头疼的技术问题。本文将分享几个常见的坑点及解决方案,帮助大家在开发过程中少走弯路。
01
图片更新后不显示新图片
现象描述
在更新用户头像或图片后,页面上显示的仍然是旧图片,即使后端已经成功返回新的图片URL。
原因分析
这是因为浏览器对图片进行了缓存,即使图片URL发生变化,浏览器也可能加载缓存中的旧图片。Vue并未检测到变化,导致页面头像没有发生改变。
解决方案
在图片URL后拼接时间戳,强制浏览器加载最新图片。以下是两种实现方式:
- 在模板中直接拼接时间戳:
<img :src="imageUrl ? imageUrl+ '?t=' + (new Date().getTime()) : ''" />
- 在获取新图片地址时拼接时间戳:
const { Data } = await UploadImg(infoData.dialog!.params.RY_GH, formData);
imageUrl.value = common.baseUrl + Data.URL+'?t=' + (new Date().getTime());
02
跨域上传导致请求失败
现象描述
当使用Vue前端上传图片到后端服务器时,可能会遇到跨域问题,导致上传请求被浏览器阻止。
原因分析
跨域问题通常发生在前端和后端部署在不同域名或端口的情况下。浏览器的同源策略会阻止跨域请求,除非后端明确允许。
解决方案
使用axios进行文件上传时,需要正确设置请求头。以下是一个完整的跨域上传示例:
<template>
<div>
<el-upload
class="avatar-uploader"
action=""
:http-request="uploadFile1"
list-type="picture"
:show-file-list="false"
>
<img v-if="imageUrl" class="avatar" :src="imageUrl" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</div>
</template>
<script setup lang="ts">
import axios from "axios";
const imageUrl = ref("");
const uploadFile1 = async (val: any) => {
let formdata = new FormData();
formdata.append("File", val.file);
await axios.post("http://192.168.1.214:5050/api/File/UploadFile", formdata, {
headers: { "Content-Type": "multipart/form-data" },
}).then((res) => {
if (res.data.status === 200) {
// 获取文件路径并显示图片
axios.post("http://192.168.1.214:5050/api/File/FilePathInfo", {
id: res.data.data.id,
}).then((result) => {
imageUrl.value = "http://192.168.1.214:5050" + result.data.data.filePath;
});
}
});
};
</script>
03
文件大小限制检查
现象描述
在上传图片时,如果用户选择的文件过大,需要及时给出提示并阻止上传。
解决方案
使用elementPlus的upload组件时,可以通过on-change事件来检查文件大小:
<el-upload
v-model:file-list="item.fileList"
accept=".jpg,.jpeg,.png,.gif,.webp"
list-type="picture-card"
:on-change="handleSuccess"
:limit="imgLength"
:auto-upload="false"
>
<el-icon>
<Plus />
</el-icon>
</el-upload>
在on-change事件中检查文件大小:
const handleSuccess = (file: UploadFile) => {
const maxSize = 30 * 1024 * 1024; // 限制30M
if (file.size > maxSize) {
ElMessage.warning('文件大小不得超过30M');
fileList.value = [];
return;
}
// 其他逻辑
}
04
上传进度显示
现象描述
在上传大文件时,用户需要看到上传进度,避免误以为程序卡死而重复点击上传按钮。
解决方案
利用HTML5的progress标签和axios的onUploadProgress事件,可以实现上传进度条:
// 封装上传图片接口方法
export const uploadCourseImage = (data, onUploadProgress) => {
return request({
method: 'POST',
url: '',
data,
onUploadProgress
})
}
// 在Vue组件中调用
const { data } = await uploadCourseImage(fd, e => {
this.percentage = Math.floor(e.loaded / e.total * 100)
})
在模板中使用element ui的进度条组件:
<el-progress
v-if="isUploading"
:percentage="percentage"
status="success"
></el-progress>
通过以上几个解决方案,可以有效提升Vue项目中图片上传功能的用户体验。在实际开发中,建议将这些功能模块化,以便在多个项目中复用。
热门推荐
滚珠导轨的存放与防锈保养
十大美味凤爪:从无骨到麻辣,总有一款征服你的味蕾
脂溢性皮炎——病因探寻,“溢”起调理
锐界火花塞更换的最佳周期是多久?
Excel时间点平均值怎么算
信用卡理财秘籍:精打细算,财富增长
公司负债如何优化财务结构
减肥期间能否吃方便面?方便面发胖吗?
组合房屋贷款的还款策略是什么?这种还款方式有哪些潜在的挑战?
讨债通过法律程序怎样进行调解
1938年八路军挺进冀东:组建抗日武装十多万人
古诗词艺术解读模板
女性如何打破传统束缚:实现自我价值与独立选择
鼻骨骨折的治疗方法有哪些
如何在面对物业相关问题时找到合适的管理方式?这些方式有哪些注意事项?
中国抗肿瘤药物行业市场前瞻:2029年有望破5590亿元
种植牙中的种植体与基台有什么区别?了解它们的功能与作用。
种植牙基台材料选择指南:从材质到连接方式的全面解析
当河南登上历史课本封面,适配度直接拉满!
日本留学语言考试要求详解
日本留学语言考试要求详解
海南过年红包一般多少钱:红包金额与合适范围探讨
建筑施工安全知识:坍塌事故预防与自救指南
在线AI写作指南,如何高效利用智能资源
住房公积金的提取条件及企业缴纳义务详解
在嘉定孔庙,与非遗来一场指尖上的浪漫邂逅
白脉软膏效果怎么样
宝妈岗登场 学技能免费 黑龙江省各地妇联春风行动火热进行中
拔智齿16天了半个脸还是肿:别再觉得拔牙是小事了
心脏血管堵塞最佳治疗方法