go-gin-vue3-elementPlus帶參手動上傳文件的案例代碼
go的mvc層使用gin框架. 總的來說gin的formFile封裝的不如springboot的好.獲取值有很多的坑. 當然使用axios的formData也有不少坑.現(xiàn)給出較好的解決辦法
以下部分僅貼出關鍵代碼
一. 總體代碼流程
1.1 全局Axios部分樣例
axios前后端網(wǎng)絡交互
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 創(chuàng)建axios實例
const service = axios.create({
// axios中請求配置有baseURL選項,表示請求URL公共部分
baseURL: 'http://127.0.0.1:20139',
// 超時
timeout: 5000
})
export default service;
// 不使用service實例.重新創(chuàng)建axios封裝上傳
export function uploadFiles(url,data={}){
return axios({
method: "POST",
url: 'http://127.0.0.1:20139'+url,
transformRequest: [function(data, headers) {
// 去除post請求默認的Content-Type
delete headers['Content-Type']
return data
}],
data: data,
})
}1.2 上傳業(yè)務
關鍵代碼一覽.需要留意的是,我使用手動上傳,element中before-upload,before-remove失效. 為避免更多問題使用了on-change監(jiān)聽.其中uploadFile參數(shù)是element封裝的普通對象. file對象被封裝在其中的raw屬性. 這一點要尤為注意 gin框架不同于springboot. formfile只能讀取file類型



<el-form :inline="true"
:model="resumeForm"
class="demo-form-inline"
label-position="right"
label-width="100px">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="姓名">
<el-input v-model="resumeForm.name" placeholder="請輸入姓名" clearable/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="電話">
<el-input v-model="resumeForm.phone" placeholder="請輸入電話" clearable/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="郵箱">
<el-input v-model="resumeForm.email" placeholder="請輸入郵箱" clearable/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="工作經(jīng)驗">
<el-input v-model="resumeForm.experience" placeholder="請輸入工作經(jīng)驗" clearable/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="學歷">
<el-select
v-model="resumeForm.education"
placeholder="請選擇學歷水平"
clearable
>
<el-option label="??? value="0"/>
<el-option label="本科" value="1"/>
<el-option label="研究生" value="2"/>
<el-option label="博士" value="3"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="上傳簡歷">
<el-upload
ref="recruitRef"
class="upload-demo"
drag
action="#"
:auto-upload="false"
:on-change="handleChange"
limit="1"
>
<el-icon class="el-icon--upload">
<upload-filled/>
</el-icon>
<div class="el-upload__text">
拖拽 或 <em>點擊上傳</em>
</div>
<template #tip>
<div class="el-upload__tip">
.pdf 文件大小 ≤ 500kb
</div>
</template>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-form-item>
<el-button type="primary" @click="postResumeForm()">投遞</el-button>
</el-form-item>
</el-form>const router = useRouter()
const resumeForm = reactive({
name: '',
phone: '',
email: '',
experience: '',
education: '',
position: router.currentRoute.value.params.position
})
const recruitRef = ref()
let formData = new FormData()
// 文件改變觸發(fā)
function handleChange(uploadFile, uploadFiles) {
// 文件校驗
if (!verifyBeforeUpload(uploadFile)) {
removeFile()
return
}
console.log(uploadFile)
formData.append("file", uploadFile.raw)
}
function removeFile() {
if (recruitRef.value) {
formData = new FormData()
recruitRef.value.clearFiles()
}
}
// 提交表單
function postResumeForm() {
ElMessageBox.confirm('確認提交?提交后僅能修改一次', '提示', {
confirmButtonText: "確定",
cancelButtonText: "取消",
type: "warning"
}).then(async () => {
if (formData === null || formData === undefined) {
ElMessage.info("必須遞交簡歷信息!")
return
}
for (let key in resumeForm) {
formData.append(key,resumeForm[key])
}
let res = await reqPostResumeForm(formData)
if (res.code !== 200) {
ElMessage.error("簡歷投遞失敗")
return
}
await ElMessageBox.alert("簡歷投遞成功! 3-7個工作日內(nèi),您將收到回復", '提示', {
confirmButtonText: "確認"
})
removeFile()
}).catch((err) => {
removeFile()
console.log(err)
ElMessage.info("簡歷投遞已取消!")
})
}文件校驗部分
// 單文件大小校驗
function verifyFileSize(file) {
if (file) {
let fileSize = file.size;
let fileMaxSize = 1024 * 500;//500kb
if (fileSize > fileMaxSize) {
ElMessage.error("文件不能大于500kb!");
file.value = "";
return false;
} else if (fileSize <= 0) {
ElMessage.error("文件不能為0kb!");
file.value = "";
return false;
}
return true
}
ElMessage.error("必須傳遞文件!")
return false;
}
// 校驗文件格式和大小
export function verifyBeforeUpload(file) {
// 格式
const extension = file.name.split('.').pop().toLowerCase();
console.log(extension)
if (!ACCEPTED_EXTENSIONS.includes(extension)) {
ElMessage.error('僅支持 pdf 格式的文件');
return false;
}
// 大小
return verifyFileSize(file);
}請求發(fā)送部分
export function reqPostResumeForm(formData){
return uploadFiles(jobs.postResumeUrl,formData)
}二. 后端部分
func PostResume(c *gin.Context) {
file, err := c.FormFile("file")
if err != nil {
panic(fmt.Sprintf("file參數(shù)不能為空"))
}
var resume model.Resume
err = c.ShouldBind(&resume)
if err != nil {
panic(fmt.Sprintf("resume獲取錯誤,原因是: %v", err))
}
log.Printf("%v", file)
}三. 測試樣例


到此這篇關于go-gin-vue3-elementPlus帶參手動上傳文件的案例代碼的文章就介紹到這了,更多相關vue3 elementPlus上傳文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue elementUI table表格數(shù)據(jù) 滾動懶加載的實現(xiàn)方法
這篇文章主要介紹了vue elementUI table表格數(shù)據(jù)滾動懶加載的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04
Vue中.vue文件比main.js先執(zhí)行的問題及解決
這篇文章主要介紹了Vue中.vue文件比main.js先執(zhí)行的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Vue打包優(yōu)化之生產(chǎn)環(huán)境刪除console日志配置
這篇文章主要為大家介紹了Vue打包優(yōu)化之生產(chǎn)環(huán)境刪除console日志配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
vue3+ts+mock實現(xiàn)增刪改查json文件的示例代碼
本文主要介紹了vue3+ts+mock實現(xiàn)增刪改查json文件的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-07-07
vue使用element-ui的el-input監(jiān)聽不了回車事件的解決方法
小編在使用element-ui時,el-input組件監(jiān)聽不了回車事件,怎么回事呢?下面小編給大家?guī)砹藇ue使用element-ui的el-input監(jiān)聽不了回車事件的解決方法,一起看看吧2018-01-01

