diff --git a/config/static/js/FileSaver.js b/config/static/js/FileSaver.js new file mode 100644 index 0000000..5d204ae --- /dev/null +++ b/config/static/js/FileSaver.js @@ -0,0 +1,171 @@ +/* +* FileSaver.js +* A saveAs() FileSaver implementation. +* +* By Eli Grey, http://eligrey.com +* +* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT) +* source : http://purl.eligrey.com/github/FileSaver.js +*/ + +// The one and only way of getting global scope in all environments +// https://stackoverflow.com/q/3277182/1008999 +var _global = typeof window === 'object' && window.window === window + ? window : typeof self === 'object' && self.self === self + ? self : typeof global === 'object' && global.global === global + ? global + : this + +function bom (blob, opts) { + if (typeof opts === 'undefined') opts = { autoBom: false } + else if (typeof opts !== 'object') { + console.warn('Deprecated: Expected third argument to be a object') + opts = { autoBom: !opts } + } + + // prepend BOM for UTF-8 XML and text/* types (including HTML) + // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF + if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { + return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type }) + } + return blob +} + +function download (url, name, opts) { + var xhr = new XMLHttpRequest() + xhr.open('GET', url) + xhr.responseType = 'blob' + xhr.onload = function () { + saveAs(xhr.response, name, opts) + } + xhr.onerror = function () { + console.error('could not download file') + } + xhr.send() +} + +function corsEnabled (url) { + var xhr = new XMLHttpRequest() + // use sync to avoid popup blocker + xhr.open('HEAD', url, false) + try { + xhr.send() + } catch (e) {} + return xhr.status >= 200 && xhr.status <= 299 +} + +// `a.click()` doesn't work for all browsers (#465) +function click (node) { + try { + node.dispatchEvent(new MouseEvent('click')) + } catch (e) { + var evt = document.createEvent('MouseEvents') + evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, + 20, false, false, false, false, 0, null) + node.dispatchEvent(evt) + } +} + +// Detect WebView inside a native macOS app by ruling out all browsers +// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too +// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos +var isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent) + +var saveAs = _global.saveAs || ( + // probably in some web worker + (typeof window !== 'object' || window !== _global) + ? function saveAs () { /* noop */ } + + // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView + : ('download' in HTMLAnchorElement.prototype && !isMacOSWebView) + ? function saveAs (blob, name, opts) { + var URL = _global.URL || _global.webkitURL + var a = document.createElement('a') + name = name || blob.name || 'download' + + a.download = name + a.rel = 'noopener' // tabnabbing + + // TODO: detect chrome extensions & packaged apps + // a.target = '_blank' + + if (typeof blob === 'string') { + // Support regular links + a.href = blob + if (a.origin !== location.origin) { + corsEnabled(a.href) + ? download(blob, name, opts) + : click(a, a.target = '_blank') + } else { + click(a) + } + } else { + // Support blobs + a.href = URL.createObjectURL(blob) + setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s + setTimeout(function () { click(a) }, 0) + } + } + + // Use msSaveOrOpenBlob as a second approach + : 'msSaveOrOpenBlob' in navigator + ? function saveAs (blob, name, opts) { + name = name || blob.name || 'download' + + if (typeof blob === 'string') { + if (corsEnabled(blob)) { + download(blob, name, opts) + } else { + var a = document.createElement('a') + a.href = blob + a.target = '_blank' + setTimeout(function () { click(a) }) + } + } else { + navigator.msSaveOrOpenBlob(bom(blob, opts), name) + } + } + + // Fallback to using FileReader and a popup + : function saveAs (blob, name, opts, popup) { + // Open a popup immediately do go around popup blocker + // Mostly only available on user interaction and the fileReader is async so... + popup = popup || open('', '_blank') + if (popup) { + popup.document.title = + popup.document.body.innerText = 'downloading...' + } + + if (typeof blob === 'string') return download(blob, name, opts) + + var force = blob.type === 'application/octet-stream' + var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari + var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent) + + if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') { + // Safari doesn't allow downloading of blob URLs + var reader = new FileReader() + reader.onloadend = function () { + var url = reader.result + url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;') + if (popup) popup.location.href = url + else location = url + popup = null // reverse-tabnabbing #460 + } + reader.readAsDataURL(blob) + } else { + var URL = _global.URL || _global.webkitURL + var url = URL.createObjectURL(blob) + if (popup) popup.location = url + else location.href = url + popup = null // reverse-tabnabbing #460 + setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s + } + } +) + +_global.saveAs = saveAs.saveAs = saveAs + +if (typeof module !== 'undefined') { + module.exports = saveAs; +} diff --git a/config/static/js/WebScan.js b/config/static/js/WebScan.js index ba7e174..c34ec71 100644 --- a/config/static/js/WebScan.js +++ b/config/static/js/WebScan.js @@ -147,6 +147,27 @@ } }) }, + majorOFDFile: function (isAuto, callback) { + var formData = { + "isAuto": isAuto, + "pid": this.clientId + } + var that = this + var xhr = new XMLHttpRequest(); + xhr.open('GET', this.url + "/majorOfdFile?pid=" + that.clientId + "&isAuto=" + isAuto, true); + xhr.responseType = "blob"; // 返回类型blob + xhr.onload = function () { + callback(this); + }; + xhr.onerror = function () { + var result = new Result(500, "网络错误", null); + callback(result) + } + // 发送ajax请求 + xhr.send(/*JSON.stringify({ + "formDataString": JSON.stringify(formData) + })*/) + }, majorPDF: function (callback) { var formData = { "pid": this.clientId, @@ -166,6 +187,20 @@ } }) }, + majorPDFFile: function (callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', this.url + "/majorPdfFile?pid="+this.clientId, true); + xhr.responseType = "blob"; // 返回类型blob + xhr.onload = function () { + callback(this); + }; + xhr.onerror = function () { + var result = new Result(500, "网络错误", null); + callback(result) + } + // 发送ajax请求 + xhr.send() + }, majorTiff: function (callback) { jQuery.ajax({ type:'post', @@ -183,6 +218,20 @@ } }) }, + majorTiffFile: function (callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', this.url + "/majorTiffFile?pid="+this.clientId, true); + xhr.responseType = "blob"; // 返回类型blob + xhr.onload = function () { + callback(this); + }; + xhr.onerror = function () { + var result = new Result(500, "网络错误", null); + callback(result) + } + // 发送ajax请求 + xhr.send() + }, majorZip: function (callback) { jQuery.ajax({ type: 'post', @@ -200,6 +249,20 @@ } }) }, + majorZipFile: function (callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', this.url + "/downLoadZipFile?pid="+this.clientId, true); + xhr.responseType = "blob"; // 返回类型blob + xhr.onload = function () { + callback(this); + }; + xhr.onerror = function () { + var result = new Result(500, "网络错误", null); + callback(result) + } + // 发送ajax请求 + xhr.send() + }, //上传图像 uploadImage: function (uploadParam, callback) { uploadParam.id = this.clientId; diff --git a/config/static/js/scanWeb.js b/config/static/js/scanWeb.js index 7b0e1ca..48d211f 100644 --- a/config/static/js/scanWeb.js +++ b/config/static/js/scanWeb.js @@ -1082,6 +1082,38 @@ new Vue({ } }); }, + exportOfdFile: function () { + + if (this.urls == null || this.urls.length <= 0) { + this.eleMessage("该批次不包含图像", "warning"); + return; + } + var loading = this.eleLoadding(); + var that = this; + this.WebScan.majorOFDFile(true, function (result) { + console.log("majorOFD: " + JSON.stringify(result)) + + loading.close(); + if (result.status == 200) { + // 返回200 + var blob = result.response; + /* var reader = new FileReader(); + reader.readAsDataURL(blob); + reader.onload = function (e) { + // 转换完成,创建一个a标签用于下载 + var a = document.createElement('a'); + a.download = that.pid+'.ofd'; + a.href = e.target.result; + $("body").append(a); // 修复firefox中无法触发click + a.click(); + $(a).remove(); + }*/ + saveAs(blob, that.pid + '.ofd') + } else { + that.eleMessage(result.msg, "warning"); + } + }); + }, exportPdf: function () { if (this.urls == null || this.urls.length <= 0) { this.eleMessage("该批次不包含图像", "warning"); @@ -1119,6 +1151,39 @@ new Vue({ }); loading.close(); }, + exportPdfFile: function () { + if (this.urls == null || this.urls.length <= 0) { + this.eleMessage("该批次不包含图像", "warning"); + return; + } + var loading = this.eleLoadding(); + var that = this; + this.WebScan.majorPDFFile(function (result) { + console.log("majorPDF: " + JSON.stringify(result.response)) + + loading.close(); + if (result.status == 200) { + // 返回200 + var blob = result.response; + /*var reader = new FileReader(); + reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href + reader.onload = function (e) { + // 转换完成,创建一个a标签用于下载 + var a = document.createElement('a'); + a.download = that.pid + '.pdf'; + a.href = e.target.result; + $("body").append(a); // 修复firefox中无法触发click + a.click(); + $(a).remove(); + }*/ + saveAs(blob, that.pid + '.pdf') + + } else { + that.$message.warning(result.msg); + } + }); + loading.close(); + }, exportTiff: function () { if (this.urls == null || this.urls.length <= 0) { this.eleMessage("该批次不包含图像", "warning"); @@ -1156,6 +1221,40 @@ new Vue({ }); loading.close(); }, + exportTiffFile: function () { + if (this.urls == null || this.urls.length <= 0) { + this.eleMessage("该批次不包含图像", "warning"); + return; + } + var loading = this.eleLoadding(); + var that = this; + this.WebScan.majorTiffFile(function (result) { + console.log("majorTiff: " + result) + + loading.close(); + if (result.status == 200) { + // 返回200 + var blob = result.response; + /* var reader = new FileReader(); + reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href + reader.onload = function (e) { + // 转换完成,创建一个a标签用于下载 + var a = document.createElement('a'); + a.download = 'dd.tiff'; + a.href = e.target.result; + $("body").append(a); // 修复firefox中无法触发click + a.click(); + $(a).remove(); + }*/ + + saveAs(blob, that.pid + '.tiff') + + } else { + that.$message.warning(result.msg); + } + }); + loading.close(); + }, exportZip: function () { if (this.urls == null || this.urls.length <= 0) { this.eleMessage("该批次不包含图像", "warning"); @@ -1193,6 +1292,39 @@ new Vue({ }); loading.close(); }, + exportZipFile: function () { + if (this.urls == null || this.urls.length <= 0) { + this.eleMessage("该批次不包含图像", "warning"); + return; + } + var loading = this.eleLoadding(); + var that = this; + this.WebScan.majorZipFile(function (result) { + console.log("majorZip: " + JSON.stringify(result)) + + loading.close(); + if (result.status == 200) { + // 返回200 + var blob = result.response; + /* var reader = new FileReader(); + reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href + reader.onload = function (e) { + // 转换完成,创建一个a标签用于下载 + var a = document.createElement('a'); + a.download = 'dd.zip'; + a.href = e.target.result; + $("body").append(a); // 修复firefox中无法触发click + a.click(); + $(a).remove(); + }*/ + saveAs(blob, that.pid + '.zip') + + } else { + that.$message.warning(result.msg); + } + }); + loading.close(); + }, // 将base64转换为blob dataURLtoBlob: function (dataurl) { var bstr = atob(dataurl) diff --git a/config/static/webScan.html b/config/static/webScan.html index dbd9634..076df10 100644 --- a/config/static/webScan.html +++ b/config/static/webScan.html @@ -60,25 +60,25 @@ -
  • +
  • -
  • +
  • -
  • +
  • -
  • +
  • @@ -473,6 +473,7 @@ +