一、設定圖片存放的位置
//指定到對應環境的路徑
public class utilPath
{
#if (UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN)
public static string LOCAL_PATH = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
#elif (UNITY_ANDROID)
public static string LOCAL_PATH = Application.persistentDataPath;
#endif
}
//設定要存放的路徑(ImageCache跟Image可以自定義名稱)
public string path
{
#if (UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN)
get { return utilPath.LOCAL_PATH + "\\DownLoad\\"; }
#elif (UNITY_ANDROID)
get { return utilPath.LOCAL_PATH + "/DownLoad/"; }
#endif
}
/// 避免重複開啟同一個檔案,File_state 為enum自定義的檔案狀態
/// url為下載路徑、file_name為資料夾內檔名
public FileState CheckFileState(string url, string file_name)
{
if (File.Exists(path + file_name))
{
file_stream = File.OpenRead(path + file_name);
start_Length = file_stream.Length;
file_stream.Close();
total_Length = GetLength(url);
if(start_Length < total_Length)
File_state = FileState.loading;
else
File_state = FileState.isDone;
}
else
File_state = FileState.empty;
return File_state;
}
}
/// 獲取下載文件的大小
long GetLength(string url)
{
//路徑的檔名 跟 server上的apk檔名 不同的情況下,WebRequest仍然可以create,但Response會傳出錯誤(error 404)
HttpWebRequest request_Length = HttpWebRequest.Create(url) as HttpWebRequest;
request_Length.Method = "HEAD";
HttpWebResponse response_Length = request_Length.GetResponse() as HttpWebResponse;
response_Length.Close();
return response_Length.ContentLength;
}
//定義一個下載檔案的資料類型(class)
public class FileData
{
const int m_buffetSize = 1024;
public byte[] m_bufferRead;
public string FileName;
public HttpWebRequest m_request;
public HttpWebResponse m_response;
public Stream m_streamResponse;
public FileData(string name)
{
m_bufferRead = new byte[8*m_buffetSize];
FileName = name;
m_request = null;
m_response = null;
m_streamResponse = null;
}
}
//啟動重頭/中途下載
private bool File_Request(FileData file, string url)
{
try
{
if (File.Exists(path + file.FileName))
{
//檔案存在!!取得已下載部分
//Debug.Log("File is Exist to Get FileLength ~~");
file_stream = File.OpenWrite(path + file.FileName);
start_Length = file_stream.Length;
file_stream.Seek(start_Length, SeekOrigin.Current);
}
else
{
file_stream = new FileStream(path + file.FileName, FileMode.Create);
start_Length = 0L;
}
request = (HttpWebRequest)WebRequest.Create(url);
if (start_Length > 0)
request.AddRange((int)start_Length);
//實體類中將http的請求信息也帶進去了,方便回調中的判斷
file.m_request = request;
//ResponseCallbackDownLoad請求成功後的回調方法
request.BeginGetResponse(new AsyncCallback(ResponseCallbackDownLoad), file);
downDelayTime = 0;
isDownload = true;
return true;
}
catch(Exception ex)
{
Debug.Log(ex.Message);
return false;
}
}
//BeginGetResponse成功時回調函式
private void ResponseCallbackDownLoad(IAsyncResult ar)
{
try
{
obj_req = ar.AsyncState as object;
if (obj_req == null)
return;
temp_file = ar.AsyncState as FileData;
temp_file.m_response = temp_file.m_request.EndGetResponse(ar) as HttpWebResponse;
if(temp_file.m_response.StatusCode == HttpStatusCode.OK || temp_file.m_response.StatusCode == HttpStatusCode.PartialContent)
{
//Debug.Log("Download AsynFile Req End");
temp_file.m_streamResponse = temp_file.m_response.GetResponseStream();
try
{
//Debug.Log("Get New File ~~");
Stop_Flag = false;
//獲取文件總長度
fileLength = temp_file.m_response.ContentLength;
//如果是續傳的情況 總長 = 已下載 + 剩餘的
if (temp_file.m_response.StatusCode == HttpStatusCode.PartialContent)
fileLength += start_Length;
//下載的文件長度
fileSize = start_Length;
temp_progress = 0;
readCount = temp_file.m_streamResponse.Read(temp_file.m_bufferRead, 0, temp_file.m_bufferRead.Length);
while (readCount > 0)
{
downDelayTime = 0;
file_stream.Write(temp_file.m_bufferRead, 0, readCount);
fileSize += readCount;
//progress 為計算下載的百分比
Progress = (int)(((float)fileSize / (float)fileLength) * 100);
if (Progress - temp_progress >= 1)
{
temp_progress = Progress;
}
readCount = temp_file.m_streamResponse.Read(temp_file.m_bufferRead, 0, temp_file.m_bufferRead.Length);
if (!isDownload)
return;
}
//確保資料是抓完的/最後的回傳
if (fileSize >= fileLength)
{
//Debug.Log("File is DownLoad FIN !!! fileSize ~~" + fileSize + " fileLength ~~" + fileLength);
reDownloadCount = 0;
}
}
catch
Debug.Log("error" );
}
else
{
temp_file.m_response.Close();
Debug.Log("file.m_response.StatusCode = " + temp_file.m_response.StatusCode.ToString());
}
}
catch
{
Debug.Log("文件下載失敗 = ");
if (DownLoadEvent != null)
DownLoadEvent(-1);
}
file_stream.Close();
temp_file.m_response.Close();
temp_file.m_streamResponse.Close();
isDownload = false;
}
沒有留言:
張貼留言