// eslint-disable import { awaitWrap } from "./tools"; /** * 从本地相册选择图片或使用相机拍照 * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/media/image.html#chooseimage * @returns */ export const chooseImage = (config) => { return awaitWrap( new Promise((r, j) => { uni.chooseImage({ ...config, success: (res) => { const tmpFiles = res?.tempFiles.map((e) => ({ tempFilePath: e.path, tempFile: e, size: e.size, name: e.name, type: e.type, fileType: "image", })); return r({ type: "image", ...res, tempFiles: tmpFiles }); }, fail: (err) => j({ mode: "chooseImage", data: err }), }); }) ); }; /** * 拍摄视频或从手机相册中选视频,返回视频的临时文件路径 * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/media/video.html#choosevideo * @returns */ export const chooseVideo = (config) => { return awaitWrap( new Promise((r, j) => { uni.chooseVideo({ ...config, success: (res) => { const tmpFiles = [ { ...res, tempFilePath: res.tempFilePath, tempFile: res.tempFile ?? {}, size: res.size, name: res.name, type: res.tempFile?.type, fileType: "video", }, ]; return r({ type: "video", tempFiles: tmpFiles }); }, fail: (err) => j({ mode: "chooseVideo", data: err }), }); }) ); }; /** * 拍摄或从手机相册中选择图片或视频 * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia * @returns */ export const chooseMedia = (type, config) => { if (!type) return console.error("chooseMedia type cannot be empty"); if (!uni.chooseMedia && type === "image") return chooseImage(config); if (!uni.chooseMedia && type === "video") return chooseVideo(config); return awaitWrap( new Promise((r, j) => { uni.chooseMedia({ ...config, mediaType: [type], success: (res) => r(res), fail: (err) => j({ mode: "chooseMedia", data: err }), }); }) ); }; /** * 从本地选择文件(h5) * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/media/file.html#wx-choosemessagefile * @returns */ export const chooseFile = (config) => { return awaitWrap( new Promise((r, j) => { uni.chooseFile({ ...config, count: 1, //选择数量 success: (res) => { const tmpFiles = res?.tempFiles.map((e) => { let tmpType = "file"; if (e.type.includes("image")) { tmpType = "image"; } if (e.type.includes("video")) { tmpType = "video"; } return { tempFilePath: e.path, tempFile: e, size: e.size, name: e.name, type: e.type, fileType: tmpType, }; }); return r({ type: "file", ...res, tempFiles: tmpFiles }); }, fail: (err) => j({ mode: "chooseFile", data: err }), }); }) ); }; /** * 从本地选择文件(微信小程序) * @param {object} config 参数详情 => https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.chooseMessageFile.html * @returns */ export const chooseMessageFile = (config) => { return awaitWrap( new Promise((r, j) => { wx.chooseMessageFile({ ...config, success: (res) => { const tmpFiles = res?.tempFiles.map((e) => ({ ...e, tempFilePath: e.path, fileType: e.type ?? "file", })); return r({ type: "file", ...res, tempFiles: tmpFiles }); }, fail: (err) => j({ mode: "chooseMessageFile", data: err }), }); }) ); }; /** * 上传 * @param {object} config 参数详情 => https://uniapp.dcloud.net.cn/api/request/network-file.html#uploadfile * @param {object} exts 选择的文件的数据 * @returns {object} exts + response */ export const uploadFile = (config, exts = {}) => { return new Promise((r, j) => { uni.uploadFile({ ...config, success: (res) => r({ ...exts, response: JSON.parse(res.data) }), fail: (err) => j({ mode: "uploadFile", data: err }), }); }); }; export const appUploadFile = (config, exts = {}, onprogress) => { const { url, header, formData } = config; return new Promise((r, j) => { const xhr = new XMLHttpRequest(); xhr.open("POST", url, true); for (let key in header) { xhr.setRequestHeader(key, header[key]); } if (onprogress) { xhr.upload.onprogress = onprogress; } xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { r({ ...exts, response: JSON.parse(xhr.responseText) }); } else { j({ mode: "uploadFile", data: { data: xhr.responseText, errMsg: "uploadFile fail." }, }); } } }; xhr.send(formData); }); };