首页 > 其他分享 >图片上传并可拖拽

图片上传并可拖拽

时间:2024-08-16 09:54:57浏览次数:7  
标签:index const image value file images 上传 拖拽 图片

实现多张图片拖拽上传并可以拖拽调整图片顺序的示例代码:

<template>
  <div>
    <el-upload
      ref="uploadRef"
      class="upload-demo"
      drag
      action="#"
      :auto-upload="false"
      :on-change="handleChange"
      multiple
    >
      <el-icon class="el-icon--upload"><upload-filled /></el-icon>
      <div class="el-upload__text">
        Drop file here or <em>click to upload</em>
      </div>
    </el-upload>

    <div class="image-list" ref="imageListRef">
      <div
        v-for="(image, index) in images"
        :key="index"
        class="image-item"
        draggable="true"
        @dragstart="dragStart(index)"
        @dragover.prevent
        @dragenter.prevent
        @drop="drop(index)"
      >
        <el-image :src="image.url" fit="cover" />
        <el-button type="danger" size="small" @click="removeImage(index)">
          Remove
        </el-button>
      </div>
    </div>

    <el-button type="primary" @click="uploadImages">Upload Images</el-button>
  </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import { UploadFilled } from '@element-plus/icons-vue'
import axios from 'axios'

interface ImageItem {
  file: File
  url: string
}

const uploadRef = ref()
const imageListRef = ref()
const images = ref<ImageItem[]>([])
let dragIndex = -1

const handleChange = (file: any) => {
  const reader = new FileReader()
  reader.onload = (e) => {
    images.value.push({
      file: file.raw,
      url: e.target?.result as string,
    })
  }
  reader.readAsDataURL(file.raw)
}

const removeImage = (index: number) => {
  images.value.splice(index, 1)
}

const dragStart = (index: number) => {
  dragIndex = index
}

const drop = (index: number) => {
  if (dragIndex !== index) {
    const temp = images.value[dragIndex]
    images.value.splice(dragIndex, 1)
    images.value.splice(index, 0, temp)
  }
}

const uploadImages = async () => {
  const formData = new FormData()
  images.value.forEach((image, index) => {
    formData.append(`image${index}`, image.file)
  })

  try {
    const response = await axios.post('/api/upload', formData, {
      headers: {
        'Content-Type': 'multipart/form-data',
      },
    })
    ElMessage.success('Images uploaded successfully')
    console.log(response.data)
  } catch (error) {
    ElMessage.error('Failed to upload images')
    console.error(error)
  }
}
</script>

<style scoped>
.image-list {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 20px;
}

.image-item {
  width: 150px;
  text-align: center;
}

.el-image {
  width: 100%;
  height: 150px;
  margin-bottom: 10px;
}
</style>

这个示例实现了以下功能:

  1. 使用 Element Plus 的 el-upload 组件实现拖拽上传。
  2. 支持多文件上传。
  3. 上传的图片会显示在下方的图片列表中。
  4. 可以拖拽调整图片的顺序。
  5. 可以删除已上传的图片。
  6. 点击 “Upload Images” 按钮会将所有图片上传到服务器。

注意事项:

  • 这个示例使用了客户端预览,实际图片数据还是存储在 File 对象中。
  • 服务器端需要相应地处理多文件上传请求。
  • 可以根据需要调整样式和布局。
  • 记得处理可能的错误情况和添加适当的验证。

关注微信公众号温暖前端,不定期分享前端知识点和前端资料↓↓↓

标签:index,const,image,value,file,images,上传,拖拽,图片
From: https://blog.csdn.net/qq_45914628/article/details/141232366

相关文章

  • allure报告自定义logo图片和文字
    有时根据项目需要把allure报告的logo换成公司的,步骤如下:1、将自定义的logo图片放到static文件夹中,尺寸大小100*100D:\allure-2.13.9\plugins\custom-logo-plugin\static      2、编辑styles.css文件。    修改和增加如下css:.side-nav__brand{......
  • Fdmemtable 内存表保存图片的例子
    varaStream:TMemoryStream;LDataSet:TFDDataSet;//申请一个FD数据集MyStream:Tmemorystream;MyJPEG:TJpegImage;MyPng:TPngImage;begininherited;ifimg2.Picture.Graphic=nilthenbeginApplication.MessageBox('没有图片可以增加!!','提示'......
  • uniapp多图上传uni.chooseImage上传照片uni.uploadFile,默认上传9张图
     uniapp多图上传uni.chooseImage上传照片uni.uploadFile代码示例:/**上传照片多图*/ getImage(){ uni.chooseImage({ count:9,//默认9 sizeType:['original','compressed'],//可以指定是原图还是压缩图,默认二者都有 sourceType:['album'],//......
  • STM32与华为云IoTDA的上传下达
    实现了Mqtt的链接后,需要与华为云IoTDA进行属性上报、命令解析、命令应答等。需要参照华为云官网给出的API参考使用前必读_设备接入IoTDA;1.华为云函数构建1.1.设备属性上报该功能就是用于设备按产品模型中定义的格式将属性数据上报给平台,最通常的温度信息设备状态等,上报后......
  • 利用certutil绕过上传限制
    certutil实战小技巧(绕过部分上传限制)上传时遇到限制上传大小时:编码base64:certutil-encodeyb.exe1.txt可以把1.txt拆成三个txt,分块上传后,再使用copyc:\*txtc:\123.txt//把c盘根目录下的所有txt合并为123.txtcertutil-decode123.txt123.exe收集了一些windows......
  • java 截取电脑屏幕转为图片
    importjavax.imageio.ImageIO;importjava.awt.*;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;publicstaticvoidmain(String[]args){//创建JMapViewer实例//JMapViewermapViewer=newJMapViewer();......
  • 用html2canvas转当前网页为图片的流程
    1、从canvas中直接提取图片元数据//图片导出为png格式vartype='png';varimgData=canvas.toDataURL(type);上面的代码得到的数据格式为:data:image/png;base64,.....2、将mime-type改为image/octet-stream,强制让浏览器直接download**获取mimeType@param{Str......
  • Git上传下载大文件
    解决上传,文件大小限制命令:gitlfsinstall 更改文件.gitattributes *.jarfilter=lfsdiff=lfsmerge=lfs-text*.pdffilter=lfsdiff=lfsmerge=lfs-text*.fbxfilter=lfsdiff=lfsmerge=lfs-text*.tgafilter=lfsdiff=lfsmerge=lfs-text*.PNGfilter=lfsd......
  • Qt5编译qmqtt库使用MQTT协议连接华为云IOT完成数据上传与交互
    一、前言随着物联网技术的发展,越来越多的设备通过网络互相连接,形成了庞大的智能系统。这些系统能够收集、分析并响应各种数据,从而实现自动化控制和智能化管理。在这个背景下,MQTT成为了一个广泛使用的轻量级消息传输协议,特别适用于资源受限的环境,如移动应用或远程传感器网......
  • python图片处理
    设置图片像素fromPILimportImagedefset_image(path,width=280):"""设置图片像素"""#打开图片image=Image.open(path)#原来大小original_width,original_height=image.size#设置新的图片大小new_width,new_height=w......