riku
2026-01-22 f14ea940fb32105de8b592992e3f53c62f31d84d
component/uploader/uploader.js
@@ -1,13 +1,12 @@
module.exports =
  /******/
  (function (modules) { // webpackBootstrap
  (function (modules) {
    // webpackBootstrap
    /******/ // The module cache
    /******/
    var installedModules = {};
    var installedModules = {}; /******/ // The require function
    /******/
    /******/ // The require function
    /******/
    function __webpack_require__(moduleId) {
    /******/ function __webpack_require__(moduleId) {
      /******/
      /******/ // Check if module is in cache
      /******/
@@ -15,88 +14,72 @@
        /******/
        return installedModules[moduleId].exports;
        /******/
      }
      /******/ // Create a new module (and put it into the cache)
      /******/
      var module = installedModules[moduleId] = {
      } /******/ // Create a new module (and put it into the cache)
      /******/ var module = (installedModules[moduleId] = {
        /******/
        i: moduleId,
        /******/
        l: false,
        /******/
        exports: {}
        exports: {},
        /******/
      };
      }); /******/ // Execute the module function
      /******/
      /******/ // Execute the module function
      /******/ modules[moduleId].call(
        module.exports,
        module,
        module.exports,
        __webpack_require__,
      ); /******/ // Flag the module as loaded
      /******/
      modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
      /******/ module.l = true; /******/ // Return the exports of the module
      /******/
      /******/ // Flag the module as loaded
      /******/ return module.exports;
      /******/
      module.l = true;
      /******/
      /******/ // Return the exports of the module
      /******/
      return module.exports;
      /******/
    }
    } /******/ // expose the modules object (__webpack_modules__)
    /******/
    /******/
    /******/ // expose the modules object (__webpack_modules__)
    /******/ __webpack_require__.m = modules; /******/ // expose the module cache
    /******/
    __webpack_require__.m = modules;
    /******/ __webpack_require__.c = installedModules; /******/ // define getter function for harmony exports
    /******/
    /******/ // expose the module cache
    /******/
    __webpack_require__.c = installedModules;
    /******/
    /******/ // define getter function for harmony exports
    /******/
    __webpack_require__.d = function (exports, name, getter) {
    /******/ __webpack_require__.d = function (exports, name, getter) {
      /******/
      if (!__webpack_require__.o(exports, name)) {
        /******/
        Object.defineProperty(exports, name, {
          enumerable: true,
          get: getter
          get: getter,
        });
        /******/
      }
      /******/
    };
    }; /******/ // define __esModule on exports
    /******/
    /******/ // define __esModule on exports
    /******/
    __webpack_require__.r = function (exports) {
    /******/ __webpack_require__.r = function (exports) {
      /******/
      if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
        /******/
        Object.defineProperty(exports, Symbol.toStringTag, {
          value: 'Module'
          value: 'Module',
        });
        /******/
      }
      /******/
      Object.defineProperty(exports, '__esModule', {
        value: true
        value: true,
      });
      /******/
    };
    }; /******/ /******/ /******/ /******/ /******/ // create a fake namespace object // mode & 1: value is a module id, require it // mode & 2: merge all properties of value into the ns // mode & 4: return value when already ns object // mode & 8|1: behave like require
    /******/
    /******/ // create a fake namespace object
    /******/ // mode & 1: value is a module id, require it
    /******/ // mode & 2: merge all properties of value into the ns
    /******/ // mode & 4: return value when already ns object
    /******/ // mode & 8|1: behave like require
    /******/
    __webpack_require__.t = function (value, mode) {
    /******/ __webpack_require__.t = function (value, mode) {
      /******/
      if (mode & 1) value = __webpack_require__(value);
      /******/
      if (mode & 8) return value;
      /******/
      if ((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
      if (mode & 4 && typeof value === 'object' && value && value.__esModule)
        return value;
      /******/
      var ns = Object.create(null);
      /******/
@@ -104,28 +87,32 @@
      /******/
      Object.defineProperty(ns, 'default', {
        enumerable: true,
        value: value
        value: value,
      });
      /******/
      if (mode & 2 && typeof value != 'string')
        for (var key in value) __webpack_require__.d(ns, key, function (key) {
        for (var key in value)
          __webpack_require__.d(
            ns,
            key,
            function (key) {
          return value[key];
        }.bind(null, key));
            }.bind(null, key),
          );
      /******/
      return ns;
      /******/
    };
    }; /******/ // getDefaultExport function for compatibility with non-harmony modules
    /******/
    /******/ // getDefaultExport function for compatibility with non-harmony modules
    /******/ __webpack_require__.n = function (module) {
    /******/
    __webpack_require__.n = function (module) {
      /******/
      var getter = module && module.__esModule ?
        /******/
      var getter =
        module && module.__esModule
          ? /******/
        function getDefault() {
          return module['default'];
        } :
        /******/
            }
          : /******/
        function getModuleExports() {
          return module;
        };
@@ -134,70 +121,61 @@
      /******/
      return getter;
      /******/
    };
    }; /******/ // Object.prototype.hasOwnProperty.call
    /******/
    /******/ // Object.prototype.hasOwnProperty.call
    /******/
    __webpack_require__.o = function (object, property) {
    /******/ __webpack_require__.o = function (object, property) {
      return Object.prototype.hasOwnProperty.call(object, property);
    };
    }; /******/ // __webpack_public_path__
    /******/
    /******/ // __webpack_public_path__
    /******/
    __webpack_require__.p = "";
    /******/ __webpack_require__.p = ''; /******/ // Load entry module and return exports
    /******/
    /******/
    /******/ // Load entry module and return exports
    /******/ return __webpack_require__((__webpack_require__.s = 22));
    /******/
    return __webpack_require__(__webpack_require__.s = 22);
    /******/
  })
  })(
/************************************************************************/
/******/
({
    {
  /***/
  22:
    /***/
    (function (module, exports, __webpack_require__) {
      "use strict";
        function (module, exports, __webpack_require__) {
          'use strict';
      Component({
        options: {
          addGlobalClass: true
              addGlobalClass: true,
        },
        properties: {
          title: {
            type: String,
            value: ''
                value: '',
          },
          titleClass: {
            type: "String",
            value: ""
                type: 'String',
                value: '',
          },
          sizeType: {
            type: Array,
            value: ['original', 'compressed']
                value: ['original', 'compressed'],
          },
          sourceType: {
            type: Array,
            value: ['album', 'camera']
                value: ['album', 'camera'],
          },
          maxSize: {
            type: Number,
            value: 5 * 1024 * 1024
                value: 5 * 1024 * 1024,
          },
          maxCount: {
            // 最多上传多少个文件
            type: Number,
            value: 1
                value: 1,
          },
          countInfo: {
            type: String,
            value: ""
                value: '',
          },
          files: {
            // 当前的图片列表, {url, error, loading}
@@ -206,75 +184,83 @@
            observer(newVal) {
              this.setData({
                currentFiles: newVal
                    currentFiles: newVal,
              });
            }
                },
          },
          select: {
            // 过滤某个文件
            type: null,
            value: null
                value: null,
          },
          upload: {
            // 返回Promise的一个文件上传的函数
            type: null,
            value: () => {}
                value: () => {},
          },
          tips: {
            type: String,
            value: ''
                value: '',
          },
          extClass: {
            type: String,
            value: ''
                value: '',
          },
          showDelete: {
            // 是否显示delete按钮
            type: Boolean,
            value: true
          }
                value: true,
              },
              allowFiles: {
                // 是否允许选择图片之外的其他格式文件
                type: Boolean,
                value: false,
              },
        },
        data: {
          currentFiles: [],
          showPreview: false,
          previewImageUrls: [],
          groups: [{
              groups: [
                {
            text: '选择图片',
            value: 0
          }, {
                  value: 0,
                },
                {
            text: '从聊天记录选择文件',
            value: 1
          }],
                  value: 1,
                },
              ],
        },
        ready() {},
        methods: {
          showActionSheet() {
                if (this.data.allowFiles) {
            this.setData({
              showSheet: true
            })
                    showSheet: true,
                  });
                } else {
                  this.chooseImage();
                }
          },
          previewImage(e) {
            const {
              index
            } = e.currentTarget.dataset;
            const previewImageUrls = [];
            this.data.files.forEach(item => {
              previewImageUrls.push(item.url);
            });
                const { index } = e.currentTarget.dataset;
                const f = this.data.files[index];
                const previewImageUrls = this.data.files
                  .filter(f => f.type == 'image')
                  .map(f => f.url);
                const i = previewImageUrls.indexOf(f.url);
            this.setData({
              previewImageUrls,
              previewCurrent: index,
              showPreview: true
                  previewCurrent: i,
                  showPreview: true,
            });
          },
          previewFile(e) {
            const {
              index
            } = e.currentTarget.dataset;
            const file = this.data.files[index]
                const { index } = e.currentTarget.dataset;
                const file = this.data.files[index];
            wx.openDocument({
              filePath: file.url,
            });
@@ -282,18 +268,18 @@
          actionClick(e) {
            switch (e.detail.value) {
              case 0:
                this.chooseImage()
                    this.chooseImage();
                break;
              case 1:
                this.chooseMessageFile()
                    this.chooseMessageFile();
                break;
              default:
                this.chooseImage()
                    this.chooseImage();
                break;
            }
            this.setData({
              showSheet: false
            })
                  showSheet: false,
                });
          },
          chooseImage() {
            if (this.uploading) return;
@@ -302,10 +288,12 @@
              sizeType: ['compressed'],
              mediaType: ['image'],
              success: res => {
                console.log('chooseImage resp', res)
                    console.log('chooseImage resp', res);
                // 首先检查文件大小
                let invalidIndex = -1; // @ts-ignore
                res.tempFilePaths = res.tempFiles.map(item => item.tempFilePath)
                    res.tempFilePaths = res.tempFiles.map(
                      item => item.tempFilePath,
                    );
                res.tempFiles.forEach((item, index) => {
                  if (item.size > this.data.maxSize) {
                    invalidIndex = index;
@@ -318,15 +306,18 @@
                  }
                }
                if (invalidIndex >= 0) {
                  this.triggerEvent('fail', {
                      this.triggerEvent(
                        'fail',
                        {
                    type: 1,
                    errMsg: `chooseImage:fail size exceed ${this.data.maxSize}`,
                    total: res.tempFilePaths.length,
                    index: invalidIndex
                  }, {});
                          index: invalidIndex,
                        },
                        {},
                      );
                  return;
                } // 获取文件内容
                const mgr = wx.getFileSystemManager();
                const contents = res.tempFilePaths.map(item => {
@@ -337,7 +328,7 @@
                const obj = {
                  tempFilePaths: res.tempFilePaths,
                  tempFiles: res.tempFiles,
                  contents
                      contents,
                }; // 触发选中的事件,开发者根据内容来上传文件,上传了把上传的结果反馈到files属性里面
                this.triggerEvent('select', obj, {});
@@ -346,28 +337,30 @@
                  loading: true,
                  url: item.tempFilePath,
                  type: item.fileType,
                }))
                    }));
                //压缩图片
                wx.compressImage({
                  src: files[0].url,
                  quality: 20,
                  success(data) {
                    console.log('compressImage', data)
                        console.log('compressImage', data);
                  },
                  fail() {
                  }
                })
                      fail() {},
                    });
                if (!files || !files.length) return;
                const newFiles = this.data.files.concat(files);
                this.setData({
                  files: newFiles,
                  currentFiles: newFiles
                      currentFiles: newFiles,
                });
                this.triggerEvent('uploadImg', {
                  newFiles
                }, {})
                    this.triggerEvent(
                      'uploadImg',
                      {
                        newFiles,
                      },
                      {},
                    );
              },
              fail: fail => {
                if (fail.errMsg.indexOf('chooseImage:fail cancel') >= 0) {
@@ -376,7 +369,7 @@
                }
                fail.type = 2;
                this.triggerEvent('fail', fail, {});
              }
                  },
            });
          },
          chooseMessageFile() {
@@ -384,12 +377,21 @@
            wx.chooseMessageFile({
              count: this.data.maxCount - this.data.files.length,
              type: 'file',
              extension: ['xls', 'xlsx', 'csv', 'doc', 'docx', 'pdf', 'ppt', 'pptx'],
                  extension: [
                    'xls',
                    'xlsx',
                    'csv',
                    'doc',
                    'docx',
                    'pdf',
                    'ppt',
                    'pptx',
                  ],
              success: res => {
                console.log('chooseMessageFile', res)
                    console.log('chooseMessageFile', res);
                // 首先检查文件大小
                let invalidIndex = -1; // @ts-ignore
                res.tempFilePaths = res.tempFiles.map(item => item.path)
                    res.tempFilePaths = res.tempFiles.map(item => item.path);
                res.tempFiles.forEach((item, index) => {
                  if (item.size > this.data.maxSize) {
                    invalidIndex = index;
@@ -402,15 +404,18 @@
                  }
                }
                if (invalidIndex >= 0) {
                  this.triggerEvent('fail', {
                      this.triggerEvent(
                        'fail',
                        {
                    type: 1,
                    errMsg: `chooseMessageFile:fail size exceed ${this.data.maxSize}`,
                    total: res.tempFilePaths.length,
                    index: invalidIndex
                  }, {});
                          index: invalidIndex,
                        },
                        {},
                      );
                  return;
                } // 获取文件内容
                const mgr = wx.getFileSystemManager();
                const contents = res.tempFilePaths.map(item => {
@@ -421,90 +426,97 @@
                const obj = {
                  tempFilePaths: res.tempFilePaths,
                  tempFiles: res.tempFiles,
                  contents
                      contents,
                }; // 触发选中的事件,开发者根据内容来上传文件,上传了把上传的结果反馈到files属性里面
                this.triggerEvent('select', obj, {});
                let files = res.tempFiles.map((item, i) => {
                  // 判断文件类型,对应不同样式
                  let extensionClass = ''
                  switch (item.name.split('.')[1]) {
                      const list = item.name.split('.');
                      const ext = list[list.length - 1];
                      let extensionClass = '';
                      switch (ext) {
                    case 'xls':
                    case 'xlsx':
                    case 'csv':
                      extensionClass = 'file_xlsx'
                          extensionClass = 'file_xlsx';
                      break;
                    case 'doc':
                    case 'docx':
                      extensionClass = 'file_word'
                          extensionClass = 'file_word';
                      break;
                    case 'pdf':
                      extensionClass = 'file_pdf'
                          extensionClass = 'file_pdf';
                      break;
                    case 'ppt':
                    case 'pptx':
                      extensionClass = 'file_ppt'
                          extensionClass = 'file_ppt';
                      break;
                    default:
                      break;
                  }
                  // 拆分文件名称,实现文本过长时,中间省略
                  const ellipsisName = {
                    start: item.name.slice(0, -5),
                    // 取末尾5个字符常态显示
                    end: item.name.substr(-5, 5)
                  }
                  // 文件大小格式化
                  let size = parseInt(item.size / 1024)
                      let size = parseInt(item.size / 1024);
                  if (size > 1024) {
                    size = parseInt(size / 1024) + ' MB'
                        size = (size / 1024).toFixed(1) + ' MB';
                  } else {
                    size += ' KB'
                        size += ' KB';
                  }
                  return {
                    loading: true,
                    url: item.path,
                    name: item.name,
                    ellipsisName,
                        ext: ext ?? '',
                    styleClass: extensionClass,
                    type: item.type,
                    time: item.time,
                    size
                  }
                })
                        size,
                      };
                    });
                if (!files || !files.length) return;
                const newFiles = this.data.files.concat(files);
                this.setData({
                  files: newFiles,
                  currentFiles: newFiles
                      currentFiles: newFiles,
                });
                this.triggerEvent('uploadImg', {
                  newFiles
                }, {})
              }
            })
                    this.triggerEvent(
                      'uploadImg',
                      {
                        newFiles,
                      },
                      {},
                    );
                  },
                });
          },
          deletePic(e) {
            const index = e.detail.index;
                this._delete(index);
              },
              deleteFile(e) {
                const { index } = e.currentTarget.dataset;
                this._delete(index);
              },
              _delete(index) {
            const files = this.data.files;
            const file = files.splice(index, 1);
            this.setData({
              files,
              currentFiles: files
                  currentFiles: files,
            });
            this.triggerEvent('delete', {
              index,
              item: file[0]
                  item: file[0],
            });
          },
        }
            },
      });
      /***/
    })
        },
  /******/
});
    },
  );