arco.design中的上传文件,不仅要在本地展示,还要上传到OSS,还要美观!

2,677 阅读1分钟

arco.design中的上传文件,不仅要在本地展示,还要上传到OSS,还要美观!

我选择了 => arco.design/vue/compone… 中的用户上传头像功能 它能本地展示效果,很有美感,但是不好拿到他的文件信息,我试了好一段时间,才拿到文件信息,传到后台,后台上传到阿里云 上代码 => 愚见仅供参考

vue3的写法   react同样适用 去UI库中切换成react模式,拷贝下代码就好了 主要是为了拿文件信息

template 代码

    <a-upload
        action="/"
        :fileList="file ? [file] : []"
        :show-file-list="false"
        @change="onChange"
        >
        <template #upload-button>
        <div 
            :class="`arco-upload-list-item${file && file.status === 'error' ? ' 
            arco-upload-list-item-error' : ''}`">                           
            <div v-if="file && file.url" 
                 class="arco-upload-list-picture custom-upload-avatar">
                    <img :src="file.url" />
                    <div class="arco-upload-list-picture-mask">
                        <IconEdit />
                    </div>
                    <a-progress
                    v-if="file.status === 'uploading' && file.percent < 100"
                    :percent="file.percent"
                    type="circle"
                    />
            </div>
                <div class="arco-upload-picture-card" v-else>
                    <div class="arco-upload-picture-card-text">
                        <IconPlus />
                    </div>
                </div>
            </div>
        </template>
    </a-upload>

script 代码 => 通过UI库提供的@change监听事件 第一个参数下标0的file属性 (_[0].file) 拿到文件信息(拿到文件信息,那就右手就行了)

const onChange = async (_: any, currentFile: any) => {
    const formData = new FormData()
    formData.append('file', _[0].file)
    let data = await axios.post('/api/upload', formData)
    console.log(data)
    file.value = {
    ...currentFile,
    // url: URL.createObjectURL(currentFile.file),
    };
};

后端代码是用egg去搭建的

const Controller = require('egg').Controller
const OSS = require('ali-oss')
let client = new OSS ({
    region: 'oss-cn-******',
    bucket: '*********',
    accessKeyId: '**********',
    accessKeySecret: '************',
})
class UploadController extends Controller {
    async upload() {
        const {ctx, app} = this
        try{
            const file = ctx.request.files[0]
            const result = await client.put(`one/` + Date.now() + '-' + file.filename, file.filepath)
            //console.log(result)
            ctx.body = {code: 200, msg: '上传成功', url: result.url}
        }catch(err) {
            //console.log(err)
            ctx.body = {code: 400, msg: '上传失败'}
        }
    }
}