最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go-gin-vue3-elementPlus帶參手動上傳文件的案例代碼

 更新時間:2023年11月02日 11:11:26   作者:呆萌小新@淵潔  
這篇文章主要介紹了go-gin-vue3-elementPlus帶參手動上傳文件的案例代碼,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

go的mvc層使用gin框架. 總的來說gin的formFile封裝的不如springboot的好.獲取值有很多的坑. 當(dāng)然使用axios的formData也有不少坑.現(xiàn)給出較好的解決辦法

以下部分僅貼出關(guān)鍵代碼

一. 總體代碼流程

1.1 全局Axios部分樣例

axios前后端網(wǎng)絡(luò)交互

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è)務(wù)

關(guān)鍵代碼一覽.需要留意的是,我使用手動上傳,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="學(xué)歷">
            <el-select
                v-model="resumeForm.education"
                placeholder="請選擇學(xué)歷水平"
                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),您將收到回復(fù)", '提示', {
      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)
}

三. 測試樣例

在這里插入圖片描述

在這里插入圖片描述

到此這篇關(guān)于go-gin-vue3-elementPlus帶參手動上傳文件的案例代碼的文章就介紹到這了,更多相關(guān)vue3 elementPlus上傳文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue前端空值處理的實戰(zhàn)指南與避坑記錄

    Vue前端空值處理的實戰(zhàn)指南與避坑記錄

    本文旨在幫助同學(xué)們學(xué)會在前端真實業(yè)務(wù)項目里,到底該怎么寫空值處理(?.、??、||、if判斷、兜底邏輯),以及為什么這么選、會踩哪些高頻坑,順便幫大家拉直JS/TS空值、真值假值的基礎(chǔ)概念,助力你們寫出規(guī)范可維護的團隊級代碼
    2026-03-03
  • vue elementUI table表格數(shù)據(jù) 滾動懶加載的實現(xiàn)方法

    vue elementUI table表格數(shù)據(jù) 滾動懶加載的實現(xiàn)方法

    這篇文章主要介紹了vue elementUI table表格數(shù)據(jù)滾動懶加載的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • vue3中引入class類的寫法代碼示例

    vue3中引入class類的寫法代碼示例

    最近一直在做vue項目,從網(wǎng)上搜索到的資料不太多,這篇文章主要給大家介紹了關(guān)于vue3中引入class類的寫法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-05-05
  • 傻瓜式vuex語法糖kiss-vuex整理

    傻瓜式vuex語法糖kiss-vuex整理

    kiss-vuex 是一個非常簡單的語法糖類庫,這篇文章主要介紹了傻瓜式vuex語法糖kiss-vuex整理,非常具有實用價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Vue中.vue文件比main.js先執(zhí)行的問題及解決

    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日志配置

    這篇文章主要為大家介紹了Vue打包優(yōu)化之生產(chǎn)環(huán)境刪除console日志配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • vue3+ts+mock實現(xiàn)增刪改查json文件的示例代碼

    vue3+ts+mock實現(xiàn)增刪改查json文件的示例代碼

    本文主要介紹了vue3+ts+mock實現(xiàn)增刪改查json文件的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • vue3項目中引入ts的詳細圖文教程

    vue3項目中引入ts的詳細圖文教程

    最近項目需要將原vue項目結(jié)合ts的使用進行改造,這個后面應(yīng)該是中大型項目的發(fā)展趨勢,下面這篇文章主要給大家介紹了關(guān)于vue3項目中引入ts的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • vue3中的抽離封裝方法實現(xiàn)

    vue3中的抽離封裝方法實現(xiàn)

    vue3中的任何一個組合式api都可以單獨抽離出去在另一個文件,最后只需要回歸到setup()中即可,這篇文章主要介紹了vue3的抽離封裝方法,需要的朋友可以參考下
    2022-08-08
  • vue使用element-ui的el-input監(jiān)聽不了回車事件的解決方法

    vue使用element-ui的el-input監(jiān)聽不了回車事件的解決方法

    小編在使用element-ui時,el-input組件監(jiān)聽不了回車事件,怎么回事呢?下面小編給大家?guī)砹藇ue使用element-ui的el-input監(jiān)聽不了回車事件的解決方法,一起看看吧
    2018-01-01

最新評論

恩施市| 老河口市| 化德县| 通道| 渭源县| 秦皇岛市| 昔阳县| 榆中县| 商水县| 仙游县| 杭锦后旗| 阳朔县| 余干县| 略阳县| 东乌珠穆沁旗| 眉山市| 巴楚县| 临泉县| 南康市| 通山县| 五台县| 临汾市| 同江市| 文化| 从江县| 巴南区| 奇台县| 崇义县| 上虞市| 嘉峪关市| 扎鲁特旗| 荆州市| 南召县| 南皮县| 东明县| 林州市| 哈尔滨市| 盐亭县| 徐汇区| 封丘县| 大石桥市|