主選單

2017-05-24

日本的產鬼,姑獲鳥

在某個人煙稀少的竹林裡,傳聞會出現一個沾滿血跡的女人,抱著用紅布包裹著的嬰孩徘徊於林中,沒有一點生氣,有人說那是因喪子而傷心欲絕的母親,也有人說那是含怨的幽靈鬼怪。



日本的姑獲鳥比較類似中國的「產鬼」,但描述稍有不同,也許是傳到日本時被混淆了吧。在日本,姑獲鳥指的是產後死亡的女人所化成的妖怪﹝由怨念所生?﹞,分娩時的出血染紅了她的下半身,據說會抱著一個冰冷的小孩出現在無人煙的荒野,也曾出現在路旁、海邊、寺院門口等地方。她往往在下著雨的深夜裡出現,像在尋覓什麼似的,眼神透露出困惑與無助,當路人靠近時,她會說:「請抱我的孩子好嗎?」,傳聞如果拒絕便會遭遇不幸的事,像是一陣惡寒後死掉!但若是幫忙的話則會有好事發生,而抱過來的小孩則會變成一顆普通的石頭。也有不同版本的故事,但都大同小異。

鳥山石燕畫圖百鬼夜行》


寺島良安和漢三才圖會》中的姑獲鳥  (這是...@@)


中國的「產鬼」是死於難產的母親所化的妖怪,因為沒有見到孩子就已經死去,成為妖怪後就不斷地在尋找孩子。另外也有說法是,產鬼會纏上孕婦,使其無法順利生產,但產鬼會害怕雨傘,只要將雨傘放於門後,產鬼就無法進入。

在中國,「姑獲鳥 ( うぶめどり ) 」指的是另一種妖怪,又稱夜行游女、天帝少女、鬼鳥。姑獲鳥蛻去羽毛後能變成女子。會在喜歡的嬰兒衣服或棉被上滴血做記號,之後會把小孩偷走。

《本草綱目》中紀載「《玄中記》云︰姑獲鳥,鬼神類也。衣毛為飛鳥,脫毛為女人。云是產婦死後化作,故胸前有兩乳,喜取人子養為己子。凡有小兒家,不可夜露衣物。此鳥夜飛,以血點之為志。兒輒病驚癇及疳疾,謂之無辜疳也。荊州多有之。亦謂之鬼鳥。時珍曰︰此鳥純雌無雄,七八月夜飛,害人尤毒也。」
(原來本草綱目也記載妖怪傳說啊~ XD)


2017-05-18

C#:拖曳上傳檔案 (drag and drop file uploading)

在網頁上製作一個區塊,將檔案拖曳過去後,可以自動上傳檔案到 Server 端。



網頁內容加入以下HTML,包含接受拖曳檔案的區塊 drop_block,以及顯示上傳進度的進度條 upload_progress。
<body>
    <div>
        <div id="drop_block" ondragover="javascript: drag_handler(event);" ondrop="javascript: drop_file(event);" class="upload-block">
            請將檔案拖曳到此...
            <div class="progress">
                <div id="upload_progress" class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="" aria-valuemin="0" aria-valuemax="100">
                </div>
            </div>
        </div>
    </div>
</body>
外觀對應的 CSS 如下,因為進度條使用 bootstrap,所以也要引用 bootstrap.min.css。
<head>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
    <style type="text/css">
        .upload-block
         { 
             width: 300px; 
             height:200px; 
             border-style: dotted; 
             border-color: #999999;        
             text-align:center;
             padding: 20px;
             margin: 20px; 
        } 
        .dragover 
        { 
            border-color:#FF9900; 
        } 
        .progress 
        { 
            text-align:center;
            width: 100%; 
        } 
    </style>
</head>

主要的 JavaScript 如下。event.dataTransfer 是負責處理拖曳事件的物件,可以從中取得被拖曳檔案清單 (關於DataTransfer)。XMLHttpRequest 物件可將資料傳送出去, TestUpload.aspx 是準備要負責處理接收的網頁。
<script>
    function drop_file(e) 
    {
        e.preventDefault();
        var upload_image = document.getElementById('drop_block');
        var elProgress = document.getElementById('upload_progress');
        var images_container = document.getElementById('images_container');
        var objXhr  = new XMLHttpRequest();
        var files = e.dataTransfer.files;
        var objForm = new FormData();
        var sucess_count = 0;

        objXhr.upload.onprogress = function(e) 
        {
            if (e.lengthComputable) 
            {
                var intComplete = (e.loaded / e.total) * 100 | 0;

                elProgress.innerHTML = intComplete + '%';
                elProgress.style.width = intComplete + '%';

                elProgress.setAttribute('aria-valuenow', intComplete);
            }
        }

        objXhr.onload = function(e) 
        {
            upload_image.className = upload_image.className.replace(' dragover', '');
            elProgress.className = elProgress.className.replace(' active', '');

            alert(objXhr.responseText); //接收網頁回傳結果
        }

        objXhr.open('POST', 'TestUpload.aspx');
        for (var i = 0; i < files.length; i++) 
        {
            if (!files[i].type.match('image')) 
            {
                var name = files[i].name;
                alert(name + '格式不正確,須為圖檔!');
                continue;
            }
            objForm.append('images[]', files[i]);
            objForm.append('save_file', "Y");
        }

        objXhr.send(objForm);
    }
</script>
避免某些瀏覽器執行自己的預設動作,如自動開啟圖檔等...
<script>
    function drag_handler(e) 
    {
        var upload_image = document.getElementById('drop_block');
        var elProgress = document.getElementById('upload_progress');
        e.preventDefault();  //防止瀏覽器執行預設動作
        if (!upload_image.className.match('dragover')) 
        {
            upload_image.className = upload_image.className + ' dragover';
        }

        if (upload_progress.style.width != '0%') 
        {
            upload_progress.style.width = '0%';
        }
    }
</script>


後端可使用不同程式來接收,下面是使用 ASP.NET 3.5 的例子。
protected void Page_Load(object sender, EventArgs e)
{
    if (Request["save_file"] != null)
    {
        MyUpload();
        Response.Write("上傳完成");
        Response.End();
    }
}

protected void MyUpload()
{
    for (int i = 0; i < Request.Files.Count; i++)
    {
        HttpPostedFile postedFile = Request.Files[i];

        if (postedFile.ContentLength > 0)
        {
            string fileName = Path.GetFileName(postedFile.FileName);
            postedFile.SaveAs(Server.MapPath("~/Uploads/") + fileName);
        }
    }
}


原始參考資料(使用PHP):http://code-beginner.logdown.com/posts/313821


2017-05-13

C#:FileUpload 多檔案上傳 (upload multiple files)

HTML5 只需要加入 multiple 即可支援多檔上傳,但要看瀏覽器是否支援。(IE10、IE11 後的版本)
<input name="uploads[]" type=file multiple>



ASP.NET 3.5 的寫法,增加 multiple 屬性。
<asp:FileUpload ID="FileUpload1" runat="server" multiple="multiple" />
<asp:Button ID="btnUpload" Text="Upload" runat="server" OnClick="btnUpload_Click" />
後端程式碼如下,檔案會存檔到網站根目錄下的 Uploads 資料夾:
protected void btnUpload_Click(object sender, EventArgs e)
{
    for (int i = 0; i < Request.Files.Count; i++)
    {
        HttpPostedFile postedFile = Request.Files[i];
        if (postedFile.ContentLength > 0)
        {
            string fileName = Path.GetFileName(postedFile.FileName);
            postedFile.SaveAs(Server.MapPath("~/Uploads/") + fileName);
        }
    }
}


ASP.NET 4.5 後版本的 FileUpload 元件支援 AllowMultiple 屬性。
<asp:FileUpload ID="FileUpload1" runat="server" AllowMultiple="true" />
<asp:Button ID="btnUpload" Text="Upload" runat="server" OnClick="btnUpload_Click" />
後端程式碼如下,PostedFiles 也是 .NET 4.5 開始才有的成員。
protected void btnUpload_Click(object sender, EventArgs e)
{
    if (FileUpload1.HasFile)
    {
        foreach (var postedFile in FileUpload1.PostedFiles)
        {
            string fileName = Path.GetFileName(postedFile.FileName);
            postedFile.SaveAs(Server.MapPath("~/Uploads/") + fileName);
        }
    }
}
判斷檔案型態:postedFile.ContentType == "image/jpeg"
判斷檔案大小:postedFile.ContentLength < 102400


參考資料:https://www.aspsnippets.com/Articles/Upload-multiple-files-with-ASPNet-45-FileUpload-control-in-Visual-Studio-2012-and-2013.aspx


墮落的水神,河童

河川附近傳來了小孩嘻笑的聲音,但是在接連的落水聲之後,只留下了鴨掌般的怪異腳印。河童是一種水中的妖怪,也有人說它們是墮落的水神。「河童 ( かっぱ ) 」是較為普遍統一的名稱,因地點不同還有「みずち」、「川太郎 ( かわたろう ) 」、「かわの主」、「ひょうすべ」等稱呼方式。



河童的體型通常像小孩一樣,而身上最大的特徵是頭上的儲水碟,裡面裝著些許的水,是它們的法力泉源,其次則是刀槍不入的甲殼、鳥喙般的嘴以及有蹼的手腳,據說它們有能將牛馬拉入水中的力量,不過當頭上的儲水碟乾枯時,就會失去所有的力量,另外,隨著年齡增長,河童也可以具有得知人心的能力。有人說,河童偶爾會幫忙種稻也懂得報恩並喜歡與人角力﹝能贏才有鬼﹞,但也有截然不同的說法,當中印象比較深刻的描述是:河童能以屁飛天﹝驚!﹞,而且不但會吸食牛馬的血,還會將人拉入水中取其蛋蛋為己用...這很可怕。

日本許多地方的河川或池塘都有與河童相關的傳說,也因為各地風俗不同而有不同的稱呼方式,不過那些名稱的意義大多是「住在河裡的小孩」的意思。雖然河童是個廣為人知的日本妖怪,不過據說它們原本來自於中國﹝游泳到日本嗎?﹞

據說從前日本九州的雲仙溫泉附近,曾經出現過一個河童老大,名叫「九千和尚」,經常帶著許多小河童到溫泉鄉去惡作劇,時常將牛馬拉入水中,居民對此感到十分的困擾。這事被一個名叫「赤峰」的和尚知道了以後,決定以佛法擊退它們,雙方的實力相當,所以一直無法分出高下,此時赤峰和尚心生一計,將河童引到熱氣谷去,在熱氣的侵襲下,河童頭上的水盤迅速枯竭,便向赤峰和尚求饒,答應不再作惡了。故事有很多版本但大同小異。