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
{
internal class FileServerSettings
{
public string UserName { get; set; }
public string Password { get; set; }
public string Url { get; set; }
}
///
/// FileManager 的摘要说明。
///
public class FileManager
{
public string ErrorMessage;
private CredentialCache myCredentialCache;
private FileServerSettings Settings;
public FileManager()
{
this.ErrorMessage = "";
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
Settings = configuration.GetSection("FileServer").Get();
if (Settings.Url.Length > 0)
{
if (Settings.Url.Substring(Settings.Url.Length - 1, 1) != "/")
{
Settings.Url = Settings.Url + "/";
}
}
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 = "";
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 = "";
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 = "";
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 = "";
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 Stream ReadFile(string FileName)
{
Stream stream = System.IO.File.OpenRead(FileName);
return stream;
}
///
/// 下载文件服务器中的文件
///
/// 目标文件的虚拟路径
/// 远程文件地址
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));
}
}
}