|
@@ -0,0 +1,168 @@
|
|
|
|
+/**
|
|
|
|
+ * 文件选择工具函数
|
|
|
|
+ * 提供统一的文件选择接口,包含完整的错误处理和兼容性检查
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 选择微信聊天文件
|
|
|
|
+ * @param {Object} options 配置选项
|
|
|
|
+ * @param {number} options.count 最多可以选择的文件个数,默认1
|
|
|
|
+ * @param {string} options.type 文件类型,默认'file'
|
|
|
|
+ * @param {Array} options.allowedTypes 允许的文件类型,默认['pdf', 'docx', 'doc']
|
|
|
|
+ * @param {number} options.maxSize 最大文件大小(MB),默认20
|
|
|
|
+ * @returns {Promise} 返回选择的文件信息
|
|
|
|
+ */
|
|
|
|
+export function chooseMessageFile(options = {}) {
|
|
|
|
+ const {
|
|
|
|
+ count = 1,
|
|
|
|
+ type = 'file',
|
|
|
|
+ allowedTypes = ['pdf', 'docx', 'doc'],
|
|
|
|
+ maxSize = 20
|
|
|
|
+ } = options
|
|
|
|
+
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
+ // 检查API是否可用
|
|
|
|
+ if (typeof wx === 'undefined' || typeof wx.chooseMessageFile !== 'function') {
|
|
|
|
+ const error = new Error('当前环境不支持文件选择功能')
|
|
|
|
+ error.code = 'API_NOT_AVAILABLE'
|
|
|
|
+ reject(error)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ console.log('开始调用wx.chooseMessageFile')
|
|
|
|
+
|
|
|
|
+ wx.chooseMessageFile({
|
|
|
|
+ count,
|
|
|
|
+ type,
|
|
|
|
+ success(res) {
|
|
|
|
+ console.log('文件选择成功:', res)
|
|
|
|
+
|
|
|
|
+ // 检查返回结果
|
|
|
|
+ if (!res || !res.tempFiles || !res.tempFiles.length) {
|
|
|
|
+ const error = new Error('文件选择失败,请重试')
|
|
|
|
+ error.code = 'NO_FILES_SELECTED'
|
|
|
|
+ reject(error)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const file = res.tempFiles[0]
|
|
|
|
+
|
|
|
|
+ // 检查文件大小
|
|
|
|
+ if (file.size / (1024 * 1024) > maxSize) {
|
|
|
|
+ const error = new Error(`文件大小不能超过${maxSize}M`)
|
|
|
|
+ error.code = 'FILE_TOO_LARGE'
|
|
|
|
+ reject(error)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 检查文件类型
|
|
|
|
+ const fileExtension = file.name.split('.').pop().toLowerCase()
|
|
|
|
+ if (!allowedTypes.includes(fileExtension)) {
|
|
|
|
+ const error = new Error(`请上传${allowedTypes.join('、')}类型的文件`)
|
|
|
|
+ error.code = 'INVALID_FILE_TYPE'
|
|
|
|
+ reject(error)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ resolve({
|
|
|
|
+ name: file.name,
|
|
|
|
+ path: file.path,
|
|
|
|
+ size: file.size,
|
|
|
|
+ extension: fileExtension
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ fail(error) {
|
|
|
|
+ console.error('文件选择失败:', error)
|
|
|
|
+ const err = new Error('文件选择失败,请检查权限设置或重试')
|
|
|
|
+ err.code = 'CHOOSE_FILE_FAILED'
|
|
|
|
+ err.originalError = error
|
|
|
|
+ reject(err)
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 上传文件并保存简历
|
|
|
|
+ * @param {Object} fileInfo 文件信息
|
|
|
|
+ * @param {string} fileInfo.name 文件名
|
|
|
|
+ * @param {string} fileInfo.path 文件路径
|
|
|
|
+ * @param {Function} uploadFileFunc 上传文件函数
|
|
|
|
+ * @param {Function} saveResumeFunc 保存简历函数
|
|
|
|
+ * @returns {Promise} 返回上传结果
|
|
|
|
+ */
|
|
|
|
+export async function uploadAndSaveResume(fileInfo, uploadFileFunc, saveResumeFunc) {
|
|
|
|
+ try {
|
|
|
|
+ // 显示上传进度
|
|
|
|
+ uni.showLoading({
|
|
|
|
+ title: '上传中...'
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ const uploadResult = await uploadFileFunc(fileInfo.path, 'attachment')
|
|
|
|
+
|
|
|
|
+ if (!uploadResult.data) {
|
|
|
|
+ throw new Error('上传失败')
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ await saveResumeFunc({
|
|
|
|
+ title: fileInfo.name,
|
|
|
|
+ url: uploadResult.data
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ uni.hideLoading()
|
|
|
|
+ uni.showToast({
|
|
|
|
+ title: '上传成功',
|
|
|
|
+ icon: 'success'
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ return {
|
|
|
|
+ success: true,
|
|
|
|
+ data: uploadResult.data
|
|
|
|
+ }
|
|
|
|
+ } catch (error) {
|
|
|
|
+ uni.hideLoading()
|
|
|
|
+ console.error('上传文件失败:', error)
|
|
|
|
+
|
|
|
|
+ uni.showToast({
|
|
|
|
+ title: error.message || '上传失败,请重试',
|
|
|
|
+ icon: 'none',
|
|
|
|
+ duration: 2000
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ throw error
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 处理文件选择错误
|
|
|
|
+ * @param {Error} error 错误对象
|
|
|
|
+ */
|
|
|
|
+export function handleFilePickerError(error) {
|
|
|
|
+ let message = '文件选择失败'
|
|
|
|
+
|
|
|
|
+ switch (error.code) {
|
|
|
|
+ case 'API_NOT_AVAILABLE':
|
|
|
|
+ message = '当前环境不支持文件选择功能'
|
|
|
|
+ break
|
|
|
|
+ case 'NO_FILES_SELECTED':
|
|
|
|
+ message = '文件选择失败,请重试'
|
|
|
|
+ break
|
|
|
|
+ case 'FILE_TOO_LARGE':
|
|
|
|
+ message = error.message
|
|
|
|
+ break
|
|
|
|
+ case 'INVALID_FILE_TYPE':
|
|
|
|
+ message = error.message
|
|
|
|
+ break
|
|
|
|
+ case 'CHOOSE_FILE_FAILED':
|
|
|
|
+ message = '文件选择失败,请检查权限设置或重试'
|
|
|
|
+ break
|
|
|
|
+ default:
|
|
|
|
+ message = error.message || '文件选择失败'
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ uni.showToast({
|
|
|
|
+ icon: 'none',
|
|
|
|
+ title: message,
|
|
|
|
+ duration: 3000
|
|
|
|
+ })
|
|
|
|
+}
|