fix:PUT改用uni.request+ArrayBuffer避免App XHR传输不完整

This commit is contained in:
97694732@qq.com 2026-06-05 11:59:53 +08:00
parent a670a8e610
commit ede3d838b2

View File

@ -177,13 +177,13 @@ export function uploadImage(filePath, typeDir) {
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
syncServerTime().then(function () { syncServerTime().then(function () {
readFileAsBase64(filePath).then(function (base64) { readFileAsBase64(filePath).then(function (base64) {
// base64 → ArrayBuffer → BlobBlob 是 App XHR 最可靠的二进制传输方式) // base64 → ArrayBuffer
var binaryStr = atob(base64) var binaryStr = atob(base64)
var bytes = new Uint8Array(binaryStr.length) var bytes = new Uint8Array(binaryStr.length)
for (var i = 0; i < binaryStr.length; i++) { for (var i = 0; i < binaryStr.length; i++) {
bytes[i] = binaryStr.charCodeAt(i) bytes[i] = binaryStr.charCodeAt(i)
} }
var blob = new Blob([bytes.buffer], { type: 'application/octet-stream' }) var arrayBuffer = bytes.buffer
var payloadHash = 'UNSIGNED-PAYLOAD' var payloadHash = 'UNSIGNED-PAYLOAD'
var now = getServerDate() var now = getServerDate()
@ -203,39 +203,35 @@ export function uploadImage(filePath, typeDir) {
console.log('【MinIO上传】URL:', url) console.log('【MinIO上传】URL:', url)
console.log('【MinIO上传】contentType:', contentType) console.log('【MinIO上传】contentType:', contentType)
console.log('【MinIO上传】dataSize:', blob.size, '字节') console.log('【MinIO上传】dataSize:', arrayBuffer.byteLength, '字节')
console.log('【MinIO上传】服务器时间:', now.toISOString()) console.log('【MinIO上传】服务器时间:', now.toISOString())
// 使用 plus.net.XMLHttpRequest PUT发送 Blob // 使用 uni.request PUTApp 环境中 ArrayBuffer 传输最可靠)
if (typeof plus !== 'undefined' && plus.net && plus.net.XMLHttpRequest) { uni.request({
try { url: url,
var xhr = new plus.net.XMLHttpRequest() method: 'PUT',
xhr.onreadystatechange = function () { header: {
if (xhr.readyState === 4) { 'Content-Type': contentType,
console.log('【MinIO上传】status:', xhr.status) 'X-Amz-Content-Sha256': payloadHash,
if (xhr.status === 200) { 'X-Amz-Date': sig.amzDate,
console.log('【MinIO上传】成功:', url) 'Authorization': sig.authHeader
resolve(url) },
} else { data: arrayBuffer,
console.error('【MinIO上传】失败, HTTP:', xhr.status, (xhr.responseText || xhr.response || '').substring(0, 200)) success: function (res) {
reject(new Error('上传失败: HTTP ' + xhr.status)) console.log('【MinIO上传】status:', res.statusCode)
} if (res.statusCode === 200) {
} console.log('【MinIO上传】成功:', url)
resolve(url)
} else {
console.error('【MinIO上传】失败, HTTP:', res.statusCode, JSON.stringify(res.data || '').substring(0, 200))
reject(new Error('上传失败: HTTP ' + res.statusCode))
} }
xhr.open('PUT', url) },
xhr.setRequestHeader('Content-Type', contentType) fail: function (err) {
xhr.setRequestHeader('X-Amz-Content-Sha256', payloadHash) console.error('【MinIO上传】uni.request失败:', JSON.stringify(err))
xhr.setRequestHeader('X-Amz-Date', sig.amzDate) reject(new Error('上传网络错误'))
xhr.setRequestHeader('Authorization', sig.authHeader)
console.log('【MinIO上传】发送数据...')
xhr.send(blob)
return
} catch (e) {
console.warn('【MinIO上传】plus XHR失败:', e)
} }
} })
reject(new Error('当前环境不支持上传'))
}).catch(function (err) { reject(err) }) }).catch(function (err) { reject(err) })
}).catch(function (err) { reject(err) }) }).catch(function (err) { reject(err) })
}) })