1.傳輸協議
當我們PACS客戶端接收到下載命令時需要根據dcm文件的url來下載,這里推薦使用http協議,支持大文件的斷點續傳。
2.下載策略
假設有10個序列,每個序列有100張圖像,
①廣度優先:將任務池中的下載任務平均分配到10個序列,每個序列都同時下載,
優點:是每個序列都能分布加載,當用戶切換序列到單元格時不需要等待。
缺點:當圖像特別多的時候,比如CT薄層,序列切換圖像滾動時顯示不完整。
②深度優先:將任務池中的下載任務根據先進先出原則分配到排序在前的序列,下載完一個后再開始下一個。
優點和缺點恰好和廣度優先策略相反。
那么魚和熊掌能不能兼得呢?能。
默認使用廣度優先,當用戶點擊某個序列時,一般認為是用戶優先想看的序列,
則為該序列加速,該序列視為特殊加速序列,下載任務排滿,其他序列仍然是平均分配。
看效果:
最后附上http下載的關鍵代碼:
/// <summary> /// 下載文件 /// </summary> /// <param name="url">下載地址</param> /// <param name="path">本地路徑</param> public static bool DownLoadFile(string url, string path) {bool flag = false; long SPosition = 0; FileStream FStream = null; Stream myStream = null; try { //判斷要下載的文件是否存在 if (File.Exists(path)) { //打開上次下載的文件 FStream = File.OpenWrite(path); //獲取已經下載的長度 SPosition = FStream.Length; long serverFileLength = GetHttpLength(url); if (serverFileLength == -1) { //本地文件 return true; } if (serverFileLength == 0) { return false; } if (SPosition == serverFileLength) { //文件是完整的,直接結束下載任務 return true; } if (SPosition > serverFileLength) { SPosition = 0; FStream.Seek(0, SeekOrigin.Current); } else { FStream.Seek(SPosition, SeekOrigin.Current); } } else { FStream = new FileStream(path, FileMode.Create); SPosition = 0; } //打開網絡連接 HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url); if (SPosition > 0) { //設置Range值 myRequest.AddRange(SPosition); } //向服務器請求,獲得服務器的回應數據流 myStream = myRequest.GetResponse().GetResponseStream(); //定義一個字節數據 byte[] btContent = new byte[512]; int intSize = 0; intSize = myStream.Read(btContent, 0, 512); while (intSize > 0) { FStream.Write(btContent, 0, intSize); intSize = myStream.Read(btContent, 0, 512); } flag = true; } catch (Exception ex) { flag = false; LogApi.WriteLog("下載文件時異常:" + path); LogApi.WriteErrLog(ex); } finally { //關閉流 if (myStream != null) { myStream.Close(); myStream.Dispose(); } if (FStream != null) { FStream.Close(); FStream.Dispose(); } } return flag; }