Vue3 ts实现将assets中的图片转为file格式,实现本地图片选择上传功能

Vue3 ts实现将assets中的图片转为file格式,实现本地图片选择上传功能

1、需求描述

用户可以选项系统固定的几个图标,也可以自定义上传图片。系统固定图标存在 src\assets\images\app 路径中。

在这里插入图片描述

2、关键代码

文件转换关键代码

const moudles: any = import.meta.glob('@/assets/images/app/*') // 获取所有默认图标
// path 格式为 '/src/assets/images/app/*******.png'
const createFileFromImage = async (path: string, name: string) => {
  moudles[path]().then(async (res: { default: string | URL }) => {
  	// 将文件转为blob格式
    const response = await fetch(new URL(res.default, import.meta.url))
    const arrayBuffer = await response.arrayBuffer()
    const blob = new Blob([arrayBuffer], { type: 'image/png' })
    // blob格式转化为file格式
    const file = new File([blob], name, { type: 'image/png' })
    // 依据实际请求需求,还可转换为formData格式
    const formData = new FormData()
    formData.append('file', file)
	// 你的处理逻辑,我赋值给了a-upload组件的变量
	coverFileList.value = [
      {
        name: randomImgName.value,
        uid: '-1',
        originFileObj: file as any
      }
    ]
  })
}

给a-upload组件初始化一个随机系统图标关键代码
图片为系统内置的10张图片

在这里插入图片描述

const randomImgName = ref(`default-${getRandomNumber(1, 10)}.png`) // 随机获取一张图片
const randomImgPath = ref(`/src/assets/images/app/${randomImgName.value}`) // 图片地址
createFileFromImage(randomImgPath.value, randomImgName.value) // 调用文件转换方法

/**
 * 获取指定范围随机数
 * @param min 最小值
 * @param max 最大值
 */
const getRandomNumber = (min: number, max: number) => {
  return Math.floor(Math.random() * (max - min + 1)) + min
}

3、img标签src使用变量打包后图片无法展示

问题: img标签src使用变量打包后会出现图片无法展示

原因:vite 官方默认的配置,如果资源文件在assets文件夹打包后会把图片名加上 hash值,但是直接通过 :src="imgSrc"方式引入并不会在打包的时候解析,导致开发环境可以正常引入,打包后却不能显示的问题

import.meta.glob():在vue2中支持require导入模块或文件,但是在vue3不支持require,可以使用import.meta.glob方法来支持批量导入文件

html代码块

<img :src="imgUrl[index - 1]" @click="changeDefaultImg(`default-${index}.png`)" />

typescript 代码块

const moudles: any = import.meta.glob('@/assets/images/app/*')
const imgUrl: Ref<string[]> = ref([])
const getAssetsFile = (url: string, index: number) => {
  moudles[url]().then((res: { default: string }) => {
    imgUrl.value[index] = res.default
  })
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值