欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年11月02日 11:11:26   作者:呆萌小新@淵潔  
這篇文章主要介紹了go-gin-vue3-elementPlus帶參手動上傳文件的案例代碼,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(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實(shí)例
const service = axios.create({
    // axios中請求配置有baseURL選項,表示請求URL公共部分
    baseURL: 'http://127.0.0.1:20139',
    // 超時
    timeout: 5000
})
export default service;
// 不使用service實(shí)例.重新創(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請求默認(rèn)的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屬性. 這一點(diǎn)要尤為注意 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)驗(yàn)">
            <el-input v-model="resumeForm.experience" placeholder="請輸入工作經(jīng)驗(yàn)" 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>點(diǎn)擊上傳</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) {
	// 文件校驗(yàn)
  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('確認(rèn)提交?提交后僅能修改一次', '提示', {
    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: "確認(rèn)"
    })
    removeFile()
  }).catch((err) => {
    removeFile()
    console.log(err)
    ElMessage.info("簡歷投遞已取消!")
  })
}

文件校驗(yàn)部分

// 單文件大小校驗(yàn)
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;
}
// 校驗(yàn)文件格式和大小
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中設(shè)置登錄驗(yàn)證攔截功能的思路詳解

    Vue中設(shè)置登錄驗(yàn)證攔截功能的思路詳解

    今天在做vue和springboot交互的一個項目的時候,想要基于前端實(shí)現(xiàn)一些只有登錄驗(yàn)證之后才能訪問某些頁面的操作,所以在這里總結(jié)一下實(shí)現(xiàn)該功能的一個解決方案
    2021-10-10
  • vue單行文本溢出會出現(xiàn)title提示自定義指令

    vue單行文本溢出會出現(xiàn)title提示自定義指令

    這篇文章主要為大家介紹了vue單行文本溢出會出現(xiàn)title提示自定義指令,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • vue中如何獲取當(dāng)前路由name

    vue中如何獲取當(dāng)前路由name

    這篇文章主要介紹了vue中如何獲取當(dāng)前路由name,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue踩坑記錄之?dāng)?shù)組定義和賦值問題

    vue踩坑記錄之?dāng)?shù)組定義和賦值問題

    這篇文章主要給大家介紹了關(guān)于vue踩坑記錄之?dāng)?shù)組定義和賦值問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Vue 封裝防刷新考試倒計時組件的實(shí)現(xiàn)

    Vue 封裝防刷新考試倒計時組件的實(shí)現(xiàn)

    這篇文章主要介紹了Vue 封裝防刷新考試倒計時組件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Vue中tab欄切換的簡單實(shí)現(xiàn)

    Vue中tab欄切換的簡單實(shí)現(xiàn)

    本文主要介紹了Vue中tab欄切換的簡單實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • vue實(shí)現(xiàn)百度下拉列表交互操作示例

    vue實(shí)現(xiàn)百度下拉列表交互操作示例

    這篇文章主要介紹了vue實(shí)現(xiàn)百度下拉列表交互操作,結(jié)合實(shí)例形式分析了vue.js使用jsonp針對百度接口進(jìn)行交互的相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • axios請求中斷的幾種方法

    axios請求中斷的幾種方法

    在實(shí)際應(yīng)用場景中,假如有一個下載或者導(dǎo)出請求,數(shù)據(jù)量非常大的情況下,接口響應(yīng)的會很慢,這時候我我們想中斷請求,該怎么做呢?本文給大家介紹了axios請求中斷的幾種方法,需要的朋友可以參考下
    2024-10-10
  • 解決vue 給window添加和移除resize事件遇到的坑

    解決vue 給window添加和移除resize事件遇到的坑

    這篇文章主要介紹了解決vue 給window添加和移除resize事件遇到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue 實(shí)現(xiàn)對quill-editor組件中的工具欄添加title

    Vue 實(shí)現(xiàn)對quill-editor組件中的工具欄添加title

    這篇文章主要介紹了Vue 實(shí)現(xiàn)對quill-editor組件中的工具欄添加title,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論