Ant-Design-Vue 自定義上傳和圖片預覽功能

中二Devil發表於2020-11-03

前端頁面程式碼部分

<template>
    <a-upload list-type="picture-card" :customRequest="imgAdd" :remove="imgDel"
              :file-list="fileList" @preview="handlePreview" @change="handleChange">
        <div v-if="fileList.length < 9">
            <a-icon type="plus" />
            <div class="ant-upload-text">
                上傳
            </div>
        </div>
    </a-upload>
    <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
        <img alt="example" style="width: 100%" :src="previewImage" />
    </a-modal>
</template>

<script>
    import {
        uploadFile // 封裝了上傳檔案介面
    } from "../../api/file";
    
    // function getBase64(file) {
    //     return new Promise((resolve, reject) => {
    //         const reader = new FileReader();
    //         reader.readAsDataURL(file);
    //         reader.onload = () => resolve(reader.result);
    //         reader.onerror = error => reject(error);
    //     });
    // }
    
    export default {
        data() {
            return {
                previewVisible: false,
                previewImage: '',
                fileList: [],
            }
        },
        methods: {
            // 上傳圖片
            imgAdd(data) {
                let formdata = new FormData()
                formdata.append('file', data.file)
                uploadFile(formdata).then(res => {
                    if (res.code === 200) { // 上傳成功時(自己封裝了response)
                        data.onSuccess(res.data);
                    }else {
                        data.onError();
                    }
                })
            },
            // 刪除圖片
            imgDel(file) {
                this.fileList.splice(this.fileList.indexOf(file), 1);
            },
            // 關閉模態框
            handleCancel() {
                this.previewVisible = false;
            },
            // 開啟模態框(圖片預覽)
            async handlePreview(file) {
                console.log(file);
                // if (!file.url && !file.preview) {
                //     file.preview = await getBase64(file.originFileObj);
                // }
                // this.previewImage = file.url || file.preview;
                this.previewImage = file.response.path;
                this.previewVisible = true;
            },
            // 修改檔案?沒用到
            handleChange({
                fileList
            }) {
                this.fileList = fileList;
            },
        }
    }
</script>

各功能介紹

一、自定義上傳(:customRequest=“imgAdd”)

上傳中成功時必須執行 data.onSuccess() ,這樣才能讓正在上傳的圖片呈現為上傳成功狀態,不然會一直顯示在上傳中。

在這裡插入圖片描述

該方法可以新增 請求介面的response 為引數,

在這裡插入圖片描述

這樣可以設定 fileList 中檔案的 response :

在這裡插入圖片描述

除了 onSuccess() 方法外,還有 onError() 方法,該方法使上傳的圖片呈現為上傳失敗狀態。還有 onProcess() 方法,但是博主沒有試出來它的用處。

二、圖片預覽

博主註釋的兩個部分是第一種圖片載入方法,採用 Base64 的載入方法,載入“本地檔案”。

第二種方法是載入圖片的 url ,該 url 是博主後端給出的檔案下載介面。

相關文章