// websocket文件上传 import { getToken } from './auth' export default function uploadFile(item, callback, errorCallBack) { const protocol = location.protocol === 'http:' ? 'ws' : 'wss' item.isReady = true const socket = new WebSocket(`${protocol}://${location.host}/api/sms/uploadService`, getToken()) let i = 0 let startSize = 0, endSize = 0 const paragraph = 4 * 1024 * 1024 // 以4MB为一个分片 const count = parseInt(item.file.size / paragraph) + 1 socket.onopen = function () { item.isUploading = true socket.send( JSON.stringify({ filename: item.file.name, upload: 'file' }) ) // 取消上传 item.cancel = function () { item.progress = 0 socket.send( JSON.stringify({ UPLOAD_CANCEL: 'UPLOAD_CANCEL' }) ) item.isUploading = false } } socket.onmessage = function (event) { const sendFile = function () { if (startSize < item.file.size) { let blob endSize += paragraph if (item.file.webkitSlice) { blob = item.file.webkitSlice(startSize, endSize) } else if (item.file.mozSlice) { blob = item.file.mozSlice(startSize, endSize) } else { blob = item.file.slice(startSize, endSize) } const reader = new FileReader() reader.readAsArrayBuffer(blob) reader.onload = function loaded(evt) { const result = evt.target.result // i++; // const isok = (i / count) * 100; // item.progress = parseInt(isok); startSize = endSize socket.send(result) } } else { item.progress = 100 socket.send( JSON.stringify({ sendover: 'sendover' }) ) } } item.isUploading = true item.isCancel = false const obj = JSON.parse(event.data) if (obj.category == 'UPLOAD_ACK') { item.filePath = obj.content sendFile() } else if (obj.category == 'UPLOAD') { if (obj.content == 'SAVE_FAILURE') { item.isUploading = false errorCallBack(item) } else if (obj.content == 'SAVE_SUCCESS') { sendFile() i++ const isok = (i / count) * 100 item.progress = parseInt(isok) } else if (obj.content == 'TRUE') { callback(item) item.isReady = true item.isSuccess = true item.isUploading = false socket.close() } } else if (obj.category == 'UPLOAD_CANCEL') { item.progress = 0 item.isCancel = true socket.close() } } }