利用ajax+php實現檔案上傳

來源:互聯網
上載者:User
理論上來說此類的檔案/圖片上傳外掛程式已經很多了,但是在使用的過程中還是會遇到各種各樣的問題,,相容問題、後台問題~~等等,所以既然別人的輪子我用不好,那就自己動手造一個吧。

本文中使用jq.ajax和php實現上傳功能,前端代碼一般無差,有的小夥伴後台不是php的,請參考貴語言的文檔進行操作即可。

先看一下,整個上傳介面大概是這樣的:查看demo

整體思路:

1、建立input設定type=file,id=file,樣式設定opacity:0,position:absolute

2、建立一個遮罩層,並設定position:absolute並且z-index大於file

3、建立FormData對象,把file放到FormData中做為資料

4、建立ajax,發送FormData資料到upload.php,監聽ajax的progress事件,即時返回上傳進度

5、在html頁面輸出伺服器的響應

6、上傳完成之後,點擊“繼續上傳”按鈕,開啟檔案選擇框,可繼續上傳。

HTML部分,比較簡單:


<p class="upload"> <p class="uploadBox">    <span class="inputCover">選擇檔案</span><form enctype="">    <input type="file" name="file" id="file" />    <button type="button" class="submit">上傳</button></form><button type="button" class="upagain">繼續上傳</button><span class="processBar"></span><span class="processNum">未選擇檔案</span>    </p></p>

CSS,樣式可以根據個人喜好自由調整,這裡僅供參考:

*{    font-family: 'microsoft yahei';    color: #4A4A4A;}.upload{    width: 700px;    padding: 20px;    border: 1px dashed #ccc;    margin: 100px auto;    border-radius: 5px;}.uploadBox{    width: 100%;    height: 35px;    position: relative;}.uploadBox input{    width: 200px;    height: 30px;    background: red;    position: absolute;    top: 2px;    left: 0;    z-index: 201;    opacity: 0;    cursor: pointer;}.uploadBox .inputCover{    width: 200px;    height: 30px;    position: absolute;    top: 2px;    left: 0;    z-index: 200;    text-align: center;    line-height: 30px;    font-size: 14px;    border: 1px solid #009393;    border-radius: 5px;    cursor: pointer;}.uploadBox button.submit{    width: 100px;    height: 30px;    position: absolute;    left: 230px;    top: 2px;    border-radius: 5px;    border: 1px solid #ccc;    background: #F0F0F0;    outline: none;    cursor: pointer;}.uploadBox button.submit:hover{    background: #E0E0E0;}.uploadBox button.upagain{    width: 100px;    height: 30px;    position: absolute;    left: 340px;    top: 2px;    display: none;    border-radius: 5px;    border: 1px solid #ccc;    background: #F0F0F0;    outline: none;    cursor: pointer;}.uploadBox button.upagain:hover{    background: #E0E0E0;}.processBar{    display: inline-block;    width: 0;    height: 7px;    position: absolute;    left: 500px;    top: 14px;    background: #009393;}.processNum{    position: absolute;    left: 620px;    color: #009393;    font-size: 12px;    line-height: 35px;}

JS部分,jq.ajax:

$(document).ready(function(){    var inputCover = $(".inputCover");    var processNum = $(".processNum");    var processBar = $(".processBar");    //上傳準備資訊    $("#file").change(function(){        var file = document.getElementById('file');        var fileName = file.files[0].name;var fileSize = file.files[0].size;        processBar.css("width",0);         //驗證要上傳的檔案if(fileSize > 1024*2*1024){    inputCover.html("<font>檔案過大,請重新選擇</font>");    processNum.html('未選擇檔案');    document.getElementById('file').value = '';    return false;}else{    inputCover.html(fileName+' / '+parseInt(fileSize/1024)+'K');    processNum.html('等待上傳');}    })    //提交驗證    $(".submit").click(function(){if($("#file").val() == ''){            alert('請先選擇檔案!');}else{    upload();}    })    //建立ajax對象,發送上傳請求    function upload(){        var file = document.getElementById('file').files[0];var form = new FormData();form.append('myfile',file);$.ajax({    url: 'upload.php',//上傳地址    async: true,//非同步    type: 'post',//post方式    data: form,//FormData資料    processData: false,//不處理資料流 !important     contentType: false,//不設定http頭 !important     xhr:function(){//擷取上傳進度                            myXhr = $.ajaxSettings.xhr();                if(myXhr.upload){                    myXhr.upload.addEventListener('progress',function(e){//監聽progress事件                    var loaded = e.loaded;//已上傳                        var total = e.total;//總大小                        var percent = Math.floor(100*loaded/total);//百分比                        processNum.text(percent+"%");//數顯進度                        processBar.css("width",percent+"px");//圖顯進度}, false);                }                return myXhr;            },     success: function(data){//上傳成功回調 console.log("文檔當前位置是:"+data);//擷取檔案連結 document.cookie = "url="+data;//此行可忽略 $(".submit").text('上傳成功'); $(".upagain").css("display","block");             }})    }    //繼續上傳    $(".upagain").click(function(){$("#file").click();processNum.html('未選擇檔案');        processBar.css("width",0);         $(".submit").text('上傳');document.getElementById('file').value = '';$(this).css("display","none");    })})

上傳完畢,upload.php處理檔案(為了伺服器安全,僅貼出程式碼片段):

<?php  if(isset($_FILES["myfile"])){      move_uploaded_file($_FILES["myfile"]["tmp_name"],"ajax/".$_FILES["myfile"]["name"]);    echo "http://www.xuxiangbo.com/ajax/".$_FILES["myfile"]["name"];}else{    echo 'no file';}?>

轉自部落格

作者:Imin

連結:http://blog.xuxiangbo.com/im-22.html

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

PHP+sftp 實現檔案的上傳與下載

四種php隨機字產生符串的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.