92 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
// 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()
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |