Skip to content

Commit 1530e72

Browse files
committed
[feature] browser upload use browserify-wrapper .
1 parent 235a809 commit 1530e72

File tree

2 files changed

+67
-91
lines changed

2 files changed

+67
-91
lines changed
Lines changed: 59 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,65 @@
11
'use strict';
22

3-
module.exports = function upload(file, AV) {
3+
module.exports = function upload(file, AV, saveOptions) {
44
//use /files endpoint.
5-
file._previousSave = file._source.then(function(base64, type) {
6-
var data = {
7-
base64: base64,
8-
_ContentType: type,
9-
ACL: file._acl,
10-
mime_type: type,
11-
metaData: file._metaData
12-
};
13-
return AV._request("files", file._name, null, 'POST', data);
5+
var self = file;
6+
var dataFormat;
7+
self._previousSave = self._source.then(function(data, type) {
8+
dataFormat = data;
9+
return self._qiniuToken(type);
1410
}).then(function(response) {
15-
file._name = response.name;
16-
file._url = response.url;
17-
file.id = response.objectId;
18-
if(response.size)
19-
file._metaData.size = response.size;
20-
return file;
11+
self._url = response.url;
12+
self._bucket = response.bucket;
13+
self.id = response.objectId;
14+
//Get the uptoken to upload files to qiniu.
15+
var uptoken = response.token;
16+
17+
var data = new FormData();
18+
data.append("file", dataFormat, self._name);
19+
data.append("key", self._qiniu_key);
20+
data.append("token", uptoken);
21+
22+
var promise = new AV.Promise();
23+
var handled = false;
24+
25+
var xhr = new AV.XMLHttpRequest();
26+
27+
xhr.upload.addEventListener('progress', function(e) {
28+
if (e.lengthComputable) {
29+
saveOptions.onProgress && saveOptions.onProgress(e);
30+
}
31+
}, false);
32+
33+
xhr.onreadystatechange = function() {
34+
if (xhr.readyState === 4) {
35+
if (handled) {
36+
return;
37+
}
38+
handled = true;
39+
40+
delete self._qiniu_key;
41+
if (xhr.status >= 200 && xhr.status < 300) {
42+
var response;
43+
try {
44+
response = JSON.parse(xhr.responseText);
45+
} catch (e) {
46+
promise.reject(e);
47+
self.destroy();
48+
}
49+
if (response) {
50+
promise.resolve(self);
51+
} else {
52+
promise.reject(response);
53+
}
54+
} else {
55+
promise.reject(xhr);
56+
self.destroy();
57+
}
58+
}
59+
};
60+
xhr.open('POST', 'http://upload.qiniu.com', true);
61+
xhr.send(data);
62+
63+
return promise;
2164
});
2265
};

lib/file.js

Lines changed: 8 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -353,14 +353,13 @@ module.exports = function(AV) {
353353
this._source = AV.Promise.as(encodeBase64(data), guessedType);
354354
this._metaData.size = data.length;
355355
} else if (data && data.base64) {
356-
this._source = AV.Promise.as(data.base64, guessedType);
357-
this._isBase64 = true;
356+
// 也可以是 dataURL,内部已做兼容
357+
var dataBase64 = dataURItoBlob(data.base64, guessedType);
358+
this._source = AV.Promise.as(dataBase64, guessedType);
358359
} else if (data && data.blob) {
359360
this._source = AV.Promise.as(data.blob, guessedType);
360-
this._isBlob = true;
361361
} else if (typeof(File) !== "undefined" && data instanceof File) {
362362
this._source = AV.Promise.as(data, guessedType);
363-
this._isFileObject = true;
364363
} else if(AV._isNode && global.Buffer.isBuffer(data)) {
365364
// use global.Buffer to prevent browserify pack Buffer module
366365
this._source = AV.Promise.as(data.toString('base64'), guessedType);
@@ -582,75 +581,8 @@ module.exports = function(AV) {
582581
var self = this;
583582
if (!self._previousSave) {
584583
if(self._source) {
585-
if (self._isBlob || self._isFileObject || self._isBase64) {
586-
// TODO: remove this code and use qiniu SDK
587-
var dataFormat;
588-
self._previousSave = self._source.then(function(data, type) {
589-
if (self._isBase64) {
590-
dataFormat = dataURItoBlob(data, type);
591-
} else {
592-
dataFormat = data;
593-
}
594-
return self._qiniuToken(type);
595-
}).then(function(response) {
596-
self._url = response.url;
597-
self._bucket = response.bucket;
598-
self.id = response.objectId;
599-
//Get the uptoken to upload files to qiniu.
600-
var uptoken = response.token;
601-
602-
var data = new FormData();
603-
data.append("file", dataFormat, self._name);
604-
data.append("key", self._qiniu_key);
605-
data.append("token", uptoken);
606-
607-
var promise = new AV.Promise();
608-
var handled = false;
609-
610-
var xhr = new AV.XMLHttpRequest();
611-
612-
xhr.upload.addEventListener('progress', function(e) {
613-
if (e.lengthComputable) {
614-
saveOptions.onProgress && saveOptions.onProgress(e);
615-
}
616-
}, false);
617-
618-
xhr.onreadystatechange = function() {
619-
if (xhr.readyState === 4) {
620-
if (handled) {
621-
return;
622-
}
623-
handled = true;
624-
625-
delete self._qiniu_key;
626-
if (xhr.status >= 200 && xhr.status < 300) {
627-
var response;
628-
try {
629-
response = JSON.parse(xhr.responseText);
630-
} catch (e) {
631-
promise.reject(e);
632-
self.destroy();
633-
}
634-
if (response) {
635-
promise.resolve(self);
636-
} else {
637-
promise.reject(response);
638-
}
639-
} else {
640-
promise.reject(xhr);
641-
self.destroy();
642-
}
643-
}
644-
};
645-
xhr.open('POST', 'http://upload.qiniu.com', true);
646-
xhr.send(data);
647-
648-
return promise;
649-
});
650-
} else {
651-
var upload = require('./browserify-wrapper/upload');
652-
upload(self, AV);
653-
}
584+
var upload = require('./browserify-wrapper/upload');
585+
upload(self, AV, saveOptions);
654586
} else if(self._url && self._metaData['__source'] == 'external') {
655587
//external link file.
656588
var data = {
@@ -664,8 +596,9 @@ module.exports = function(AV) {
664596
self._name = response.name;
665597
self._url = response.url;
666598
self.id = response.objectId;
667-
if(response.size)
668-
self._metaData.size = response.size;
599+
if(response.size) {
600+
self._metaData.size = response.size;
601+
}
669602
return self;
670603
});
671604
}

0 commit comments

Comments
 (0)