DownLoadFile - FileHandler

11483 ワード

C#ジャンプ新ページ
URLファイルがあるかどうかを判断します。
C#物理ディレクトリのダウンロードファイルを指定し、Response.Endにより「スレッドを中止中」という異常な問題が発生
 
 
 
public class FileHandler
    {
        public static bool DownLoadFile(string path, string fileName)
        {
            bool result = false;
            if (!string.IsNullOrEmpty(path))
            {
                if (path.StartsWith("http") || path.StartsWith("https"))
                {
                    result = InternetDownload(path, fileName);
                }
                else
                {
                    result = LocalDownload(path, fileName);
                }  
            }
            return result;
        }

        private static bool LocalDownload(string path, string fileName)
        {
            bool result = false;
            //Physical path  "D:\InvoicePDF\"
            string filePath = path + fileName;
            if (File.Exists(filePath))
            {
                result = true;
            }
            else
            {
                try
                {
                    //Relative path  "~/InvoicePDF/"
                    filePath = HttpContext.Current.Server.MapPath(filePath);
                    if (File.Exists(filePath))
                    {
                        result = true;
                    }
                }
                catch
                {
                    result = false;
                }
            }
            if (result)
            {
                try
                {
                    //string filePath = HttpContext.Current.Server.MapPath(path + fileName); 
                    FileInfo fileInfo = new FileInfo(filePath);
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.ClearContent();
                    HttpContext.Current.Response.ClearHeaders();
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
                    HttpContext.Current.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
                    HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding", "binary");
                    HttpContext.Current.Response.ContentType = "application/octet-stream";
                    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
                    HttpContext.Current.Response.WriteFile(fileInfo.FullName);
                    HttpContext.Current.Response.Flush();
                }
                catch (Exception e)
                {
                }
                finally
                {
                    HttpContext.Current.Response.End();
                }
            }
            return result;
        }

        private static bool InternetDownload(string path, string fileName)
        {
            string url = path + fileName;
            if (UrlIsExist(url))
            {
                ResponseRedirect.Redirect(HttpContext.Current.Response, url, "_blank", "");
                //System.Web.HttpContext.Current.Response.Redirect(url,false);
            }
            return false;//Never use default behavior 
        }

        private static bool UrlIsExist(string url)
        {
            System.Uri u = null;
            try
            {
                u = new Uri(url);
            }
            catch { return false; }
            bool isExist = false;
            System.Net.HttpWebRequest r = System.Net.HttpWebRequest.Create(u) as System.Net.HttpWebRequest;
            r.Method = "HEAD"; 
            try
            {
                System.Net.HttpWebResponse s = r.GetResponse() as System.Net.HttpWebResponse;
                if (s.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    isExist = true;
                }
            }
            catch (System.Net.WebException x)
            {
                try
                {
                    isExist = ((x.Response as System.Net.HttpWebResponse).StatusCode != System.Net.HttpStatusCode.NotFound);
                }
                catch { isExist = (x.Status == System.Net.WebExceptionStatus.Success); }
            }
            return isExist;
        }  
    }