基于vue3的图片上传

目录

 vue3图片上传

实现本地预览 将图片转为file对象

实现本地预览,将图片转为base64

基本axios,将网络图片变成file对象

上传图片接口


 vue3图片上传

实现本地预览 将图片转为file对象

  • show-file-list:是否显示已上传文件列表

  • :auto-upload:是否在选取文件后立即进行上传到后台

  • :on-change:文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用 回调参数file,fileList

 <el-upload
            class="avatar-uploader"
            :show-file-list="false"
            :auto-upload="false"
            :on-change="onSelectFile"
          >
            <img v-if="imageUrl" :src="imageUrl" class="avatar" />
            <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon> 
</el-upload>

 样式

<style scoped>
.avatar-uploader .avatar {
  width: 178px;
  height: 178px;
  display: block;
}
</style>

<style>
.avatar-uploader .el-upload {
  border: 1px dashed var(--el-border-color);
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
  transition: var(--el-transition-duration-fast);
}

.avatar-uploader .el-upload:hover {
  border-color: var(--el-color-primary);
}

.el-icon.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  text-align: center;
}
</style>
const onSelectFile = (file) => {
   //实现本地预览
  imageUrl.value = URL.createObjectURL(file.raw) 
     // file对象赋值
  formModel.value.cover_img = file.raw //赋值对象
}


实现本地预览,将图片转为base64

 <el-upload
      ref="imagedom"
      class="avatar-uploader"
      :show-file-list="false"
      :auto-upload="false"
      :on-change="onSelectFile"
    >
      <img v-if="imageUrl" :src="imageUrl" class="avatar" />
      <el-icon v-else class="avatar-uploader-icon">
        <Plus />
      </el-icon>
    </el-upload>
 <el-button type="primary" @click="Selectimg">选择头像</el-button>
    <el-button @click="submit">上传头像</el-button>

 获取dom元素,模拟点击

//模拟点击
const imagedom = ref('')
const Selectimg = () => {
  //模拟点击上传框
  imagedom.value.$el.querySelector('input').click()
}

 选择图片触发事件,将图片转为base64位

const imageUrl = ref(userstore.userinfo.user_pic)
const onSelectFile = (file) => {
  // 实现本地预览   转为file格式的
  // imageUrl.value = URL.createObjectURL(file.raw)
  // 基于FileReader 读取图片做预览 转为base64格式
  const reader = new FileReader()
  reader.readAsDataURL(file.raw)
  reader.onload = () => {
    imageUrl.value = reader.result
    console.log(imageUrl.value)
  }
}

基本axios,将网络图片变成file对象

// 引入axios
import axios from 'axios'
// 将网络图片转化为file对象 
//参数imageUrl:网络图片地址
//参数fileName:/uploads/885eb38f6270eb10b42aedadd84fea23.jpg 为后端传来的地址
async function imageUrlToFile(imageUrl, fileName) {
  try {
    const response = await axios.get(imageUrl, { responseType: 'arraybuffer' })
    const blob = new Blob([response.data], {
      type: response.headers['content-type']
    })
    const file = new File([blob], fileName, {
      type: response.headers['content-type']
    })
    return file
  } catch (error) {
    console.error('Error fetching the image:', error)
    return null
  }
}
  // 调用函数将网络图片处理返回文件对象
const getfile=asnyc ()=>{
    const file = await imageUrlToFile(imageUrl.value,formModel.value.cover_img)
}


上传图片接口

  • 接口:/my/article/add

  • 请求方式:post

  • body参数:form-data

注意:接口上传图片需要file对象,data需为FormData格式

1.封装接口

// 发布文章接口
export const addarticlesListServe = (data) => {
  return requset.post('/my/article/add', data)
}

2.收集数据上传图片到接口

<el-button @click="addarticle"></el-button>
import { addarticlesListServe } from '@/api/article'
//设置接口数据体
const formModel = ref({
  title: '',
  cate_id: '',
  content: '',
  cover_img: '',//注意为file对象
  state: '已发布'
})
//发布事件
const addarticle = async () => {
    //创建formdata
  const fd = new FormData()
   //存入数据
  for (let key in formModel.value) {
    fd.append(key, formModel.value[key])
  }
    //发请求
  const res = await addarticlesListServe(fd)
  console.log(res)
}

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基于 Vue3 和 TypeScript 的简单的图片上传组件封装: ```html <template> <div> <input type="file" ref="fileInput" @change="handleFileChange" /> <button @click="upload">上传</button> <img :src="imageUrl" v-if="imageUrl" /> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; export default defineComponent({ name: 'ImageUploader', props: { uploadUrl: { type: String, required: true, }, }, setup(props) { const fileInput = ref<HTMLInputElement | null>(null); const imageUrl = ref<string>(''); const handleFileChange = () => { const file = fileInput.value?.files?.[0]; if (file) { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () => { imageUrl.value = reader.result as string; }; } }; const upload = () => { const formData = new FormData(); formData.append('file', fileInput.value?.files?.[0] as File); fetch(props.uploadUrl, { method: 'POST', body: formData, }) .then((response) => response.json()) .then((data) => { console.log(data); }) .catch((error) => { console.log(error); }); }; return { fileInput, imageUrl, handleFileChange, upload, }; }, }); </script> ``` 在这个组件中,我们定义了一个 `uploadUrl` 属性来接受服务器端上传图片的 URL,然后定义了一个 `fileInput` 引用来引用 `input` 元素,再定义了一个 `imageUrl` 引用来保存上传后的图片地址。在 `handleFileChange` 方法中,我们使用 `FileReader` 对象将选择的图片读取为 base64 编码,并将编码后的字符串保存在 `imageUrl` 引用中。在 `upload` 方法中,我们创建一个 `FormData` 对象,将选择的图片放入其中,并通过 `fetch` 方法将其上传到服务器端。最后,我们将 `upload` 和 `handleFileChange` 方法绑定到相应的按钮和 `input` 元素的 `change` 事件上,以实现上传功能。 希望这个简单的示例能够帮助你封装一个图片上传组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值