leadtools为web端提供了wcf接口来供用户可以登录pacs系统,检索,查看以及上传影像。本篇博客讲解如何创建一个网页来实现上传功能,
通过WCF进行dicom文件的上传时,是将dicom文件转换为base64数据流,分段进行传输。
本篇博客运行的前提是已经部署完成Leadtools HTML5 Web Viewer,可以正常浏览。参考
http://blog.gcpowertools.com.cn/post/leadtools_h5pacs_deploy_123.aspx
在部署完成后,将下面的代码复制到一个HTML文件中,即可运行进行测试。另外需要添加html文件所需的jquery.min.js到同文件夹路径下。
<head> <meta charset="UTF-8"> </head> <form onsubmit="return false;"> <input type="hidden" name="file_base64" id="file_base64"> <input type="file" id="fileup" multiple="multiple"> <input type="submit" value="submit" onclick="$.post('./uploader.php', $(this).parent().serialize());"> <div> <div id="msg"></div> </div> </form> <script src="scripts/jquery.min.js"></script> <script> $(document).ready(function () { authcookie = login(); document.cookie = "authcookie=" + authcookie; $("#fileup").change(function () { getauthcookie("authcookie"); filelist = this.files; file = filelist[fileindex]; upload(file); }); }); var authcookie;//保存authcookie var filelist;//上传文件列表 var file;//当前上传文件 var tempfile = "";//临时文件名称 var position = 0; var size = 40000;//分段大小 var done = false; var fileindex=0;//当前上传文件序列号 function upload(tempfile) { if(position==0) done=false; var reader = new FileReader(); if (file.size > position + 40000) reader.readAsArrayBuffer(file.slice(position, position + 40000)); else reader.readAsArrayBuffer(file.slice(position, file.size)); reader.onload = function (e) { if (e.target.readyState === 2) { var base64string = base64ArrayBuffer(e.target.result); var data = { authenticationCookie: authcookie, dicomData: base64string, fileName: tempfile, status: position==0?"start":"append" }; tempfile = senddata(JSON.stringify(data)); if (!done) { position += 40000; upload(tempfile); if (position+40000>file.size) done = true; } else { var data = { authenticationCookie: authcookie, dicomData: "", fileName: tempfile, status: "done" }; tempfile = senddata(JSON.stringify(data)); position = 0; $("#msg").html($("#msg").html()+"第"+(fileindex+1)+"个文件已经上传完成</p>"); fileindex += 1; if (fileindex < filelist.length) { file = filelist[fileindex]; upload(tempfile); } else { fileindex = 0; $("#msg").html($("#msg").html() + "文件全部已经上传完成</p>"); } } } }; } function senddata(data) { var result; $.ajax({ type:"post", url: "http://localhost/MedicalViewerService19/StoreService.svc/UploadDicomImage", data: data, contentType: "application/json", dataType: "json", success: function(data){result= data}, async: false }); return result; } function login() { var auth; var logininfo = { userName: "a", password: "a", userData: "" }; $.ajax({ type: "post", url: "http://localhost/MedicalViewerService19/AuthenticationService.svc/AuthenticateUser", data: JSON.stringify(logininfo), contentType: "application/json", dataType: "text", success: function (data) { auth= data }, async: false }); return auth; } function query() { } function getauthcookie() { document.cookie.split(";").forEach(function (val, index) { var index = val.indexOf("="); if ($.trim(val.substring(0, index)) == "authcookie") { authcookie = $.trim(val.substring(index + 1, val.length)); } }); return ""; } function base64ArrayBuffer(arrayBuffer) { var base64 = ''; var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var bytes = new Uint8Array(arrayBuffer); var byteLength = bytes.byteLength; var byteRemainder = byteLength % 3; var mainLength = byteLength - byteRemainder; var a, b, c, d; var chunk; // Main loop deals with bytes in chunks of 3 for (var i = 0; i < mainLength; i = i + 3) { // Combine the three bytes into a single integer chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]; // Use bitmasks to extract 6-bit segments from the triplet a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18 b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12 c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6 d = chunk & 63; // 63 = 2^6 - 1 // Convert the raw binary segments to the appropriate ASCII encoding base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]; } // Deal with the remaining bytes and padding if (byteRemainder == 1) { chunk = bytes[mainLength] a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2 // Set the 4 least significant bits to zero b = (chunk & 3) << 4; // 3 = 2^2 - 1 base64 += encodings[a] + encodings[b] + '=='; } else if (byteRemainder == 2) { chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]; a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10 b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4 // Set the 2 least significant bits to zero c = (chunk & 15) << 2 // 15 = 2^4 - 1 base64 += encodings[a] + encodings[b] + encodings[c] + '='; } return base64; } </script>