图片上传并可拖拽

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

<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 对象中。
  • 服务器端需要相应地处理多文件上传请求。
  • 可以根据需要调整样式和布局。
  • 记得处理可能的错误情况和添加适当的验证。

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

好的,可以使用 ant design 的 Upload 组件来实现图片上传拖拽功能。具体步骤如下: 1. 引入 Upload 组件和 message 组件(用于提示消息) ``` import { Upload, message } from 'ant-design-vue'; ``` 2. 在 template 中使用 Upload 组件,并配置 props ``` <Upload action="/upload" :before-upload="beforeUpload" :onChange="handleChange" :show-upload-list="false" > <div class="upload-area"> <span class="upload-icon"> <i class="el-icon-plus"></i> </span> <span class="upload-text">点击上传或将文件拖拽到此处</span> </div> </Upload> ``` 3. 在 methods 中实现 beforeUpload 和 handleChange 方法 ``` methods: { beforeUpload(file) { const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; if (!isJpgOrPng) { message.error('只能上传 JPG/PNG 格式的图片'); return false; } const isLt2M = file.size / 1024 / 1024 < 2; if (!isLt2M) { message.error('图片大小不能超过 2MB'); return false; } return true; }, handleChange(info) { if (info.file.status === 'done') { message.success(`${info.file.name} 上传成功`); // 上传成功后的操作,比如更新页面上的图片列表等 } else if (info.file.status === 'error') { message.error(`${info.file.name} 上传失败`); } }, } ``` 其中 beforeUpload 方法用于判断上传的文件格式和大小,handleChange 方法用于处理上传结果并给出提示。 4. 在样式中设置上传区域的样式,用于实现拖拽效果 ``` .upload-area { border: 1px dashed #d9d9d9; border-radius: 4px; cursor: pointer; padding: 40px 20px; text-align: center; } .upload-area:hover { border-color: #1890ff; } .upload-icon { display: inline-block; font-size: 32px; margin-bottom: 10px; } .upload-text { display: block; font-size: 14px; color: #666; } ``` 以上就是使用 ant design vue 实现图片上传拖拽的方法。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

温暖前端

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

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

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

打赏作者

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

抵扣说明:

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

余额充值