using System; using System.IO; using System.Net; using System.Text; using System.Xml; using System.Configuration; using System.Web; using System.Collections.Generic; using Bowin.Common.Utility; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Extensions.Configuration; namespace Bowin.Common.Files { internal class FileServerSettings { public string UserName { get; set; } public string Password { get; set; } public string Url { get; set; } } /// /// 处理远程附件的类,由于联达并没有建立文件服务器,需要兼容: /// 在web调用,为了减少网络流量,就直接处理本地路径的文件; /// 在服务调用,配置Url、用户名密码后,处理的是远程文件服务器的文件。 /// public class FileServerManager { public string ErrorMessage; private CredentialCache myCredentialCache = null; private static FileServerSettings Settings; private static bool IsWebLocal { get { return (HttpHelper.Accessor?.HttpContext != null || string.IsNullOrEmpty(Settings.Url)); } } static FileServerManager() { var configuration = Utility.Environment.GetConfig("appsettings.json"); Settings = configuration.GetSection("FileServer").Get(); if (Settings == null) { Settings = new FileServerSettings(); } if (!string.IsNullOrEmpty(Settings.Url)) { if (Settings.Url.Substring(Settings.Url.Length - 1, 1) != "/") { Settings.Url = Settings.Url + "/"; } } } public FileServerManager() { this.ErrorMessage = ""; if (!string.IsNullOrEmpty(Settings.UserName)) { this.myCredentialCache = new CredentialCache(); this.myCredentialCache.Add(new Uri(Settings.Url), "NTLM", new NetworkCredential(Settings.UserName, Settings.Password)); } } public bool DeleteFile(string filename) { this.ErrorMessage = ""; if (IsWebLocal) { this.ErrorMessage = ""; try { File.Delete(HttpHelper.MapPath(filename)); } catch (Exception ex) { this.ErrorMessage = ex.Message; return false; } } else { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Settings.Url + filename); request.Credentials = this.myCredentialCache; request.Method = "DELETE"; WebResponse response = null; try { response = request.GetResponse(); } catch (WebException ex) { this.ErrorMessage = ex.Message; return false; } finally { if (response != null) { response.Close(); } } } return true; } public bool IsFileExist(string filename) { this.ErrorMessage = ""; if (IsWebLocal) { return File.Exists(HttpHelper.MapPath(filename)); } else { string text1 = ""; byte[] buffer1 = new ASCIIEncoding().GetBytes(text1); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Settings.Url + filename); request.Credentials = this.myCredentialCache; request.Method = "PROPFIND"; request.ContentType = "text/xml"; request.Headers.Add("Depth", "0"); request.Headers.Add("Translate: f"); request.ContentLength = buffer1.Length; Stream stream = request.GetRequestStream(); stream.Write(buffer1, 0, buffer1.Length); stream.Close(); WebResponse response = null; try { response = request.GetResponse(); } catch (WebException ex) { if (ex.Message.IndexOf("404") == -1) { this.ErrorMessage = ex.Message; throw ex; } return false; } finally { if (response != null) { response.Close(); } } } return true; } public bool UploadFile(Stream inputStream, string filename) { this.ErrorMessage = ""; if (IsWebLocal) { using (var stream = System.IO.File.Create(HttpHelper.MapPath(filename))) { inputStream.CopyTo(stream); } } else { WebClient client = new WebClient(); client.Credentials = this.myCredentialCache; int num1 = (int)inputStream.Length; byte[] buffer1 = new byte[num1]; inputStream.Read(buffer1, 0, num1); Stream stream = client.OpenWrite(Settings.Url + filename, "PUT"); stream.Write(buffer1, 0, num1); try { stream.Close(); } catch (WebException ex) { this.ErrorMessage = ex.Message; return false; } } return true; } public bool UploadFile(byte[] buffer, string filename) { this.ErrorMessage = ""; if (IsWebLocal) { using (var stream = System.IO.File.Create(HttpHelper.MapPath(filename))) { stream.Write(buffer); } } else { WebClient client = new WebClient(); client.Credentials = this.myCredentialCache; Stream stream = client.OpenWrite(Settings.Url + filename, "PUT"); stream.Write(buffer, 0, buffer.Length); try { stream.Close(); } catch (WebException ex) { this.ErrorMessage = ex.Message; return false; } } return true; } public static Stream GetFileStream(string FileName) { if (IsWebLocal) { return FileHelper.GetFileStream(FileName); } else { WebClient conn = new WebClient(); var targetFile = FileName; if (!FileName.Trim().StartsWith("http") && !FileName.Trim().Contains("://")) { targetFile = new Uri(Settings.Url).GetLeftPart(UriPartial.Authority); if (!FileName.StartsWith("/")) { targetFile += "/"; } targetFile += FileName; } var bytes = conn.DownloadData(targetFile); return new MemoryStream(bytes); } } /// /// 下载文件服务器中的文件 /// /// 目标文件的虚拟路径 /// 远程文件地址 public static void DownloadFile(string virtualFilePath, string remoteFile) { WebClient conn = new WebClient(); var targetFile = remoteFile; File.Delete(HttpHelper.MapPath(virtualFilePath)); if (!remoteFile.Trim().StartsWith("http") && !remoteFile.Trim().Contains("://")) { targetFile = new Uri(HttpHelper.Current.Request.GetDisplayUrl()).GetLeftPart(UriPartial.Authority); if (!remoteFile.StartsWith("/")) { targetFile += "/"; } targetFile += remoteFile; } conn.DownloadFile(targetFile, HttpHelper.MapPath(virtualFilePath)); } } }