如何使用vue-dropzone添加文件上传

来自菜鸟教程
跳转至:导航、​搜索

警告: 自发布以来,此组件有通知:“此组件已远远超出我最初的预期,我无法提供用户所需的支持量。”


介绍

vue-dropzone 是一个在 Dropzone.js 之上实现的 Vue 组件,它为文件上传和图像预览提供拖放功能。

它非常强大并且有很多选项,尽管它为您提供了大量开箱即用的功能,几乎不需要配置。 您可以进行多个文件上传、取消它们、验证文件大小和格式、显示进度条等等!

设置项目

让我们从安装 vue-dropzone 开始:

npm install vue2-dropzone

然后,在我们的 main.js 入口点文件中,我们需要导入 CSS 文件:

import 'vue2-dropzone/dist/vue2Dropzone.css'

处理基本图像上传

为了创建一个基本的图像上传,您需要导入组件,并使用它提供 idoptions 属性:

<template>
  <div id="app">
    <vue-dropzone id="drop1" :options="dropOptions"></vue-dropzone>
  </div>
</template>

<script>
import vueDropzone from "vue2-dropzone";

export default {
  data: () => ({
    dropOptions: {
      url: "https://httpbin.org/post"
    }
  }),
  components: {
    vueDropzone
  }
};
</script>

注意: URL https://httpbin.org/post 是来自 HTTP 服务的端点,它为任何 HTTP POST 调用返回有效响应。


应用选项

唯一需要的选项是 url,但您可以使用更多选项。

例如,假设您想要:

  • 最多4个文件
  • 2 MB 最大文件大小
  • 以 500 字节的块发送
  • 设置自定义缩略图大小为 150px
  • 使上传的项目可取消和可移除(默认情况下它们不是)

您可以将所有这些业务规则应用于组件,如下所示:

export default {
  data: () => ({
    dropOptions: {
      url: "https://httpbin.org/post",
      maxFilesize: 2, // MB
      maxFiles: 4,
      chunking: true,
      chunkSize: 500, // bytes
      thumbnailWidth: 150, // px
      thumbnailHeight: 150,
      addRemoveLinks: true
    }
  })
  // ...
}

addRemoveLinks 选项为放置区的每个预览添加了一个取消和删除链接。

您可以在 dropzone 文档 中查看完整选项。

控制拖放区

如果我们想实现自定义功能,vue-dropzone 公开了 几个方法,我们可以通过在 <vue-dropzone> 标签上使用 ref 来访问这些方法。

例如,我们可以实现一个删除所有上传文件的按钮:

<template>
  <div id="app">
    <vue-dropzone ref="dropzone" id="drop1" :options="dropOptions"></vue-dropzone>
    <button @click="removeAllFiles">Remove All Files</button>
  </div>
</template>

<script>
import vueDropzone from "vue2-dropzone";

export default {
  // ...
  methods: {
    removeAllFiles() {
      this.$refs.dropzone.removeAllFiles();
    }
  }
};
</script>

处理事件

一堆事件 可用于在发生某事时执行任何类型的操作。

例如,要检查文件何时上传,我们可以使用 vdropzone-complete 事件:

<template>
  <div id="app">
    <vue-dropzone
      ref="dropzone"
      id="drop1"
      :options="dropOptions"
      @vdropzone-complete="afterComplete"
    ></vue-dropzone>
    <button @click="removeAllFiles">Remove All Files</button>
  </div>
</template>

<script>
import vueDropzone from "vue2-dropzone";

export default {
  // ...
  methods: {
    afterComplete(file) {
      console.log(file);
    }
  }
};
</script>

您不需要将事件用于许多常见操作,甚至在上传失败或上传被取消时显示消息。 vue-dropzone 默认情况下以可自定义的形式为您提供所有这些,因此在使用事件之前检查您想要的功能是否已经存在。

自定义样式

为了自定义 dropzone 的样式,首先必须将 include-styling 属性设置为 false 以关闭默认样式:

<vue-dropzone
  id="drop1"
  :include-styling="false"
></vue-dropzone>

然后提供一个 previewTemplate 选项,传递一个带有模板的字符串和由其类定义的正确结构。 作为起点,我们可以从官方示例中获取模板示例:

<vue-dropzone
  id="drop1"
  :options="dropOptions"
  :include-styling="false"
></vue-dropzone>

<script>
const getTemplate = () => `
<div class="dz-preview dz-file-preview">
  <div class="dz-image">
    <div data-dz-thumbnail-bg></div>
  </div>
  <div class="dz-details">
    <div class="dz-size"><span data-dz-size></span></div>
    <div class="dz-filename"><span data-dz-name></span></div>
  </div>
  <div class="dz-progress"><span class="dz-upload" data-dz-uploadprogress></span></div>
  <div class="dz-error-message"><span data-dz-errormessage></span></div>
  <div class="dz-success-mark"><i class="fa fa-check"></i></div>
  <div class="dz-error-mark"><i class="fa fa-close"></i></div>
</div>
`;

export default {
  data: () => ({
    dropOptions: {
      previewTemplate: getTemplate()
    }
  })
}
</script>

然后可以通过定位不同的类名来使用 CSS 对其进行样式设置:

<style>
  #drop1 {
    height: 200px;
    padding: 40px;
    color: white;
    background: black;
  }

  #drop1 .dz-preview {
    width: 160px;
  }
  /* ... */
</style>

结论

我希望这篇介绍能给你一个起点,让你自己去玩 vue-dropzone

您可以在 this Codesandbox 中找到工作演示和本文中的代码。