fix:使用Blob传输二进制数据,解决2.0B问题
This commit is contained in:
parent
274d600865
commit
a670a8e610
@ -5,6 +5,19 @@
|
|||||||
|
|
||||||
import sha256 from 'js-sha256'
|
import sha256 from 'js-sha256'
|
||||||
|
|
||||||
|
// ====== Polyfill: atob ======
|
||||||
|
if (typeof atob === 'undefined') {
|
||||||
|
var atob = function (input) {
|
||||||
|
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
||||||
|
input = input.replace(/=+$/, '')
|
||||||
|
var output = ''
|
||||||
|
for (var bc = 0, bs = 0, buffer, i = 0; buffer = input.charAt(i++); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {
|
||||||
|
buffer = chars.indexOf(buffer)
|
||||||
|
}
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ====== MinIO 配置 ======
|
// ====== MinIO 配置 ======
|
||||||
var CFG = {
|
var CFG = {
|
||||||
endpoint: 'shxy.image.yushutx.com',
|
endpoint: 'shxy.image.yushutx.com',
|
||||||
@ -77,19 +90,21 @@ function buildAuthHeader(objectKey, date, contentType, contentSha256) {
|
|||||||
return { authHeader: authHeader, amzDate: amzDate }
|
return { authHeader: authHeader, amzDate: amzDate }
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====== 文件读取(直接读 ArrayBuffer,避免 base64 编解码) ======
|
// ====== 文件读取(readAsDataURL → base64 → uni.base64ToArrayBuffer) ======
|
||||||
|
|
||||||
function readFileAsArrayBuffer(filePath) {
|
function readFileAsBase64(filePath) {
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
if (typeof plus !== 'undefined' && plus.io && plus.io.FileReader) {
|
if (typeof plus !== 'undefined' && plus.io && plus.io.FileReader) {
|
||||||
plus.io.resolveLocalFileSystemURL(filePath, function (entry) {
|
plus.io.resolveLocalFileSystemURL(filePath, function (entry) {
|
||||||
entry.file(function (file) {
|
entry.file(function (file) {
|
||||||
var reader = new plus.io.FileReader()
|
var reader = new plus.io.FileReader()
|
||||||
reader.onloadend = function (e) {
|
reader.onloadend = function (e) {
|
||||||
resolve(e.target.result)
|
var data = e.target.result
|
||||||
|
if (data.indexOf(',') > -1) data = data.split(',')[1]
|
||||||
|
resolve(data)
|
||||||
}
|
}
|
||||||
reader.onerror = function () { reject(new Error('FileReader失败')) }
|
reader.onerror = function () { reject(new Error('FileReader失败')) }
|
||||||
reader.readAsArrayBuffer(file)
|
reader.readAsDataURL(file)
|
||||||
}, function () { reject(new Error('获取文件对象失败')) })
|
}, function () { reject(new Error('获取文件对象失败')) })
|
||||||
}, function (err) {
|
}, function (err) {
|
||||||
reject(new Error('resolveLocalFileSystemURL失败: ' + JSON.stringify(err)))
|
reject(new Error('resolveLocalFileSystemURL失败: ' + JSON.stringify(err)))
|
||||||
@ -161,7 +176,14 @@ export function uploadImage(filePath, typeDir) {
|
|||||||
if (typeDir === undefined) typeDir = 'Isbn'
|
if (typeDir === undefined) typeDir = 'Isbn'
|
||||||
return new Promise(function (resolve, reject) {
|
return new Promise(function (resolve, reject) {
|
||||||
syncServerTime().then(function () {
|
syncServerTime().then(function () {
|
||||||
readFileAsArrayBuffer(filePath).then(function (arrayBuffer) {
|
readFileAsBase64(filePath).then(function (base64) {
|
||||||
|
// base64 → ArrayBuffer → Blob(Blob 是 App XHR 最可靠的二进制传输方式)
|
||||||
|
var binaryStr = atob(base64)
|
||||||
|
var bytes = new Uint8Array(binaryStr.length)
|
||||||
|
for (var i = 0; i < binaryStr.length; i++) {
|
||||||
|
bytes[i] = binaryStr.charCodeAt(i)
|
||||||
|
}
|
||||||
|
var blob = new Blob([bytes.buffer], { type: 'application/octet-stream' })
|
||||||
var payloadHash = 'UNSIGNED-PAYLOAD'
|
var payloadHash = 'UNSIGNED-PAYLOAD'
|
||||||
|
|
||||||
var now = getServerDate()
|
var now = getServerDate()
|
||||||
@ -181,10 +203,10 @@ 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上传】bufferSize:', arrayBuffer.byteLength)
|
console.log('【MinIO上传】dataSize:', blob.size, '字节')
|
||||||
console.log('【MinIO上传】服务器时间:', now.toISOString())
|
console.log('【MinIO上传】服务器时间:', now.toISOString())
|
||||||
|
|
||||||
// 使用 plus.net.XMLHttpRequest PUT
|
// 使用 plus.net.XMLHttpRequest PUT(发送 Blob)
|
||||||
if (typeof plus !== 'undefined' && plus.net && plus.net.XMLHttpRequest) {
|
if (typeof plus !== 'undefined' && plus.net && plus.net.XMLHttpRequest) {
|
||||||
try {
|
try {
|
||||||
var xhr = new plus.net.XMLHttpRequest()
|
var xhr = new plus.net.XMLHttpRequest()
|
||||||
@ -205,8 +227,8 @@ export function uploadImage(filePath, typeDir) {
|
|||||||
xhr.setRequestHeader('X-Amz-Content-Sha256', payloadHash)
|
xhr.setRequestHeader('X-Amz-Content-Sha256', payloadHash)
|
||||||
xhr.setRequestHeader('X-Amz-Date', sig.amzDate)
|
xhr.setRequestHeader('X-Amz-Date', sig.amzDate)
|
||||||
xhr.setRequestHeader('Authorization', sig.authHeader)
|
xhr.setRequestHeader('Authorization', sig.authHeader)
|
||||||
console.log('【MinIO上传】发送数据, 大小:', arrayBuffer.byteLength, '字节')
|
console.log('【MinIO上传】发送数据...')
|
||||||
xhr.send(arrayBuffer)
|
xhr.send(blob)
|
||||||
return
|
return
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn('【MinIO上传】plus XHR失败:', e)
|
console.warn('【MinIO上传】plus XHR失败:', e)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user