const crypto = require('crypto');
const Promise = require('bluebird');
const fs = require('fs');
const path = require('path');
const request = require('request-promise');
const request2 = require('request');
Promise.promisifyAll(fs);
/**
* get source image path
*
* @method getImg
* @param {String} url source image path or url.
* @param {String} path dest image path.
* @return {Promise} path of image file
*/
function getImg(url, path) {
if (url.startsWith('http') || url.startsWith('https')) {
return download(url, path);
} else {
return new Promise(function (resolve, reject) {
resolve(url);
});
}
}
/**
* download image from internet.
*
* @method download
* @param {String} uri download url
* @param {String} tmpPath file path
* @return {Promise}
*/
function download(uri, tmpPath) {
return new Promise(function (resolve, reject) {
request.head(uri, function(err, res, body){
//console.log('content-type:', res.headers['content-type']);
//console.log('content-length:', res.headers['content-length']);
request(uri)
.pipe(fs.createWriteStream(tmpPath))
.on('close', function () {
//console.log('request close');
resolve(tmpPath);
})
.on('error', function (err) {
console.log('Exception: download file!');
console.log(err);
reject(err);
});
});
});
}
/**
* TIMS server OCR API wrapper
* @class OCR
*/
function OCR(host, secretKey) {
this.host = host;
this.secretKey = secretKey;
}
module.exports.create = function(host, secretKey) {
return new OCR(host, secretKey);
};
OCR.fn = OCR.prototype;
/**
* ocr信息及文件查询接口
* @function uploadFile
* @memberof OCR
* @return {Promise}
*/
OCR.fn.uploadFile = function uploadFile(opt) {
var self = this;
var fileParam = {
"bill_pk": opt.bill_pk,
"note_type": 0,
"doc_name": "test.jpg为上海增票",
"recognize_type": "同步",
"data": {
"file_pk": opt.file_pk,
"file_name": "test.jpg",
"file_format": "jpg",
"file_size": "", // stat --printf="%s" test.jpg
"file_md5": "", // md5=($(md5sum test.jpg));echo $md5
"desc": "a test.jpg image"
}
};
var path = '/TIMS-Server/postController/uploadFile';
var httpMethod = 'post';
var headers = {
'host': self.host,
'secretKey': self.secretKey
};
return new Promise(function (resolve, reject) {
// download dest path is /tmp/xxdebug.jpg
getImg(opt.url, '/tmp/xxdebug.jpg').then(function(filePath) {
// request-promise lib
var options = {
uri: 'http://' + headers.host + path,
// application/x-www-form-urlencoded (URL-Encoded Forms)
//form : {},
// multipart/form-data (Multipart Form Uploads)
formData: {
file_param: JSON.stringify(fileParam),
file: fs.createReadStream(filePath)
},
headers: headers,
method: httpMethod,
encoding: 'UTF-8',
json: true
};
request(options).then(function (result) {
if (result.return_code !== 0) {
return reject(new Error("return code is not 0"));
}
var ret = {
invNum: result.data.invNum,
tims: result // just for debug
};
return resolve(ret);
}).catch(function (err) {
reject(err);
});
}).catch(function (err) {
reject(err);
});
});
};
/**
* ocr信息及文件查询接口
* @function getOCRMsg
* @param {String} imageUUID 影像系统图片唯一标识
* @memberof OCR
* @return {Promise} 增值税专用发票识别后返回的JSON结果
*/
OCR.fn.getOCRMsg = function getOCRMsg(imageUUID) {
var self = this;
var path = '/TIMS-Server/postController/getOCRMsg';
var httpMethod = 'post';
var headers = {
'host': self.host,
'secretKey': self.secretKey
};
return new Promise(function (resolve, reject) {
// request-promise lib
var options = {
uri: 'http://' + headers.host + path,
// application/x-www-form-urlencoded (URL-Encoded Forms)
//form : {},
// multipart/form-data (Multipart Form Uploads)
formData: {
file_id: imageUUID
},
headers: headers,
method: httpMethod,
encoding: 'UTF-8',
json: true
};
request(options).then(function (result) {
if (result.return_code !== 0) {
return reject(new Error("return code is not 0"));
}
var ret = {
invNum: result.data.invNum,
tims: result // just for debug
};
return resolve(ret);
}).catch(function (err) {
console.log("exception in request!");
reject(err);
});
});
};
/**
* 文件下载接口
* @method getImage
* @memberof OCR
* @return {Promise}
*/
OCR.fn.getImage = function getImage(imageUUID, savedFilePath) {
var self = this;
var path = '/TIMS-Server/cMImageController/getImage';
var httpMethod = 'get';
var headers = {
'host': self.host,
'secretKey': self.secretKey
};
return new Promise(function (resolve, reject) {
// request-promise lib
var options = {
uri: 'http://' + headers.host + path,
// application/x-www-form-urlencoded (URL-Encoded Forms)
//form : {},
// multipart/form-data (Multipart Form Uploads)
//formData: {
// file_id: imageUUID
//},
qs: {
file_id: imageUUID
},
headers: headers,
method: httpMethod
};
request2(options)
/*.then(function (result) {
if (result.return_code !== 0) {
return reject(new Error("return code is not 0"));
}
var ret = {
invNum: result.data.invNum,
tims: result // just for debug
};
return resolve(ret);
}).catch(function (err) {
console.log("exception in request!");
reject(err);
});*/
.pipe(fs.createWriteStream(savedFilePath))
.on('response', function(response) {
console.log('request [response] event')
console.log(response.statusCode) // 200
console.log(response.headers['content-type']) // 'image/png'
})
.on('error', function(err) {
console.log('request [error] event');
console.log(err)
})
.on('close', function () {
console.log('request [close] event')
resolve(savedFilePath);
})
});
};