using System; using Shared; using HDL_ON.DAL.Server; using System.IO; using HDL_ON.Common; namespace HDL_ON { /// /// ImageUtlis /// 图片下载处理 /// public class ImageUtlis { /// /// 用户头像 /// public const string HEADIMAGE = "HeadImage.png"; #region ■ 变量声明___________________________ /// /// 通用方法 /// private static ImageUtlis m_Current = null; /// /// 通用方法 /// public static ImageUtlis Current { get { if (m_Current == null) { m_Current = new ImageUtlis(); } return m_Current; } } #endregion #region 文件读写 /// /// 根目录 /// string RootPath = Environment.GetFolderPath(System.Environment.SpecialFolder.Personal) + "/"; /// /// 文件是否存在 /// /// File path. public bool Exists(string filePath) { return File.Exists(Path.Combine(RootPath, filePath)); } /// /// Writes the file by bytes. /// /// true, if file by bytes was writed, false otherwise. /// File name. /// Bytes. public bool WriteFileByBytes(string fileName, byte[] bytes) { if (fileName == null || (fileName = fileName.Trim()) == ("")) { return false; } FileStream fs = null; try { fs = new FileStream(Path.Combine(RootPath, fileName), FileMode.Create, FileAccess.Write); fs.Write(bytes, 0, bytes.Length); fs.Flush(); MainPage.Log("SaveFile:" + fileName); return true; } catch (Exception ex) { MainPage.Log("FileUtiles Code 113:" + ex.ToString()); return false; } finally { try { if (fs != null) { fs.Close(); } } catch (Exception ex) { MainPage.Log("FileUtils Code 121 :" + ex.ToString()); } } } public byte[] ReadFile(string fileName) { FileStream fs = null; try { if (File.Exists(Path.Combine(RootPath, fileName))) { fs = new FileStream(Path.Combine(RootPath, fileName), FileMode.Open, FileAccess.Read); } else if (File.Exists(fileName)) { fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); } else { return new byte[0]; } byte[] bytes = new byte[fs.Length]; fs.Read(bytes, 0, bytes.Length); return bytes; } catch { return new byte[0]; } finally { try { if (fs != null) { fs.Close(); } } catch { } } } #endregion #region 房间、场景 图片上传和下载 /// /// 上传图片 /// public string UploadImage(UploadImageObj uploadImageObj) { var requestJson = HttpUtil.GetSignRequestJson(uploadImageObj); var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_UploadImage, requestJson); if(revertObj.Code == StateCode.SUCCESS) { if(revertObj.Data != null) { return revertObj.Data.ToString(); } } else { IMessageCommon.Current.ShowErrorInfoAlter(revertObj.Code); } return ""; } /// /// 通过图片路径下载图片 /// 针对住宅,使用住宅域名服务器 /// public byte[] GetImageDownloadUrl(string imageKey) { var requestJson = HttpUtil.GetSignRequestJson(new GetImageUrlObj() { imageKey = imageKey, }); var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_GetImageUrl, requestJson); if (revertObj.Code == StateCode.SUCCESS) { if (revertObj.Data != null) { if (!string.IsNullOrEmpty(revertObj.Data.ToString())) { var url = revertObj.Data.ToString(); return HttpUtil.HttpsDownload(url); } } } return null; } /// /// 通过图片路径下载图片 /// 针对用户头像指定用户路径等 /// public byte[] GetImageDownloadUrlWithRegionUrl(string imageKey, string regionUrl) { var requestJson = HttpUtil.GetSignRequestJson(new GetImageUrlObj() { imageKey = imageKey, }); var revertObj = HttpUtil.RequestHttpsPost(NewAPI.API_POST_GetImageUrl, requestJson, regionUrl); if (revertObj.Code == StateCode.SUCCESS) { if (revertObj.Data != null) { if (!string.IsNullOrEmpty(revertObj.Data.ToString())) { var url = revertObj.Data.ToString(); return HttpUtil.HttpsDownload(url); } } } return null; } /// /// 2020-12-03 /// 检测加载图片 /// 该方法目前只适用于房间和场景的背景图片 /// /// 图片路径、云端下载图片的标识key /// 需要显示图片的ImageView /// 是否需要忽略缓存 public void LoadLocalOrNetworkImages(string imageKey, ImageView imageView, bool ignoreCache = false) { try { //1.本地默认图库图片,直接加载本地 if (imageKey.Contains("Classification/Room/Roombg") || imageKey.Contains("Intelligence/Gallery/scenebg")) { if (imageView != null) { imageView.ImageBytes = null; imageView.ImagePath = imageKey; //Utlis.WriteLine("imageKey 加载本地图片成功"); } } else { //2.自定义图片,检测是否本地缓存过,没有则云端下载然后缓存 if (!ignoreCache && Exists(imageKey)) { //2.1 本地有缓存并且不忽略缓存,直接本地读取 if (imageView != null) { imageView.ImageBytes = ReadFile(imageKey); //Utlis.WriteLine("imageKey 加载自定义缓存图片成功"); } } else { //2.2 本地没缓存,开启线程云端下载然后缓存 System.Threading.Tasks.Task.Run(() => { byte[] imageBytes = GetImageDownloadUrl(imageKey); if (imageBytes != null) { WriteFileByBytes(imageKey, imageBytes); //2.3 下载成功,显示并缓存本地 Application.RunOnMainThread(() => { if (imageView != null) { imageView.ImageBytes = imageBytes; //Utlis.WriteLine("imageKey 加载云端下载图片成功"); } }); } else { //2.4 下载是否,是否使用默认图片 //Utlis.WriteLine("imageKey 加载云端图片失败"); } }); } } } catch (Exception ex) { Utlis.WriteLine("imageKey 加载图片异常 catch"); } finally { } } /// /// 2020-12-03 /// 检测加载图片 /// 该方法目前只适用于房间和场景的背景图片 /// /// 图片路径、云端下载图片的标识key /// 需要显示图片的FrameLayout /// 是否需要忽略缓存 public void LoadLocalOrNetworkImages(string imageKey, FrameLayout frameLayout, bool ignoreCache = false) { try { //1.本地默认图库图片,直接加载本地 if (imageKey.Contains("Classification/Room/Roombg") || imageKey.Contains("Intelligence/Gallery/scenebg")) { if (frameLayout != null) { //imageView.ImageBytes = null; frameLayout.BackgroundImagePath = imageKey; //Utlis.WriteLine("imageKey 加载本地图片成功"); } } else { //2.自定义图片,检测是否本地缓存过,没有则云端下载然后缓存 if (!ignoreCache && Exists(imageKey)) { //2.1 本地有缓存并且不忽略缓存,直接本地读取 if (frameLayout != null) { frameLayout.BackgroundImagePath = imageKey; //Utlis.WriteLine("imageKey 加载自定义缓存图片成功"); } } else { //2.2 本地没缓存,开启线程云端下载然后缓存 System.Threading.Tasks.Task.Run(() => { byte[] imageBytes = GetImageDownloadUrl(imageKey); if (imageBytes != null) { WriteFileByBytes(imageKey, imageBytes); //2.3 下载成功,显示并缓存本地 Application.RunOnMainThread(() => { if (frameLayout != null) { frameLayout.BackgroundImagePath = imageKey; //Utlis.WriteLine("imageKey 加载云端下载图片成功"); } }); } else { //2.4 下载是否,是否使用默认图片 //Utlis.WriteLine("imageKey 加载云端图片失败"); } }); } } } catch (Exception ex) { Utlis.WriteLine("imageKey 加载图片异常 catch"); } finally { } } /// /// 2021-01-28 /// 加载第三方品牌icon /// /// 图片路径、云端下载图片的标识key /// 需要显示图片的ImageView /// 是否需要忽略缓存 public void Load3tyBrandIconImages(string brandName, string imageKey, ImageView imageView) { try { System.Threading.Tasks.Task.Run(() => { //byte[] imageBytes = GetImageDownloadUrl(imageKey); //if (imageBytes != null) //{ // WriteFileByBytes(imageKey, imageBytes); // //2.3 下载成功,显示并缓存本地 // Application.RunOnMainThread(() => { // if (imageView != null) // { // imageView.ImageBytes = imageBytes; // //Utlis.WriteLine("imageKey 加载云端下载图片成功"); // } // }); //} //var ddd = new Common.DownLoadImageAsync(imageKey,"1","1"); //ddd.StartDownloadImageAsync(); Action action = () => { Application.RunOnMainThread(() => { imageView.ImagePath = $"{brandName}.png"; }); }; FileUtlis.Files.DownLoadImage($"{brandName}.png", imageKey, action); }); } catch (Exception ex) { Utlis.WriteLine("imageKey 加载图片异常 catch"); } finally { } } // /// ///// 获取拼接用户头像的ImageKey规则 ///// ///// //public string GetHeadImageKey(string userId) // { // return "ON" + "_" + userId + "_" + HEADIMAGE; // } ///// ///// 生成头像上传规则参数 ///// ///// //public UploadImageObj GetHeadImageUploadKeyObj(string userId) //{ // return new UploadImageObj() // { // prefix = "Icon" + Utlis.GetTimestamp(), // uid = userId, // fileName = HEADIMAGE, // }; //} /// /// 下载用户头像 /// /// /// 忽略缓存 /// 指定服务器域名,传空为使用当前用户地址 /// public byte[] DownHeadImageByImageKey(string imageKey, bool ignoreCache = false, string regionUrl = "") { try { if (string.IsNullOrEmpty(imageKey)) return null; byte[] imageBytes; if (!ignoreCache && Exists(imageKey)) { //本地有缓存 imageBytes = ReadFile(imageKey); } else { //云端下载 imageBytes = GetImageDownloadUrlWithRegionUrl(imageKey, regionUrl); if(imageBytes != null) { //保存到本地 WriteFileByBytes(imageKey, imageBytes); } } return imageBytes; } catch { return null; } } #endregion } }