all files / src/ File.js

11.36% Statements 5/44
0% Branches 0/4
0% Functions 0/8
11.36% Lines 5/44
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84                                                                                                                                                             
'use strict';
 
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)
};