Vue3实现上传照片以及回显


一、安装Element Plus

使用 Element Plus 组件库来实现上传照片和回显同样很简单,你可以按照以下步骤进行:

  1. 安装 Element Plus:首先,确保你已经安装了 Element Plus。你可以在 Vue 3 项目中使用 npm 或 yarn 来安装 Element Plus:

    npm install element-plus --save
    

    或者

    yarn add element-plus
    
  2. 引入 Element Plus:在你的 Vue 3 项目中的 main.js 文件中引入 Element Plus 并注册组件库中的组件:

    import { createApp } from 'vue'
    import ElementPlus from 'element-plus';
    import 'element-plus/lib/theme-chalk/index.css';
    
    const app = createApp(App)
    app.use(ElementPlus)
    app.mount('#app')
    
  3. 创建上传组件:在 Vue 3 中使用 Element Plus 的 Upload 组件来实现上传照片功能,同时使用 Image 组件来显示上传的照片。

  4. 处理文件上传:在上传组件中,可以使用 Upload 组件的 file-list 属性来绑定一个文件列表,当用户上传文件时,该列表会自动更新。你可以在 Image 组件中使用这个文件列表来显示上传的照片。

二、案例

1、基本示例

下面是一个简单的示例代码,演示了如何在 Vue 3 中使用 Element Plus 实现上传照片以及回显:

<template>
  <div>
    <el-upload
      action="#改为你上传服务URL路径" 
      :file-list="fileList"
      :on-change="handleFileUpload"
    >
      <el-button type="primary">点击上传</el-button>
    </el-upload>
    <el-image
      v-if="imageUrl"
      :src="imageUrl"
      style="width: 100px; height: 100px; margin-top: 10px;"
    ></el-image>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  name: 'PhotoUpload',
  setup() {
    const fileList = ref([]);
    const imageUrl = ref('');

    const handleFileUpload = (file, fileList) => {
      imageUrl.value = URL.createObjectURL(file.raw);
    };

    return {
      fileList,
      imageUrl,
      handleFileUpload
    };
  }
};
</script>

在这个示例中,我们使用了 Element Plus 的 Upload 组件来实现文件上传,通过绑定 file-list 属性来控制文件列表。在 handleFileUpload 方法中,我们监听 Upload 组件的 change 事件,获取上传的文件,并使用 URL.createObjectURL 方法生成一个临时的 URL,然后将其赋值给 imageUrl 数据,以在页面上显示照片。

三、进阶案例

1、代码

<template>
  <!-- 提交表单 -->
  <div>
      <el-form-item label="头像">
        <el-upload
          class="avatar-uploader"
          action="#改为你上传的文件路径"
          :show-file-list="false"
          :on-success="handleAvatarSuccess"
          :before-upload="beforeAvatarUpload"
          :data="imageFormData"
          name="files"
          accept="image/*"
        >
          <img v-if="imageUrl" :src="imageUrl" class="avatar" />
          <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
        </el-upload>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onSubmit">提交</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script  setup>
import { ref, onMounted } from "vue";
import { ElMessage } from "element-plus";
import { Plus } from "@element-plus/icons-vue";
import axios from "axios";


//提交表单数据
const formInline = ref({});
//照片
const imageUrl = ref("");
//上传图片表单
const imageFormData = ref({
  type: "picture",
});
//记录图片ID
const imageId = ref("");

const handleAvatarSuccess = (response, file) => {
  console.log("response=", response);
  console.log("file=", file);
  console.log("上传成功后的id=", response.data[0]);
  imageId.value = response.data[0];

  //回显图片
  getImage(imageId.value);
};

//调用图片
const getImage = async (id) => {
  //根据ID调用接口获取图片

  try {
    const imageInfo = await axios
      .get("#改为你调用文件服务的接口地址" + id, {
        responseType: "blob",
        headers: {
          Accept:
            "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
        },
      })
      .then((response) => {
        const blob = new Blob([response.data], { type: "image/*" });
        imageUrl.value = URL.createObjectURL(blob);
      });
  } catch (error) {
    console.error("获取数据失败", error);
  }
};

//校验文件
const beforeAvatarUpload = (rawFile) => {
  if (!rawFile.type.startsWith("image/")) {
    ElMessage.error("请上传图片!");
    return false;
  } else if (rawFile.size / 1024 / 1024 > 2) {
    ElMessage.error("图片大小不能超过2MB!");
    return false;
  }
  return true;
};

const onSubmit = () => {
  console.log("onSubmit");
};

</script>

<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: #000;
  width: 100px;
  height: 100px;
  text-align: center;
}
.avatar-uploader .avatar {
  width: 100px;
  height: 100px;
}
</style>

2、代码解释

1、上传接口展示

  1. 接口中要求传入表单数据因此我使用了data属性。
  2. 接口要求文件的属性名为files,因此我用了name属性默认值为file,我重新赋值files。
  3. 这里的文件上传应用场景是图片因此我用了accept属性配置内容为属性。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、查询接口展示

回显图片我用了调用接口方式,返回的内容为图片因此需要配置请求参数responseType
在这里插入图片描述

组件属性

在这里插入图片描述

在这里插入图片描述

3、效果展示

在这里插入图片描述

在这里插入图片描述


  1. 积极进取:勇敢迈出第一步,成功就在前方等待着你。
  2. 持之以恒:坚持不懈,才能攀登到人生的高峰。
  3. 自信自强:相信自己的能力,你就已经走出了成功的第一步。
  4. 心怀感恩:感恩生活中的每一个美好,懂得感恩,才能更加幸福。
  5. 勇敢面对:面对困难,不要退缩,因为你比困难更强大。
  6. 坚定目标:设立明确的目标,为之努力奋斗,成功必将如期而至。
  7. 学无止境:不断学习、不断进步,才能不断提升自我。
  8. 团结合作:团结一心,共同进步,困难会迎刃而解。
  9. 积极乐观:乐观面对生活,阳光总在风雨后。
  10. 勤奋拼搏:勤奋是通往成功的唯一道路,拼搏是成功的最好伴侣。
实现视频上传回显,需要涉及前端页面、后端接口以及视频处理等多方面的技术。下面我将从这些方面一步一步介绍具体实现方法。 1. 前端页面 前端页面需要有一个上传视频的功能,可以使用`<input type="file">`标签实现。在上传时,可以通过`FormData`对象将视频文件和一些其他参数一起发送到后端接口。示例代码如下: ```html <template> <div> <input type="file" @change="handleFileUpload"> <button @click="uploadVideo">上传</button> <video v-if="videoUrl" :src="videoUrl" controls></video> </div> </template> <script> export default { data() { return { videoUrl: '' } }, methods: { handleFileUpload(event) { this.videoFile = event.target.files[0] }, async uploadVideo() { const formData = new FormData() formData.append('file', this.videoFile) formData.append('name', 'video') const response = await fetch('/api/upload', { method: 'POST', body: formData }) const data = await response.json() if (data.success) { this.videoUrl = data.videoUrl } } } } </script> ``` 2. 后端接口 后端接口使用SpringBoot框架,需要使用`@RestController`和`@PostMapping`注解来实现视频上传接口。接收到视频文件后,可以使用FFmpeg库来处理视频文件,将视频转换为指定格式或者提取视频的缩略图等。 ```java @RestController public class VideoController { @PostMapping("/api/upload") public ApiResponse uploadVideo(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return ApiResponse.error("上传文件不能为空"); } try { // 保存视频文件并返回视频的URL String videoUrl = saveVideo(file); return ApiResponse.success(videoUrl); } catch (Exception e) { e.printStackTrace(); return ApiResponse.error("上传失败"); } } private String saveVideo(MultipartFile file) throws Exception { String fileName = UUID.randomUUID().toString() + ".mp4"; File dest = new File("uploads/" + fileName); file.transferTo(dest); return "http://localhost:8080/uploads/" + fileName; } } ``` 3. 视频处理 视频处理需要使用FFmpeg库来实现。在SpringBoot项目中,可以使用`ProcessBuilder`来执行FFmpeg命令。下面是一个实现视频转换为MP4格式的示例代码: ```java private void convertToMp4(String inputPath, String outputPath) throws Exception { String command = String.format("ffmpeg -i %s -c:v libx264 -preset slow -crf 22 -c:a aac -b:a 128k -movflags faststart -f mp4 %s", inputPath, outputPath); Process process = new ProcessBuilder(command.split(" ")).redirectErrorStream(true).start(); InputStream inputStream = process.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } process.waitFor(); reader.close(); inputStream.close(); } ``` 以上是实现视频上传回显的基本步骤,具体实现还需要根据具体需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和烨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值