Browse Source

视频上传修改

dev-V1.10.2-temp
wangmingyong@163.com 2 months ago
parent
commit
0797fd7265
  1. 68
      zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js
  2. 20
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/nos/components/NosDetailMaterialsTab.vue

68
zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js

@ -114,49 +114,34 @@ export const takePhotoWithWaterMark = async ({
} }
// 将文件从公共目录复制到应用私有目录(解决 Android 11+ 分区存储导致的 EACCES 权限问题) // 将文件从公共目录复制到应用私有目录(解决 Android 11+ 分区存储导致的 EACCES 权限问题)
const copyFileToAppDir = (sourcePath) => { const copyFileToAppDir = async (sourcePath) => {
return new Promise((resolve, reject) => { if (!window.cordova?.file?.dataDirectory) {
if (!window.cordova?.file?.dataDirectory) { throw new Error('cordova.file.dataDirectory 不可用')
reject(new Error('cordova.file.dataDirectory 不可用')) }
return console.log('[w6sMedia] copyFileToAppDir sourcePath:', sourcePath)
}
window.resolveLocalFileSystemURL( const sourceEntry = await new Promise((resolve, reject) => {
sourcePath, window.resolveLocalFileSystemURL(sourcePath, resolve, reject)
(fileEntry) => { })
window.resolveLocalFileSystemURL( console.log('[w6sMedia] 源文件 entry:', sourceEntry.fullPath, 'name:', sourceEntry.name)
window.cordova.file.dataDirectory,
(dataDirEntry) => { const dataDirEntry = await new Promise((resolve, reject) => {
const fileName = fileEntry.name window.resolveLocalFileSystemURL(window.cordova.file.dataDirectory, resolve, reject)
fileEntry.copyTo( })
dataDirEntry, console.log('[w6sMedia] 应用私有目录:', dataDirEntry.fullPath)
fileName,
(newFileEntry) => { const newFileEntry = await new Promise((resolve, reject) => {
console.log('[w6sMedia] 文件已复制到应用私有目录:', newFileEntry.fullPath) sourceEntry.copyTo(dataDirEntry, sourceEntry.name, resolve, reject)
resolve(newFileEntry.fullPath)
},
(copyErr) => {
console.error('[w6sMedia] 复制文件失败:', copyErr)
reject(copyErr)
}
)
},
(dirErr) => {
console.error('[w6sMedia] 获取应用私有目录失败:', dirErr)
reject(dirErr)
}
)
},
(fileErr) => {
console.error('[w6sMedia] 解析源文件失败:', fileErr, 'sourcePath:', sourcePath)
reject(fileErr)
}
)
}) })
// toURL() 返回 file:// 格式的 URL,FileTransfer 可直接使用
const fileUrl = newFileEntry.toURL()
console.log('[w6sMedia] 文件已复制到应用私有目录, fileUrl:', fileUrl, 'fullPath:', newFileEntry.fullPath)
return fileUrl
} }
// 录制视频(使用 Cordova 原生 Media Capture API) // 录制视频(使用 Cordova 原生 Media Capture API)
export const startVideoRecorder = async ({ export const startVideoRecorder = async ({
duration = 60, duration = 0,
quality = 1, // 0 高清 / 1 一般 / 2 流畅 quality = 1, // 0 高清 / 1 一般 / 2 流畅
front = false, front = false,
syncSystemAlbum = false, syncSystemAlbum = false,
@ -202,7 +187,7 @@ export const startVideoRecorder = async ({
console.error('[w6sMedia] captureVideo fail:', error, 'code:', error?.code, 'message:', error?.message) console.error('[w6sMedia] captureVideo fail:', error, 'code:', error?.code, 'message:', error?.message)
reject(error) reject(error)
}, },
{ limit: 1, duration } duration ? { limit: 1, duration } : { limit: 1 }
) )
}) })
} }
@ -249,7 +234,7 @@ export const uploadLocalFileToBackend = async ({
success: (res) => { success: (res) => {
console.log('[w6sMedia] file.upload success 原始返回:', res) console.log('[w6sMedia] file.upload success 原始返回:', res)
try { try {
const parsed = typeof res.response === 'string' ? JSON.parse(res.response) : res.response const parsed = JSON.parse(res.response)
console.log('[w6sMedia] 解析后的上传响应:', parsed) console.log('[w6sMedia] 解析后的上传响应:', parsed)
resolve(parsed) resolve(parsed)
} catch (e) { } catch (e) {
@ -264,7 +249,8 @@ export const uploadLocalFileToBackend = async ({
}, },
opts opts
).catch((err) => { ).catch((err) => {
console.error('[w6sMedia] w6s.file.upload 异常:', err) // w6s.file.upload 在 responseCode !== 200 时会 reject 但不调用 fail 回调
console.error('[w6sMedia] w6s.file.upload Promise reject:', err)
reject(err) reject(err)
}) })
}) })

20
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/nos/components/NosDetailMaterialsTab.vue

@ -486,7 +486,9 @@ const pushSdkFileToFileList = async (item, { localPath, fileName, mimeType, isIm
message: '上传中...', message: '上传中...',
} }
item.fileList.push(fileObj) item.fileList.push(fileObj)
console.log('[NosDetail] 已 push 到 fileList, 当前 fileList 长度:', item.fileList.length, 'fileObj:', fileObj) // 取数组中的响应式引用,避免后续直接修改原始普通对象导致视图不更新
const reactiveFile = item.fileList[item.fileList.length - 1]
console.log('[NosDetail] 已 push 到 fileList, 当前 fileList 长度:', item.fileList.length)
try { try {
const res = await uploadLocalFileToBackend({ fileURL: localPath, fileName, mimeType }) const res = await uploadLocalFileToBackend({ fileURL: localPath, fileName, mimeType })
console.log('[NosDetail] 上传后端返回 res:', res) console.log('[NosDetail] 上传后端返回 res:', res)
@ -496,19 +498,19 @@ const pushSdkFileToFileList = async (item, { localPath, fileName, mimeType, isIm
: (data && (data.data || data.url || data.fileUrl || data.path)) || '' : (data && (data.data || data.url || data.fileUrl || data.path)) || ''
console.log('[NosDetail] 解析出的 filePath:', filePath, 'data:', data) console.log('[NosDetail] 解析出的 filePath:', filePath, 'data:', data)
if (filePath) { if (filePath) {
fileObj.url = toFullFileUrl(filePath) reactiveFile.url = toFullFileUrl(filePath)
fileObj.status = 'done' reactiveFile.status = 'done'
fileObj.message = '' reactiveFile.message = ''
console.log('[NosDetail] 上传成功, fileObj.url:', fileObj.url) console.log('[NosDetail] 上传成功, url:', reactiveFile.url)
} else { } else {
fileObj.status = 'failed' reactiveFile.status = 'failed'
fileObj.message = '上传失败' reactiveFile.message = '上传失败'
console.warn('[NosDetail] 上传失败: filePath 为空') console.warn('[NosDetail] 上传失败: filePath 为空')
} }
} catch (err) { } catch (err) {
console.error('[NosDetail] w6s 上传后端失败:', err) console.error('[NosDetail] w6s 上传后端失败:', err)
fileObj.status = 'failed' reactiveFile.status = 'failed'
fileObj.message = '上传失败' reactiveFile.message = '上传失败'
} }
} }

Loading…
Cancel
Save