diff --git a/src/chunk/ChunkUploadHandler.js b/src/chunk/ChunkUploadHandler.js index 4a4e8d9..848cbff 100644 --- a/src/chunk/ChunkUploadHandler.js +++ b/src/chunk/ChunkUploadHandler.js @@ -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') + }) } } diff --git a/src/utils/chunkUpload.js b/src/utils/chunkUpload.js index 858d22e..0fd46cd 100644 --- a/src/utils/chunkUpload.js +++ b/src/utils/chunkUpload.js @@ -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) diff --git a/src/utils/request.js b/src/utils/request.js index 4d710bf..04d7702 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -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 *