1. 程式人生 > >[asp.net] ajax無重新整理檔案上傳與FormData使用介紹

[asp.net] ajax無重新整理檔案上傳與FormData使用介紹

前端主要進行瀏覽器類別判斷,如果是chrome瀏覽器,就使用ajax檔案上傳方式,如果時ie或者其他瀏覽器,就採用傳統的表單上傳檔案。

通常我們提交表單時,會將form中的所有表單元素的name和value組成一個queryString,這就是為什麼表單元素可以沒有Id但是不能沒有name屬性的原因。用jQuery方法,就是將所有表單元素序列化,即serialize。從而將表單中的引數提交到伺服器端。然而,上述方法只能傳遞一般的引數,上傳檔案的檔案流是不能被序列化傳遞的。所以就需要目前Html5的FormData物件,實現Ajax比方式的檔案上傳。

建立FormData物件的三種方式:

(1) 建立一個空的FormData物件,並通過append方法,逐個新增鍵值對。

var fdata = new FormData();

fdata.append("name","jack");

(2) 取得Form表單物件,並將其傳入FormData中。(表單Id為fm)

var fobj = document.getElementById("fm");

var fdata = new FormData(fobj);

(3) 利用form元素的getFormData方法獲取。

var fobj = document.getElementById("fm");

var fdata = fobj.getFormData();

                    var fdata = new FormData();
                    fdata.append("Id", $("#id").val());
                    fdata.append("JZId", $("#jzid").val());
                    fdata.append("Name", $("#name").val());
                    fdata.append("Introduce", $("#introduce").val());
                    fdata.append("OldName", row.Name);
                    $.ajax({
                        url: url1,
                        type: "POST",
                        data: fdata,
                        success: function (data) {
                            data = eval('(' + data + ')');      //將一個json字串解析成js物件
                            $.messager.alert("操作提示", data.Message, 'info'); //顯示後臺資訊
                            if (data.Success) {
                                $('#dlg').dialog('close');     //關閉彈出框
                                $("#dg").datagrid('reload');
                            }
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            alert(XMLHttpRequest.status);
                            alert(XMLHttpRequest.readyState);
                            alert(textStatus);
                        }
                    });

1.前端頁面

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
    CodeBehind="Show.aspx.cs" Inherits="Web.File.Show" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
    <title>文件管理</title>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <div id="content" region="center" title="文件庫" style="padding: 5px;">
        <table id="dg" class="easyui-datagrid" url="/File/FileHandler.ashx?action=GetAll"
            toolbar="#toolbar" rownumbers="true" fitcolumns="true" singleselect="true">
            <thead>
                <tr>
                    <th field="Id" width="50">
                        文件編號
                    </th>
                    <th field="JZId" width="50">
                        機組編號
                    </th>
                    <th field="Name" width="50">
                        文件名
                    </th>
                    <th field="UploadTime" width="50">
                        上傳時間
                    </th>
                    <th field="Note" width="50">
                        備註
                    </th>
                    <th field="Type" width="50">
                        型別
                    </th>
                </tr>
            </thead>
        </table>
        <div id="toolbar">
            <a href="#" class="easyui-linkbutton" iconcls="icon-add" plain="true" onclick="addFile()">新增</a> 
            <a href="#" class="easyui-linkbutton" iconcls="icon-remove" plain="true" onclick="deleteFile()">刪除</a>
        </div>
        <!--對話方塊-->
        <div id="dlg" class="easyui-dialog" style="width: 400px; padding: 10px 20px" closed="true"
            buttons="#dlg-buttons">
            <form id="fm" method="post" enctype="multipart/form-data">
            <div style="margin-bottom: 20px">
                <input id="did" class="easyui-textbox" name="Id" type="text" style="width: 100%"
                    data-options="label:'文件編號:',required:true">
            </div>
            <div style="margin-bottom: 20px">
                <input id="cc2" class="easyui-combobox" name="JZId" label="機組編號" style="width: 100%"
                    data-options="valueField: 'id', textField: 'text', url: '/JZ/JZHandler.ashx?action=GetAllJZId',required:true" />
            </div>
            <div style="margin-bottom: 20px">
                <input id="File" class="easyui-filebox" name="File" style="width: 100%" data-options="label:'文件名:',required:true" />
            </div>
            <div style="margin-bottom: 20px">
                <input id="cc1" class="easyui-textbox" name="Type" label="型別" style="width: 100%"
                    data-options="valueField:'id',textField:'text',required:false">
            </div>
            </form>
        </div>
        <div id="dlg-buttons">
            <a href="#" class="easyui-linkbutton" iconcls="icon-ok" onclick="saveFile()">儲存</a>
            <a href="#" class="easyui-linkbutton" iconcls="icon-cancel" onclick="javascript:$('#dlg').dialog('close')">
                取消</a>
        </div>
        <script type="text/javascript">
            function addFile() {
                $('#dlg').dialog('open').dialog('setTitle', '新增文件資訊');
                $('#fm').form('clear');
                url1 = '/File/FileHandler.ashx?action=Add';
            }
            function saveFile() {
                if (getBrowserType() == "Chrome") {
                    $.ajax({
                        url: url1,
                        async: false,
                        type:"POST",
                        cache: false,//上傳檔案不需要快取
                        processData: false, // 告訴jQuery不要去處理髮送的資料
                        contentType: false, // 告訴jQuery不要去設定Content-Type請求頭
                        data: new FormData($('#fm')[0]),
                        success: function (data) {
                            data = eval('(' + data + ')');      //將一個json字串解析成js物件
                            $.messager.alert("操作提示", data.Message, 'info'); //顯示後臺資訊
                            if (data.Success) {
                                $('#dlg').dialog('close');     //關閉彈出框
                                $("#dg").datagrid('reload');
                            }
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            alert(XMLHttpRequest.status);
                            alert(XMLHttpRequest.readyState);
                            alert(textStatus);
                        }
                    });
                } else {
                    $('#fm').form('submit', {
                        url: url1, //注意新增和修改的url不同
                        onSubmit: function () {
                            //驗證表單是否合法
                            return $(this).form('validate');
                        },
                        success: function (res) {
                            data = eval('(' + res + ')');      //將一個json字串解析成js物件
                            $.messager.alert("操作提示", data.Message, 'info'); //提示後臺錯誤資訊
                            if (data.Success) {
                                $('#dlg').dialog('close');     //關閉彈出框
                                $('#dg').datagrid('reload');    //重新載入資料
                            }
                        }
                    });
                }
            }
            function deleteFile() {
                var row = $('#dg').datagrid('getSelected');
                if (row) {
                    $.messager.confirm("確認刪除", "您確定要刪除當前文件[" + row.Name + "]的資訊嗎?", function (r) {
                        if (r) {
                            //使用者確定刪除
                            $.get('/File/FileHandler.ashx', { Id: row.Id, action: "Delete",Note:row.Note }, function (res) {
                                res = eval('(' + res + ')');      //將一個json字串解析成js物件
                                $.messager.alert("操作提示", res.Message, 'info'); //顯示後臺資訊
                                if (res.Success) {
                                    $("#dg").datagrid('reload');
                                }
                            });
                        }
                    });
                } else {
                    $.messager.alert("操作提示", "請選中需要刪除的使用者所在的行!", 'info');
                }
            }
        </script>
    </div>
</asp:Content>

2.後臺處理程式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Model;
using Common;
using DataService;
using System.Data;
using System.IO;
namespace Web.File
{
    /// <summary>
    /// FileHandler 的摘要說明
    /// </summary>
    public class FileHandler : IHttpHandler
    {
        DataAccess data = new DataAccess();
        public void ProcessRequest(HttpContext context)
        {
            string action = context.Request["action"].ToString();
            context.Response.ContentType = "text/plain";
            ResultInfo result = new ResultInfo();
            DocInfo file = new DocInfo();
            switch (action)
            {
                case "Add":
                    try
                    {
                        HttpPostedFile f = context.Request.Files["File"];
                        if (f == null)
                        {
                            result.Success = false;
                            result.Message = "請選擇檔案!";
                        }
                        else
                        {
                            //獲取網站根目錄的物理路徑
                            string path = HttpContext.Current.Request.MapPath("~/");
                            //獲取檔名
                            string name = Path.GetFileName(f.FileName);
                            //獲取檔案的副檔名
                            string ext = Path.GetExtension(name);
                            //支援的檔案上傳型別列表
                            List<string> ExtList = new List<string>(new string[] { ".jpg", ".doc", ".docx", ".xls" });
                            string dir = "";
                            if (ExtList.Contains(ext))
                            {
                                dir = "/Files/" + DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day + "/";
                                //新建資料夾
                                string dirtocreate = path + Path.GetDirectoryName(dir);
                                if (!Directory.Exists(dirtocreate))
                                {
                                    Directory.CreateDirectory(dirtocreate);
                                }
                                string newfileName = Guid.NewGuid().ToString();//新的檔名
                                string fullDir = dir + newfileName + ext;//完整路徑
                                f.SaveAs(context.Request.MapPath(fullDir));//儲存到伺服器上
                                //將檔案資訊儲存到資料庫中
                                file.Id = int.Parse(context.Request.Form["Id"]);
                                file.JZId = context.Request.Form["JZId"];
                                file.Name = name;//檔名
                                file.UploadTime = DateTime.Now.ToString();//檔案上傳時間
                                file.Note = dir + newfileName + ext;//備註資訊儲存的是檔案的實體地址
                                file.Type = context.Request.Form["Type"];
                                result.Success = Add(file);
                                result.Message = "新增文件資訊" + ((result.Success == true) ? "成功" : "失敗") + "!";
                            }
                            else
                            {
                                result.Success = false;
                                result.Message = "不支援的檔案型別!";
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        result.Success = false;
                        result.Message = "異常:" + ex.Message;
                    }
                    string jss = JsonHelper<ResultInfo>.ObjectToJsonString(result);
                    context.Response.Write(jss);
                    context.Response.End();
                    break;
                case "GetAll":
                    context.Response.Write(GetAll());
                    break;
                case "Delete":
                    //獲取檔案編號
                    int id = int.Parse(context.Request["Id"]);
                    //獲取檔案的物理路徑
                    string filepath = context.Request.MapPath(context.Request["Note"].Replace("/", "\\"));
                    //判斷檔案是否存在,若存在,則刪除
                    if (System.IO.File.Exists(filepath))
                    {
                        System.IO.File.Delete(filepath);
                    }
                    result.Success = Delete(id);
                    result.Message = "刪除文件資訊" + ((result.Success == true) ? "成功" : "失敗") + "!";
                    jss = JsonHelper<ResultInfo>.ObjectToJsonString(result);
                    context.Response.Write(jss);
                    context.Response.End();
                    break;
                default:
                    break;
            }
        }

        /// <summary>
        /// 儲存文件的資訊
        /// </summary>
        /// <param name="file"></param>
        public bool Add(DocInfo file)
        {
            string sql = "INSERT INTO `web`.`文件庫`(`文件編號`, `機組編號`, `文件名`, `上傳時間`, `備註`, `型別`) VALUES (" +
                file.Id + ", '" +
                file.JZId + "', '" +
                 file.Name + "', '" +
                 file.UploadTime + "', '" +
                 file.Note + "', '" +
                 file.Type + "')";
            return data.ExecSql(sql);
        }

        /// <summary>
        /// 獲取所有文件資訊
        /// </summary>
        /// <returns>文件資訊列表的json字串形式</returns>
        public string GetAll()
        {
            List<DocInfo> files = new List<DocInfo>();
            string sql = "SELECT * FROM `web`.`文件庫`";
            DataTable dTable = data.GetTable(sql);
            for (int i = 0; i < dTable.Rows.Count; i++)
            {
                DocInfo file = new DocInfo();
                file.Id = int.Parse(dTable.Rows[i]["文件編號"].ToString());
                file.JZId = dTable.Rows[i]["機組編號"].ToString();
                file.Name = dTable.Rows[i]["文件名"].ToString();
                file.UploadTime = dTable.Rows[i]["上傳時間"].ToString();
                file.Note = dTable.Rows[i]["備註"].ToString();
                file.Type = dTable.Rows[i]["型別"].ToString();
                files.Add(file);
            }
            string result = JsonHelper<DocInfo>.ListToJsonString(files);
            return result;
        }

        /// <summary>
        /// 刪除文件資訊
        /// </summary>
        /// <param name="id">文件資訊</param>
        /// <returns>更新是否成功</returns>
        public bool Delete(int id)
        {
            string sql = "Delete from `web`.`文件庫` WHERE `文件編號` = " + id;
            return data.ExecSql(sql);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

3.實現效果