demo.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <div class="demo bg-w">
  3. <h2>基础用法</h2>
  4. <nut-uploader :url="uploadUrl" @start="start"></nut-uploader>
  5. <h2>上传状态</h2>
  6. <nut-uploader :url="uploadUrl" multiple @delete="onDelete"></nut-uploader>
  7. <h2>限制上传数量5个</h2>
  8. <nut-uploader :url="uploadUrl" multiple maximum="5"></nut-uploader>
  9. <h2>限制上传大小(每个文件最大不超过 50kb)</h2>
  10. <nut-uploader
  11. :url="uploadUrl"
  12. multiple
  13. :maximize="1024 * 50"
  14. @oversize="onOversize"
  15. ></nut-uploader>
  16. <h2>限制上传大小(在beforeupload钩子中处理)</h2>
  17. <nut-uploader
  18. :url="uploadUrl"
  19. multiple
  20. :before-upload="beforeUpload"
  21. :maximize="1024 * 50"
  22. @oversize="onOversize"
  23. ></nut-uploader>
  24. <h2>自定义数据 FormData 、 headers </h2>
  25. <nut-uploader
  26. :url="uploadUrl"
  27. :data="formData"
  28. :headers="formData"
  29. :with-credentials="true"
  30. ></nut-uploader>
  31. <h2>禁用状态</h2>
  32. <nut-uploader disabled></nut-uploader>
  33. </div>
  34. </template>
  35. <script lang="ts">
  36. import { createComponent } from '@/utils/create';
  37. import { FileItem } from './index.vue';
  38. const { createDemo } = createComponent('uploader');
  39. export default createDemo({
  40. setup() {
  41. const uploadUrl =
  42. 'https://my-json-server.typicode.com/linrufeng/demo/posts';
  43. const formData = {
  44. custom: 'test'
  45. };
  46. const fileToDataURL = (file: Blob): Promise<any> => {
  47. return new Promise(resolve => {
  48. const reader = new FileReader();
  49. reader.onloadend = e => resolve((e.target as FileReader).result);
  50. reader.readAsDataURL(file);
  51. });
  52. };
  53. const dataURLToImage = (dataURL: string): Promise<HTMLImageElement> => {
  54. return new Promise(resolve => {
  55. const img = new Image();
  56. img.onload = () => resolve(img);
  57. img.src = dataURL;
  58. });
  59. };
  60. const canvastoFile = (
  61. canvas: HTMLCanvasElement,
  62. type: string,
  63. quality: number
  64. ): Promise<Blob | null> => {
  65. return new Promise(resolve =>
  66. canvas.toBlob(blob => resolve(blob), type, quality)
  67. );
  68. };
  69. const onOversize = (files: File[]) => {
  70. console.log('oversize 触发 文件大小不能超过 50kb', files);
  71. };
  72. const onDelete = (file: FileItem, fileList: FileItem[]) => {
  73. console.log('delete 事件触发', file, fileList);
  74. };
  75. const beforeUpload = async (file: File[]) => {
  76. const canvas = document.createElement('canvas');
  77. const context = canvas.getContext('2d') as CanvasRenderingContext2D;
  78. const base64 = await fileToDataURL(file[0]);
  79. const img = await dataURLToImage(base64);
  80. canvas.width = img.width;
  81. canvas.height = img.height;
  82. context.clearRect(0, 0, img.width, img.height);
  83. context.drawImage(img, 0, 0, img.width, img.height);
  84. let blob = (await canvastoFile(canvas, 'image/jpeg', 0.5)) as Blob; //quality:0.5可根据实际情况计算
  85. const f = await new File([blob], file[0].name);
  86. return [f];
  87. };
  88. return {
  89. onOversize,
  90. beforeUpload,
  91. onDelete,
  92. uploadUrl,
  93. formData
  94. };
  95. }
  96. });
  97. </script>
  98. <style lang="scss" scoped></style>