public NameCrcData(string urlOrNcKey, LocalCacheEntry.CacheType cacheType = LocalCacheEntry.CacheType.Raw) { Init(); string name, crc; name = crc = string.Empty; if (IsUrlOrNcKey(urlOrNcKey, ref name, ref crc)) { // url if (string.IsNullOrEmpty(name)) { _nameCrc = new NameCrc(); _nameCrc.SetData(urlOrNcKey, true); } else // ncKey { _nameCrc = new NameCrc(name, crc); } } else { Debug.LogError("urlOrNcKey is not url or namecrcKey"); } _cacheType = cacheType; }
public NameCrcData(string name, byte[] data) { Init(); _request.SetData(data); _cacheType = LocalCacheEntry.CacheType.Raw; var crc = Crc32.CountCrc(data); _nameCrc = new NameCrc(name, crc.ToString()); }
/// <summary> /// 带本地缓存的http文件获取 /// 本地版本实际上是同步,网络版本是异步 /// </summary> /// ABurl = "http://uploads.pek3a.qingstor.com/v1/1470969096712.zip"; /// imgUrl = "http://uploads.pek3a.qingstor.com/v1/zhoukou626"; public void GetFile(string url, LocalCacheEntry.CacheType type, OnHttpGetFileResponse callback) { var local = URLToLocalPath(url); if (File.Exists(local)) { var fakeResp = new HttpResp(); fakeResp.Error = HttpResp.ErrorType.None; fakeResp.WwwText = ""; switch (type) { case LocalCacheEntry.CacheType.Texture: var tex = new Texture2D(2, 2); var imgBytes = File.ReadAllBytes(local); tex.LoadImage(imgBytes); callback(fakeResp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Texture, Texture = tex }); break; case LocalCacheEntry.CacheType.Fbx: callback(fakeResp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Fbx, FbxPath = local }); break; case LocalCacheEntry.CacheType.AssetBundle: var ab = AssetBundle.LoadFromFile(local); if (null == ab) { return; } callback(fakeResp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.AssetBundle, AB = ab }); break; case LocalCacheEntry.CacheType.Raw: var bytes = File.ReadAllBytes(local); callback(fakeResp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Raw, Bytes = bytes }); break; default: break; } } else { switch (type) { case LocalCacheEntry.CacheType.Texture: //unity www的设计是:new出来的瞬间,请求就立即发起了 //由于排队的需求,只能推迟new的时机 // Dosend:只是检测www的执行状况 var www = new WWW(url); StartCoroutine(DoSend(www, (WWW w) => { var resp = GenerateGetfileResp(w); if (resp.Error != HttpResp.ErrorType.None) { callback(resp, null); } else { File.WriteAllBytes(URLToLocalPath(url), w.bytes); callback(resp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Texture, Texture = w.texture }); } })); break; case LocalCacheEntry.CacheType.Fbx: var www2 = new WWW(url); StartCoroutine(DoSend(www2, (WWW w) => { var resp = GenerateGetfileResp(w); if (resp.Error != HttpResp.ErrorType.None) { callback(resp, null); } else { var newLocal = URLToLocalPath(url); File.WriteAllBytes(newLocal, w.bytes); callback(resp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Fbx, FbxPath = newLocal }); } })); break; case LocalCacheEntry.CacheType.AssetBundle: var www3 = new WWW(url); StartCoroutine(DoSend(www3, (WWW w) => { var resp = GenerateGetfileResp(w); if (resp.Error != HttpResp.ErrorType.None) { callback(resp, null); } else { var ab = w.assetBundle; File.WriteAllBytes(URLToLocalPath(url), w.bytes); callback(resp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.AssetBundle, AB = ab }); } })); break; case LocalCacheEntry.CacheType.Raw: var www4 = new WWW(url); StartCoroutine(DoSend(www4, (WWW w) => { var resp = GenerateGetfileResp(w); if (resp.Error != HttpResp.ErrorType.None) { callback(resp, null); } else { var data = w.bytes; File.WriteAllBytes(URLToLocalPath(url), data); callback(resp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Raw, Bytes = data }); } })); break; default: break; } } }
public NameCrcData(string name, string crc, LocalCacheEntry.CacheType cacheType = LocalCacheEntry.CacheType.Raw) { Init(); _nameCrc = new NameCrc(name, crc); _cacheType = cacheType; }
//Texture2D _dataTexture2D; //AssetBundle _dataAB; public NameCrcData() { Init(); _cacheType = LocalCacheEntry.CacheType.Raw; _nameCrc = new NameCrc(); }
/// <summary> /// 带本地缓存的http文件获取 /// 本地版本实际上是同步,网络版本是异步</summary> /// <param name="url"></param> /// <param name="type"></param> /// <param name="callback"></param> /// <param name="fromQY">是否是从青云服务器上下载,区别于:百度API获取街景</param> public void GetFile(string url, LocalCacheEntry.CacheType type, OnHttpGetFileResponse callback, bool fromQY = true) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("Attempt to getfile from an empty URL"); } // 文件缓存之后的文件名 var local = URLToLocalPath(url); InfoTips.LogInfo("[GetFile] related local path:" + local); // 缓存中已经存在 if (File.Exists(local)) { InfoTips.LogInfo("[GetFile] load from local"); var fakeResp = new HttpResp(); fakeResp.Error = HttpResp.ErrorType.None; fakeResp.WwwText = ""; switch (type) { case LocalCacheEntry.CacheType.Texture: var tex = new Texture2D(2, 2); var imgBytes = File.ReadAllBytes(local); tex.LoadImage(imgBytes); callback(fakeResp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Texture, Texture = tex }); break; case LocalCacheEntry.CacheType.Fbx: callback(fakeResp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Fbx, FbxPath = local }); break; case LocalCacheEntry.CacheType.AssetBundle: var ab = AssetBundle.LoadFromFile(local); callback(fakeResp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.AssetBundle, AB = ab }); break; case LocalCacheEntry.CacheType.Raw: var bytes = File.ReadAllBytes(local); callback(fakeResp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Raw, Bytes = bytes }); break; default: break; } } else { InfoTips.LogInfo("[GetFile] load from remote"); string realUrl; NameValueCollection query; if (fromQY) { realUrl = GetHttpPrefix() + "entities/download"; query = new NameValueCollection() { { "path", url } }; } else { realUrl = url; query = null; } GetRaw(realUrl, query, www => { var resp = GenerateGetfileResp(www); if (resp.Error != HttpResp.ErrorType.None) { callback(resp, null); } else { //write cache //TODO: more scientific way: async var localPath = URLToLocalPath(url); if (localPath.Length > 250) { throw new IOException("localpath length overflowwww!!!"); } File.WriteAllBytes(localPath, www.bytes); switch (type) { case LocalCacheEntry.CacheType.Texture: callback(resp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Texture, Texture = www.texture }); break; case LocalCacheEntry.CacheType.Fbx: callback(resp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Fbx, FbxPath = localPath }); break; case LocalCacheEntry.CacheType.AssetBundle: callback(resp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.AssetBundle, AB = www.assetBundle }); break; case LocalCacheEntry.CacheType.Raw: callback(resp, new LocalCacheEntry() { Type = LocalCacheEntry.CacheType.Raw, Bytes = www.bytes }); break; default: break; } } }); } }