2017年7月13日 星期四

[C#] FileUpload 上傳檔案_過濾檔案及解析度


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace fileupload_test
{
   public partial class WebForm1 : System.Web.UI.Page
   {
       protected void Page_Load(object sender, EventArgs e)
       {

       }

       protected void Button1_Click(object sender, EventArgs e)
       {
           if (FU1.HasFile == false) return;

           // FU1.FileName 只有 "檔案名稱.附檔名",並沒有 Client 端的完整理路徑
           string filename = FU1.FileName;
           string extension = Path.GetExtension(filename).ToLowerInvariant();
           // 判斷是否為允許上傳的檔案附檔名
           List<string> allowedExtextsion = new List<string> { ".jpg", ".bmp", ".png" };
           if (allowedExtextsion.IndexOf(extension) == -1)
           {
               lblMessage.Text = "不允許該檔案上傳";
               return;
           }
           // 檢查 Server 上該資料夾是否存在,不存在就自動建立
           string serverDir = @"D:\FileUploadDemo";
           if (Directory.Exists(serverDir) == false) Directory.CreateDirectory(serverDir);


           //設定路徑

           string serverFilePath = Path.Combine(serverDir, filename);
           string fileNameOnly = Path.GetFileNameWithoutExtension(filename);

           //判斷解析度寬度小於140 px
           System.Drawing.Image myPic = System.Drawing.Image.FromFile(serverFilePath);
           if (myPic.Width < 140)
           {
               lblMessage.Text = "上傳失敗, 解析度寬度小於140 px!";
               myPic.Dispose(); //最後將物件釋放
               System.IO.File.Delete(serverFilePath); // 將檔案刪除
           }
           else
           {
               // 判斷 Server 上檔案名稱是否有重覆情況,有的話必須進行更名
               // 使用 Path.Combine 來集合路徑的優點
               //  以前發生過儲存 Table 內的是 \\ServerName\Dir(最後面沒有 \ 符號),
               //  直接跟 FileName 來進行結合,會變成 \\ServerName\DirFileName 的情況,
               //  資料夾路徑的最後面有沒有 \ 符號變成還需要判斷,但用 Path.Combine 來結合的話,
               //  資料夾路徑沒有 \ 符號,會自動補上,有的話,就直接結合
               int fileCount = 1;
               while (File.Exists(serverFilePath))
               {
                   // 重覆檔案的命名規則為 檔名_1、檔名_2 以此類推
                   filename = string.Concat(fileNameOnly, "_", fileCount, extension);
                   serverFilePath = Path.Combine(serverDir, filename);
                   fileCount++;
               }

               // 把檔案傳入指定的 Server 內路徑
               try
               {
                   FU1.SaveAs(serverFilePath);
                   lblMessage.Text = "上傳成功, 檔名為: " + filename + "圖片長寬為: " + myPic.Width + " × " + myPic.Height;
               }
               catch (Exception ex)
               {
                   lblMessage.Text = ex.Message;
               }
           }
       }
   }
}

2017年7月6日 星期四

javascript系列之window.onload事件

window.onload事件

關鍵字:window.onload,document.getElementById(),找不到網頁元素,body onload

在撰寫JavaScript程式碼時,會經常使用 document.getElementById()去取得網頁中的元素(Element):


var obj = document.getElementById("content");


我們也習慣將JavaScript程式碼置於<head> ... ... </head>之內 。

<html>
<head>
<title></title>

<script type="text/javascript">
var obj = document.getElementById("content");
alert(obj.innerHTML);
</script>

</head>

<body>
<div id="content"></div>
</body>
</html>

但是,上述的程式有個嚴重的問題,程式碼 var obj = document.getElementById("content");,欲取得網頁中的元素ID為"content"的元素,但整個網頁尚未完整下載之前,先執行了這行程式var obj = document.getElementById("content"); 欲取得網頁元素,便產生了找不到該元素的錯誤。

解決方法:

方法一:將程式碼移到該網頁元素之後。

<html>
<head>
<title></title>

<script type="text/javascript">

</script>

</head>

<body>
<div id="content"></div>
</body>
<script type="text/javascript">
var obj = document.getElementById("content");
alert(obj.innerHTML);
</script>
</html>

方法二:將程式碼寫入<body> 的onLoad觸發事件中。

<html>
<head>
<title></title>
<script type="text/javascript">
function init(){
var obj = document.getElementById("content");
alert(obj.innerHTML);
}
</script>


</head>

<body onLoad="init();">
<div id="content">It is a book !</div>
</body>


</html>

方法三:將程式碼寫入 window.onload 事件中。

<html>
<head>
<title></title>
<script type="text/javascript">
window.onload=function(){
var obj = document.getElementById("content");
alert(obj.innerHTML);
};
</script>


</head>

<body>
<div id="content">It is a book !</div>
</body>


</html>


建議的做法是方法三或是方法二;不建議使用方法一,因為使用方法一,容易使程式碼分散各處,造成維護困難。

[IPv6 TEST] 測試你家網路、你的網站是否支援 IPv6


IPv6 是新一代的網際網路通訊協定,由於原本 IPv4 協定裡相對較少的 IP 位址數量在現今人手一機、什麼都能上網的時代已經不敷使用了,而這幾年來終於也有不少機構與 ISP 業者陸續增加了 IPv6 的支援。


對一般人來說,大家都是打網址來瀏覽網站的,比較少會去接觸到 IP 位址什麼的(如 45.32.253.77 這類的位址),所以從 IPv4 轉換到 IPv6 對實際的操作並沒有任何影響,唯一的小差異可能是覺得上網速度好像變快了一點點。


由於架構的改變與 IPv6 線路的頻寬可能比較不那麼擁塞…等原因,在線上影音、網站瀏覽與檔案下載速度方面的提升,讓許多人對轉換成 IPv6 趨之若鶩。如果你已經按照 ISP 的規定申請好 IPv6 的網路服務(如 HiNet),且你的網路設備、作業系統都已升級、可以支援 IPv6,或者你自己架設的網站也已搞定 IPv6 的支援,那麼可以開下面的網站來測試看看。


網站名稱:IPv6 TEST
網站網址:http://ipv6-test.com/


使用方法:
第1步  打開 IPv6 TEST 網站,點一下「General」選單,經過一些測試後,可以在頁面上看到你的瀏覽器與所使用的網路服務是否可以支援 IPv6 協定。




第2步  如果你有自己架站而且已經設定好 IPv6 的支援,也可以在「Website」頁面中輸入你的網址、按下「Validate」按鈕來測試。


ipv6-test-02


第3步  如果有出現綠色的勾勾與「Congratulations, this website is IPv6 ready」等訊息,表示你的網站已經順利通過 IPv6 測試。

ipv6-test-03

2017年7月4日 星期二

文字轉語音C#

文字轉語音C#
  • 利用WINDOWS內建文字轉語音,先檢查一下
  • 或在WIN10下檢查
  • 開始程式撰寫



打開喇吧



搭配語音停止_程式修正
=====================================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Speech.Synthesis;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace test_voice
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        //建立靜態物件
        public static SpeechSynthesizer speech;

        protected void Page_Load(object sender, EventArgs e)
        {
            
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            if (Button1.Text == "語音試聽")
            {
                //另外建立一個物件
                speech = new SpeechSynthesizer();
                //建立一個執行緒,非同步閱讀文章
                new Thread(Speak).Start();
                Button1.Text = "停止試聽";

            }
            else if (Button1.Text == "停止試聽")
            {
                //引用靜態物件,停止所有的閱讀
                speech.SpeakAsyncCancelAll();//停止閱讀
                Button1.Text = "語音試聽";
            }
        }
        private void Speak()
        {
            speech.SpeakAsync(TextBox1.Text);//語音試聽方法
        }
    }

}

WPF聊天室应用(ASP.NET Core SignalR)

  WPF聊天室应用(ASP.NET Core SignalR) https://www.bilibili.com/video/BV1Q741187Si?p=2 https://www.bilibili.com/video/BV1UV411e75T?from=search...