fix: 头像转 base64 持久化
WeChat chooseAvatar 返回的 wxfile:// 临时 URL 几天后失效, 头像会变灰。加 util.fileToDataURI 把临时文件读成 data URI 存到本地(限制 512KB,超出走降级方案),从根上解决。
This commit is contained in:
+42
-1
@@ -54,11 +54,52 @@ const formatDate = (date) => {
|
||||
/** Strip the time portion of a formatDate string → "YYYY-MM-DD". */
|
||||
const _dateOnly = (s) => (typeof s === 'string' && s.length >= 10) ? s.substring(0, 10) : ''
|
||||
|
||||
/**
|
||||
* Convert a local file path (typically `wxfile://...` from chooseAvatar) to a
|
||||
* base64 data URI. Used to make temporary file URLs survive the WeChat
|
||||
* expiration window (a few days) by embedding the bytes inline.
|
||||
*
|
||||
* Rejects if the file exceeds `maxBytes` (default 512KB) so a stray huge
|
||||
* image doesn't blow the 10MB total wx.storage budget. Caller should
|
||||
* fall back to the raw URL on rejection.
|
||||
*/
|
||||
const fileToDataURI = (filePath, maxBytes = 512 * 1024) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
if (!filePath || typeof wx.getFileSystemManager !== 'function') {
|
||||
reject(new Error('FileSystemManager unavailable'))
|
||||
return
|
||||
}
|
||||
const fs = wx.getFileSystemManager()
|
||||
fs.getFileInfo({
|
||||
filePath,
|
||||
success: (info) => {
|
||||
if (info.size > maxBytes) {
|
||||
reject(new Error(`File too large: ${info.size} > ${maxBytes}`))
|
||||
return
|
||||
}
|
||||
fs.readFile({
|
||||
filePath,
|
||||
encoding: 'base64',
|
||||
success: (res) => {
|
||||
// chooseAvatar returns PNG; allow JPG/GIF/WEBP fallbacks.
|
||||
const m = (filePath.match(/\.(\w+)(?:\?|$)/) || [, 'png'])[1].toLowerCase()
|
||||
const mime = { png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', webp: 'image/webp' }[m] || 'image/png'
|
||||
resolve(`data:${mime};base64,${res.data}`)
|
||||
},
|
||||
fail: reject
|
||||
})
|
||||
},
|
||||
fail: reject
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
formatTime,
|
||||
formatDuration,
|
||||
getDaysInMonth,
|
||||
getMonthCalendar,
|
||||
formatDate,
|
||||
dateOnly: _dateOnly
|
||||
dateOnly: _dateOnly,
|
||||
fileToDataURI
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user