ant-design-pro中form中使用upload组件上传图片遇到的坑

本文描述了前端上传图片后,如何正确地在form表单提交时使用后台返回的图片地址,避免本地地址被误传的问题。关键在于调整formItem的结构,确保仅upload组件包含在内。

 

描述:前端上传图片后,后台返回上传图图片的地址。form表单提交的时候将图片的地址传给后端

问题:图片上传成功后后台也返回了地址但是在提交的时候始终把本地的地址提交上去,无法获取到后台 的地址

处理:实际上formItem的问题,formItem中寻找值的时候如果有多个元素的话会获取有value值(upload中input的value值),所以只将upload组件放入到formItem中其余的元素可以在外面。这样不会出现上述的问题

在 `ant-design-vue` 的 `Upload` 组件中,`onProgress` 事件用于监听文件上传过程中的进度变化。该事件通常与自定义上传逻辑结合使用(例如通过 `customRequest` 属性指定上传方法),以便在上传过程中获取实时的进度信息。 以下是一个典型的用法示例: ### 示例代码 ```vue <template> <a-upload :customRequest="customRequest" :onProgress="handleProgress" :onChange="handleChange" > <a-button>点击上传</a-button> </a-upload> </template> <script> import axios from 'axios'; export default { methods: { handleChange(info) { console.log('上传状态变化:', info); }, handleProgress(progress, file) { console.log(`文件 ${file.name} 上传进度: ${progress}%`); }, customRequest({ file, onProgress, onSuccess, onError }) { const formData = new FormData(); formData.append('file', file); axios({ url: '/api/upload', method: 'POST', data: formData, headers: { 'Content-Type': 'multipart/form-data', }, onUploadProgress: (ev) => { if (ev.lengthComputable) { const percent = Math.round((ev.loaded * 100) / ev.total); onProgress(percent, ev); // 触发 onProgress 事件 } }, }) .then((res) => { onSuccess(res.data); }) .catch((err) => { onError(err); }); }, }, }; </script> ``` ### 关键点说明 - **`onProgress` 回调函数**:接收两个参数,一个是当前上传进度百分比(`progress`),另一个是文件对象(`file`)。 - **`customRequest` 自定义上传方法**:必须手动配置 `onUploadProgress` 来计算并传递上传进度值。 - **`axios` 中的 `onUploadProgress`**:用于监听上传事件,并通过 `Math.round((ev.loaded * 100) / ev.total)` 计算出上传进度百分比[^2]。 ### 进度条显示建议 为了在界面上展示上传进度条,可以结合 `a-progress` 组件来实现动态更新效果: ```vue <template> <div> <a-progress :percent="uploadPercent" /> <a-upload :customRequest="customRequest" :onProgress="handleProgress" > <a-button>点击上传</a-button> </a-upload> </div> </template> <script> export default { data() { return { uploadPercent: 0, }; }, methods: { handleProgress(progress, file) { this.uploadPercent = progress; }, customRequest({ file, onProgress, onSuccess, onError }) { const formData = new FormData(); formData.append('file', file); axios({ url: '/api/upload', method: 'POST', data: formData, headers: { 'Content-Type': 'multipart/form-data' }, onUploadProgress: (ev) => { if (ev.lengthComputable) { const percent = Math.round((ev.loaded * 100) / ev.total); onProgress(percent, ev); } }, }) .then((res) => { onSuccess(res.data); }) .catch((err) => { onError(err); }); }, }, }; </script> ``` 通过这种方式,可以在用户界面中清晰地展示文件上传的进度状态。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值