1. 程式人生 > >js 實現非同步上傳圖片+預覽

js 實現非同步上傳圖片+預覽

兩種js實現方式,一種用原生的ajax;另一種用JQuery,例子比較簡單,直接上程式碼。

複製程式碼

<!DOCTYPE html>
<html>
<head>
    <title>Title</title>
    <link href="~/Content/Css/bootstrap.3.3.4.min.css" rel="stylesheet" />
    <script src="~/Scripts/Jquery-2.1.4.min.js"></script>
    <script src="~/Scripts/bootstrap.3.3.4.min.js"></script>
</head>
<body style="overflow: scroll; overflow-y: hidden; overflow-x: hidden">
    <div style="height: 20px"></div>
    <div class="container">
        <div class="row">

            <div class="col-md-6 col-md-offset-3">
                <form class="form-horizontal" enctype="multipart/form-data" role="form" id="testform">

                    <input type="hidden" value="1" id="id" name="id" />
                    <div class="control-group">
                        <label for="uname" class="col-md-3 control-label span3">姓 名:</label>
                        <div class="col-md-9">
                            <input type="text" class="form-control span3" value="" id="uname" name="uname"
                                placeholder="請輸入姓名">
                        </div>
                    </div>

                    <div class="control-group">
                        <label for="pwd" class="col-md-3 control-label span3">密碼:</label>
                        <div class="col-md-9">
                            <input type="password" class="form-control span3" value="" id="pwd" name="pwd"
                                placeholder="請輸入密碼">
                        </div>
                    </div>

                    <div class="control-group">
                        <label class="col-md-3 control-label span3"></label>
                        <div class="col-md-9">
                            <img src="" width="100px" height="100px">
                        </div>
                    </div>

                    <div class="control-group">

                        <label for="requirement" class="col-md-3 control-label span3">圖片上傳</label>
                        <div class="col-md-9">
                            <div class="input-group">
                                <input id="photoCover" class="form-control" readonly type="text">
                                <label class="input-group-btn">
                                    <input id="file" type="file" name="file" style="left: -9999px; position: absolute;">
                                    <span class="btn btn-default">Browse</span>
                                </label>
                            </div>
                        </div>
                    </div>

                    <div class="control-group">
                        <label class="col-md-2 control-label span2"></label>
                        <div class="col-md-10">
                            <a class="btn btn-small btn-primary" onclick="saveUser()">方式一</a>
                            <a class="btn btn-small btn-danger" onclick="saveUser2()">方式二</a>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <script>

        //html5實現圖片預覽功能
        $(function () {
            $("#file").change(function (e) {
                var file = e.target.files[0] || e.dataTransfer.files[0];
                $('#photoCover').val(document.getElementById("file").files[0].name);
                if (file) {
                    var reader = new FileReader();
                    reader.onload = function () {
                        $("img").attr("src", this.result);
                    }

                    reader.readAsDataURL(file);
                }
            });
        })
        //方式一 Jquery實現
        function saveUser2() {
            var id = $("#id").val().trim();
            var uname = $("#uname").val().trim();
            var pwd = $("#pwd").val().trim();
            var file = document.getElementById("file").files[0];
            var formData = new FormData();
            formData.append('id', id);
            formData.append('uname', uname);
            formData.append('pwd', pwd);
            formData.append('file', file);

            $.ajax({
                url: "/home/about",
                type: "post",
                data: formData,
                contentType: false,
                processData: false,
                mimeType: "multipart/form-data",
                success: function (data) {
                    console.log(data);
                },
                error: function (data) {
                    console.log(data);
                }
            });
        }

        //方式二  原生ajax實現
        function saveUser() {
            var id = $("#id").val().trim();
            var uname = $("#uname").val().trim();
            var pwd = $("#pwd").val().trim();
            var file = document.getElementById("file").files[0];

            //原生ajax實現檔案上傳
            var form = new FormData();
            form.append("uname", uname); // 可以增加表單資料
            form.append("id", id);
            form.append("pwd", pwd);
            if (file) {
                form.append("file", file);
            }

            //得到xhr物件
            var xhr = null;
            if (XMLHttpRequest) {
                xhr = new XMLHttpRequest();
            } else {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }

            xhr.open("post", "/home/about", true);//設定提交方式,url,非同步提交
            xhr.onload = function () {
                var data = xhr.responseText;    //得到返回值
                alert(data);
            }
            xhr.send(form);
        }
    </script>
</body>
</html>

複製程式碼

 注意:

  1、用JQuery方式需要加兩個引數 contentType: false 和processData: false,這兩個引數是為了設定ajax對file檔案物件進行序列化

  2、兩種方式在組織引數時都需要使用var form = new FormData()