主選單

顯示具有 網頁技術 標籤的文章。 顯示所有文章
顯示具有 網頁技術 標籤的文章。 顯示所有文章

2019-10-04

CKEditor:網頁文字編輯器

【使用方法】
下載相關檔案放到 ckeditor 目錄中,引用 ckeditor.js。
https://ckeditor.com/ckeditor-4/download/
<script src="/ckeditor/ckeditor.js"></script>

<textarea name="editor1" id="editor1">......</textarea>

<script>
    CKEDITOR.replace( 'editor1' );
</script>

 

【取得資料的方式】
JavaScript
<script>
    var data = CKEDITOR.instances.editor1.getData();
</script>
PHP
<?php
    $editor_data = $_POST[ 'editor1' ];
?>
ASP.NET
Request.Unvalidated.Form["editor1"];

 

【載入資料的方式】
<script>
    CKEDITOR.instances.editor1.setData( text, function()
    {
        this.checkDirty();  // true
    });
</script>
<script>
    $('#editor1').html(text);
</script>

ASP.NET,可透過 hidden 傳給前端。(ValidateRequestMode="Disabled")
<input="hidden" id="hid01" runat="server" />
//hid01.Value = System.Net.WebUtility.HtmlEncode(text);
hid01.Value = text;

Label1.Text = @"
    <script>
        $('#editor1').html(document.getElementById('" + hid01.ClientID + "').value);
    </script>
";

 

【官網文件】
https://ckeditor.com/docs/ckeditor4/latest/guide/dev_savedata.html
【簡介文章】
https://www.wfublog.com/2017/11/web-wysiwyg-text-editor-ckeditor.html
【PHP範例】
https://pjchender.blogspot.com/2015/11/ckeditor.html
【調教】
https://blog.user.today/setting-ckeditor/

 

2019-05-30

jQuery:Ajax 呼叫 Server 端 Function

Server 端 (AjaxTestPage1.aspx.cs)
Function 需為靜態,且標示為 [WebMethod]
    using System.Web.Services;  //[WebMethod]

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    [WebMethod]
    public static string getHello(string str)
    {
        return str;
    }



Client 端 (AjaxTestPage1.aspx) 引用 jQuery (使用 Google CDN)
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>

用來呼叫 Server 端的函數 (使用 ajax)。
<script>
function CallServerFunction(StrPriUrl, ObjPriData, CallBackFunction) {
    $.ajax({
        type: "post",
        url: StrPriUrl,
        contentType: "application/json; charset=utf-8",
        data: ObjPriData,
        dataType: "json",    //"text"
        async: true,    //true (非同步執行)  false(同步執行)
        success: function (result) {
            if (CallBackFunction != null && typeof CallBackFunction != 'undefined') {
                CallBackFunction(result);
            }
        },
        error: function (result) {
            alert('error occured');
            alert(result.responseText);
        },
    });
}
</script>

呼叫方法:CallServerFunction("[網址路徑] / [Server端函數名稱]", [Server端Function的接收參數], [接收回傳值的函數])
<script>
function test() {
    CallServerFunction("AjaxTestPage1.aspx/getHello", "{'str':'123'}", function (myresult) {
        alert(JSON.stringify(myresult));
        alert(myresult.d);
    });
}
</script>



呼叫的方式

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