使用 HTML5 图片上传及预览

<无详细内容>
<form action="upload.php" method="post" enctype="multipart/form-data">
UPLOAD USER-ICON:<input name="icon" id="icon" type="file" placeholder="请上传PNG格式的图像(大小在1M之内)"/><br/>
<input type="submit" value="上传"/>
</form>

<section id="main-content">
                
                <h2>文件上传(可预览)</h2>
                <p>
浏览和上传多个文件在一个去按住Ctrl(Windows、Linux)或命令(Mac)当点击他们的文件对话框,或拖放文件。上传文件的信息将是下面列出的。注意:Safari似乎无法读出任何信息关于实际的文件                </p>
                
                <h3>选择图片(>=1)</h3>
                <p>
                    <input id="files-upload" type="file"  multiple="multiple"/>
                    <!-- multiple="multiple" -->
                </p>
                <p id="drop-area">
                    <span class="drop-instructions">投放文件到这里</span>
                    <span class="drop-over">拖动文件到此处!</span>
                </p>
                
                <ul id="file-list">
                    <li class="no-items">(没有上传文件)</li>
                </ul>
                <script>
                    (function () {
                        var filesUpload = document.getElementById("files-upload"),
                            dropArea = document.getElementById("drop-area"),
                            fileList = document.getElementById("file-list");
                            
                        function uploadFile (file) {
                            var li = document.createElement("li"),
                                div = document.createElement("div"),
                                img,
                                progressBarContainer = document.createElement("div"),
                                progressBar = document.createElement("div"),
                                reader,
                                xhr,
                                fileInfo;
                                
                            li.appendChild(div);
                            
                            progressBarContainer.className = "progress-bar-container";
                            progressBar.className = "progress-bar";
                            progressBarContainer.appendChild(progressBar);
                            li.appendChild(progressBarContainer);
                            
                            /*
                                If the file is an image and the web browser supports FileReader,
                                present a preview in the file list
                            */
                            if (typeof FileReader !== "undefined" && (/image/i).test(file.type)) {
                                img = document.createElement("img");
                                li.appendChild(img);
                                reader = new FileReader();
                                reader.onload = (function (theImg) {
                                    return function (evt) {
                                        theImg.src = evt.target.result;
                                    };
                                }(img));
                                reader.readAsDataURL(file);
                            }
                            
                            // Uploading - for Firefox, Google Chrome and Safari
                            xhr = new XMLHttpRequest();
                            
                            // Update progress bar
                            xhr.upload.addEventListener("progress", function (evt) {
                                if (evt.lengthComputable) {
                                    progressBar.style.width = (evt.loaded / evt.total) * 100 + "%";
                                }
                                else {
                                    // No data to calculate on
                                }
                            }, false);
                            
                            // File uploaded
                            xhr.addEventListener("load", function () {
                                progressBarContainer.className += " uploaded";
                                progressBar.innerHTML = "Uploaded!";
                            }, false);
                            
                            xhr.open("post", "upload/upload.php", true);
                            
                            // Set appropriate headers
                            xhr.setRequestHeader("Content-Type", "multipart/form-data");
                            xhr.setRequestHeader("X-File-Name", file.name);
                            xhr.setRequestHeader("X-File-Size", file.size);
                            xhr.setRequestHeader("X-File-Type", file.type);

                            // Send the file (doh)
                            xhr.send(file);
                            
                            // Present file info and append it to the list of files
                            fileInfo = "<div><strong>Name:</strong> " + file.name + "</div>";
                            fileInfo += "<div><strong>Size:</strong> " + parseInt(file.size / 1024, 10) + " kb</div>";
                            fileInfo += "<div><strong>Type:</strong> " + file.type + "</div>";
                            div.innerHTML = fileInfo;
                            
                            fileList.appendChild(li);
                        }
                        
                        function traverseFiles (files) {
                            if (typeof files !== "undefined") {
                                for (var i=0, l=files.length; i<l; i++) {
                                    uploadFile(files[i]);
                                }
                            }
                            else {
                                fileList.innerHTML = "No support for the File API in this web browser";
                            }   
                        }
                        
                        filesUpload.addEventListener("change", function () {
                            traverseFiles(this.files);
                        }, false);
                        
                        dropArea.addEventListener("dragleave", function (evt) {
                            var target = evt.target;
                            
                            if (target && target === dropArea) {
                                this.className = "";
                            }
                            evt.preventDefault();
                            evt.stopPropagation();
                        }, false);
                        
                        dropArea.addEventListener("dragenter", function (evt) {
                            this.className = "over";
                            evt.preventDefault();
                            evt.stopPropagation();
                        }, false);
                        
                        dropArea.addEventListener("dragover", function (evt) {
                            evt.preventDefault();
                            evt.stopPropagation();
                        }, false);
                        
                        dropArea.addEventListener("drop", function (evt) {
                            traverseFiles(evt.dataTransfer.files);
                            this.className = "";
                            evt.preventDefault();
                            evt.stopPropagation();
                        }, false);                                      
                    })();
                </script>
                
            </section>
编程技巧