Merge pull request #2 from coosto/task/chunk-upload-functionality

Task/chunk upload functionality
master
Wesley 8 years ago committed by GitHub
commit a218cffefd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,4 +1,8 @@
import { default as request, createRequest, sendRequest } from '../utils/request'
import {
default as request,
createRequest,
sendFormRequest
} from '../utils/request'
export default class ChunkUploadHandler {
/**
@ -204,7 +208,9 @@ export default class ChunkUploadHandler {
start () {
request({
method: 'POST',
headers: this.headers,
headers: Object.assign(this.headers, {
'Content-Type': 'application/json'
}),
url: this.action,
body: Object.assign(this.startBody, {
phase: 'start',
@ -213,7 +219,8 @@ export default class ChunkUploadHandler {
})
}).then(res => {
if (res.status !== 'success') {
return this.reject(res.message)
this.file.response = res
return this.reject('server')
}
this.sessionId = res.data.session_id
@ -221,7 +228,10 @@ export default class ChunkUploadHandler {
this.createChunks()
this.startChunking()
}).catch(error => this.reject(error))
}).catch(res => {
this.file.response = res
this.reject('server')
})
}
/**
@ -265,17 +275,19 @@ export default class ChunkUploadHandler {
this.updateFileProgress()
chunk.xhr = createRequest({
method: 'POST',
headers: this.headers,
headers: Object.assign(this.headers, {
'Content-Type': 'multipart/form-data'
}),
url: this.action
})
chunk.xhr.upload.addEventListener('progress', function(evt) {
chunk.xhr.upload.addEventListener('progress', function (evt) {
if (evt.lengthComputable) {
chunk.progress = Math.round(evt.loaded / evt.total * 100)
}
}, false)
sendRequest(chunk.xhr, Object.assign(this.uploadBody, {
sendFormRequest(chunk.xhr, Object.assign(this.uploadBody, {
phase: 'upload',
session_id: this.sessionId,
start_offset: chunk.startOffset,
@ -287,7 +299,7 @@ export default class ChunkUploadHandler {
} else {
if (chunk.retries-- <= 0) {
this.pause()
return this.reject('File upload failed')
return this.reject('upload')
}
}
@ -296,7 +308,7 @@ export default class ChunkUploadHandler {
chunk.active = false
if (chunk.retries-- <= 0) {
this.pause()
return this.reject('File upload failed')
return this.reject('upload')
}
this.uploadNextChunk()
@ -312,18 +324,24 @@ export default class ChunkUploadHandler {
request({
method: 'POST',
headers: this.headers,
headers: Object.assign(this.headers, {
'Content-Type': 'application/json'
}),
url: this.action,
body: Object.assign(this.finishBody, {
phase: 'finish',
session_id: this.sessionId
})
}).then(res => {
this.file.response = res
if (res.status !== 'success') {
return this.reject(res.message)
return this.reject('server')
}
this.resolve(res)
}).catch(error => this.reject(error))
}).catch(res => {
this.file.response = res
this.reject('server')
})
}
}

@ -42,6 +42,10 @@ const chunkUploadFinish = (req, res) => {
}
module.exports = (req, res) => {
if (!req.body.phase) {
return chunkUploadPart(req, res)
}
switch (req.body.phase) {
case 'start':
return chunkUploadStart(req, res)

@ -28,14 +28,39 @@ export const sendRequest = (xhr, body) => {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response)
} else {
reject(xhr.statusText)
reject(xhr.response)
}
}
xhr.onerror = () => reject(xhr.statusText)
xhr.onerror = () => reject(xhr.response)
xhr.send(JSON.stringify(body))
})
}
/**
* Sends a XHR request with certain form data
*
* @param {XMLHttpRequest} xhr
* @param {Object} data
*/
export const sendFormRequest = (xhr, data) => {
const body = new FormData()
for (var name in data) {
body.append(name, data[name])
}
return new Promise((resolve, reject) => {
xhr.onload = () => {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response)
} else {
reject(xhr.response)
}
}
xhr.onerror = () => reject(xhr.response)
xhr.send(body)
})
}
/**
* Creates and sends XHR request
*

Loading…
Cancel
Save