libzotero
Version:
javascript libZotero
80 lines (66 loc) • 2.19 kB
JavaScript
;
var log = require('./Log.js').Logger('libZotero:File');
var SparkMD5 = require('spark-md5');
module.exports = {};
module.exports.getFileInfo = function (file) {
//fileInfo: md5, filename, filesize, mtime, zip, contentType, charset
if (typeof FileReader === 'undefined') {
return Promise.reject(new Error('FileReader not supported'));
}
return new Promise(function (resolve, reject) {
var fileInfo = {};
var reader = new FileReader();
reader.onload = function (e) {
log.debug('Zotero.file.getFileInfo onloadFunc', 3);
var result = e.target.result;
log.debug(result, 3);
fileInfo.md5 = SparkMD5.ArrayBuffer.hash(result);
fileInfo.filename = file.name;
fileInfo.filesize = file.size;
fileInfo.mtime = Date.now();
fileInfo.contentType = file.type;
//fileInfo.reader = reader;
fileInfo.filedata = result;
resolve(fileInfo);
};
reader.readAsArrayBuffer(file);
});
};
module.exports.uploadFile = function (uploadInfo, fileInfo) {
log.debug('Zotero.file.uploadFile', 3);
log.debug(uploadInfo, 4);
var formData = new FormData();
Object.keys(uploadInfo.params).forEach(function (key) {
var val = uploadInfo.params[key];
formData.append(key, val);
});
var blobData = new Blob([fileInfo.filedata], { type: fileInfo.contentType });
formData.append('file', blobData);
var xhr = new XMLHttpRequest();
xhr.open('POST', uploadInfo.url, true);
return new Promise(function (resolve, reject) {
xhr.onload = function (evt) {
log.debug('uploadFile onload event', 3);
if (this.status == 201) {
log.debug('successful upload - 201', 3);
resolve();
} else {
log.error('uploadFile failed - ' + xhr.status);
reject({
'message': 'Failure uploading file.',
'code': xhr.status,
'serverMessage': xhr.responseText
});
}
};
xhr.onprogress = function (evt) {
log.debug('progress event');
log.debug(evt);
};
xhr.send(formData);
});
//If CORS is not enabled on s3 this XHR will not have the normal status
//information, but will still fire readyStateChanges so you can tell
//when the upload has finished (even if you can't tell if it was successful
//from JS)
};