Elementui の el-form および el-upload はファイルとフォーム データをアップロードします

フォーム データとファイルのアップロードには 4 つのアイデアがあります。

1. ファイルとフォーム データが一緒にバックエンドにアップロードされます。つまり、バックエンドのインターフェイスがファイルとフォーム データを受け取ります (これは比較的古い方法であり、バックエンド インターフェイスも複雑であり、機能を実装するのは簡単ではありません)プログレスバーのアップロードなど。推奨)

2. 最初にファイルをアップロードし、次にバックエンドにファイルを保存し (最初にデータベースに書き込まないでください)、ファイルの URL をフロントエンドに返します。URL を受信したフロントエンドは、URL を他の URL とともにバックエンドに送信します。フォーム データを作成し、バックエンドはそれを一緒にデータベースに書き込みます (バックエンドはファイルをアップロードするためのインターフェイスを分離する必要があり、推奨されます)

3. 最初にファイルをアップロードし、次にバックエンドでファイルを保存し、それをデータベースに書き込み、データベース ID を取得し、データベース ID をフロントエンドに返します。フロントエンドはフォーム データとデータベース ID をバックエンドに送信します。終了すると、フォームデータをレコードに更新するときに、バックエンドがデータベース ID に従ってレコードを検索します。

4. 最初にフォーム データをアップロードし、次にバックエンドでフォーム データを保存し、データベースに書き込みます。次に、フロント エンドでアップロード ファイルをクリックし (以前にアップロードしたフォーム データのデータベース ID を渡します)、バックエンドでend はファイルを受信して​​保存し、URL をフォーム データに更新します (このメソッドは実装が最も簡単ですが、2 番目と 3 番目のメソッドとは異なり、ユーザーはフォーム データとファイルを更新するために 2 つの操作が必要です。これらのメソッドは更新のみ可能です)クリックしてフォームを送信した後)

el-upload を使用してファイルをアップロードする

el-upload を使用する場合は、次の点にも注意してください。

action 属性によって送信されるリクエストは内部でカプセル化された ajax リクエストであるため、独自のカプセル化された axios を通過しないため、プロキシとして設定する場合は、リクエストにプロキシ プレフィックスを自分で追加する必要があります。トークン ID 検証を行うには、このリクエストにリクエスト ヘッダーを追加する必要もあります

el-uploadのname属性は今回送信するリクエストファイルのパラメータ名となっており、バックエンドが必要とするパラメータ名に変更する必要があります

次のステップは、上記の 2 番目の方法を使用して、フォーム データとファイルを一緒にアップロードすることです。

html部分

      <el-form :rules="categoryRules" ref="categoryRuleForm" :model="categoryForm">
        <el-form-item label="分类名称" label-width="120px" prop="category_name">
          <el-input v-model="categoryForm.category_name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="分类图片" label-width="120px" prop="category_pic">
          <el-upload
          list-type="picture-card"
          :limit="1"
          :on-exceed="handleExceed"
          name="category_pic"
          action="/api/category/uploadPic"
          :headers="headerObj"
          :on-remove="handleRemove"
          :on-success="handleCategoryPicSuccess"
          :file-list="fileList"
          :before-upload="beforeCategoryPicUpload"
          >
            <i slot="default" class="el-icon-plus"></i>
            <div slot="file" slot-scope="{file}">
              <img
                class="el-upload-list__item-thumbnail"
                :src="file.url" alt=""
              >
              <span class="el-upload-list__item-actions">
                <span
                  class="el-upload-list__item-preview"
                  @click="handlePictureCardPreview(file)"
                >
                  <i class="el-icon-zoom-in"></i>
                </span>
                <span
                  v-if="!disabled"
                  class="el-upload-list__item-delete"
                  @click="handleDownload(file)"
                >
                  <i class="el-icon-download"></i>
                </span>
                <span
                  v-if="!disabled"
                  class="el-upload-list__item-delete"
                  @click="handleRemove(file)"
                >
                  <i class="el-icon-delete"></i>
                </span>
              </span>
            </div>
          </el-upload>
          <el-dialog :visible.sync="dialogVisible">
            <img width="100%" :src="dialogImageUrl" alt="">
          </el-dialog>
        </el-form-item>
      </el-form>

js部分

<script>
import {
    
    getToken} from '@/utils/auth'
import {
    
     getCategoryList, addCategory, updateCategory, deleteCategory, deleteCategoryPic } from '../../api/category'
export default {
    
    
  name: '',
  data () {
    
    
    return {
    
    

      categoryForm: {
    
    
        category_name: '',  // 分类名称
        category_pic: '', // 分类图片
      },

      // el-upload的请求头
      headerObj: {
    
    
        Authorization: `Bearer ${
      
      getToken()}`,  
      },

      fileList: [], // 上传时的图片列表(这里的图片将会显示出缩略图)

      // 大图预览相关
      dialogImageUrl: '',
      dialogVisible: false,
      disabled: false
    }
  },
  mounted () {
    
    
  },
  methods: {
    
    
    // 添加分类
    addCategory() {
    
    
          this.addDialogFormVisible = false
          let result = await addCategory({
    
    
            category_name: this.categoryForm.category_name,
            category_pic: this.categoryForm.category_pic,
          })
          if(result.code === 200){
    
    
            this.$message.success(result.message)
            this.getCategoryList()
          }else{
    
    
            this.$message.error(result.message)
          }
    },
    // 上传图片成功
    handleCategoryPicSuccess(res, file) {
    
    
      // 将服务器返回的文件url地址赋值给表单的category_pic,这样就可以在表单提交时将图片地址提交到服务器
      this.categoryForm.category_pic = res.data.category_pic
      this.getCategoryList()
      // 提示信息
      this.$message({
    
    
        message: '图片上传成功',
        type: 'success'
      });
    },
    // 上传图片前
    beforeCategoryPicUpload(file) {
    
    
      const isJPG = file.type === 'image/jpeg' || file.type === 'image/png';
      const isLt1M = file.size / 1024 / 1024 < 1;

      if (!isJPG) {
    
    
        this.$message.error('上传头像图片只能是 JPG / PNG 格式!');
      }
      if (!isLt1M) {
    
    
        this.$message.error('上传头像图片大小不能超过 1MB!');
      }
      return isJPG && isLt1M;
    },
    // 图片超出限制
    handleExceed(files, fileList) {
    
    
      this.$message.error('当前限制选择 1 张图片!');
    },
    // 点击删除按钮
    async handleRemove(file) {
    
      // 删除图片
      // 删除缩略图图片
      this.fileList.splice(this.fileList.indexOf(file), 1);

      // 发送请求删除服务器图片
      let result = await deleteCategoryPic({
    
    
        category_pic: this.categoryForm.category_pic,
      })
      if(result.code === 200){
    
    
        this.$message.success(result.message)
      }else{
    
    
        this.$message.error(result.message)
      }
    },
    // 点击大图预览按钮
    handlePictureCardPreview(file) {
    
    
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    },
    // 点击下载按钮
    handleDownload(file) {
    
    
      // 提示
      this.$message({
    
    
        message: '暂未开发',
        type: 'danger'
      });
    }
  }
}
</script>

おすすめ

転載: blog.csdn.net/cocogogogo/article/details/124347225