1. 程式人生 > >H5圖片預覽及上傳(WEB前端)

H5圖片預覽及上傳(WEB前端)

web上傳圖片很簡單,網上有許多的demo和js,但是本人嫌棄用那些會引入許多js包,所以還是用原生的jquery來寫吧。

一、html佈局檔案

html有一個自己的上傳檔案控制元件---input,只需要將其type屬性設定為file即可上傳檔案,accept=“image/”是用來限制檔案型別為image,input程式碼如下:
 <input class="input-upload" type="file" accept="image/*"  name="pic" >
之後,我們還需要一個image標籤來存放圖片的預覽:
<img v-bind:src="demand.image" /> //v-bind是vue.js的用法,將
src的屬性繫結為demand.image,可支援動態改變src的值,減少dom操作
完整的html程式碼:
<div id="ImageUploader" data-vpid="<%-VPID%>" data-vpcon="`{MODURL}`.js">
<div class="filearea">
        <span class="btn-upload icon-enclosure">
            <input class="input-upload" type="file" accept="image/*"  name="pic" >
        </span>
    <div class="preview" >
        <i class="hide"></i>
        <img v-bind:src="demand.image" />
        <div class="remove icon-delete"></div>
    </div>
</div>
</div>

二、css樣式

對應的css樣式:
@import "src/node_modules/views/global/sass/mixin";

#ImageUploader {
    position: relative;
    .btn-upload {
        position: relative;
        overflow: hidden;

        width: 1.57rem;
        height: 1.05rem;
        border: solid 1px $blue;

        display: table-cell; 
        vertical-align: middle;
        text-align: center;
        color: $blue;
        z-index: 20;
        margin-top: 10px;
        margin-left: 15px;
    }

    .input-upload {
        position: absolute;
        top: 0;
        right: 0;
        margin: 0;
        opacity: 0;
        -ms-filter: 'alpha(opacity=0)';
        cursor: pointer;
		direction: ltr;
		font-size: 200px !important;  /* 為了能點中,弄個超大字號 */
    }

	.preview {
        position: absolute;
	}
    img {
        max-width: 1.57rem;
        max-height: 1.05rem;
        }
	.remove {
        position: absolute;
        top: -8px;
        right: -8px;
        z-index: 10;
        width: 0.16rem;
        height: 0.16rem;
        border-radius: 50%;
        color: white;
        background: $blue; 
        font-size: 0.11rem;
        text-align: center;
        padding-top: 2px;
	}
}

三、TS程式碼

本人的用的是TS寫的,編輯器可以自動將TS轉化為JS,圖片的預覽有兩種方法,一是根據input獲取html5 JS物件;而是根據file物件生成一個影象URL,即下面程式碼中的function1和function2
import * as tomato from "@po-to/tomato";
import * as project from "views/global/common/Project";
import * as funs from "views/global/common/Funs";
import * as model from "views/global/common/Model";
import * as Vue from "vue";
import css = require("./css");    //在js中引入css樣式
import * as api from "views/global/common/API";

class VPresenter extends project.VPresenter {
    /**模組 */
    private ImageUploader_vue: any;
    /**預覽圖片 */
    private img;
    private preview;
    /**input控制元件 */
    private inputUpload;
    private btnUpload: JQuery;
    /**demand */
    private demand;
    // private form;
    constructor(view: tomato.VPView, parent?: tomato.VPresenter, vpid?: string) {
        super(view, parent, vpid);
        var aaa = css;//hack
        var user = model.globalData.user;
        var demand = this.demand = model.globalData.demand;
        var that = this;
        //取到html中的元素
       this.preview = this.find(".preview");
        this.btnUpload = this.find(".btn-upload ");
        this.inputUpload = this.find(".input-upload");
        /**刪除預覽 */
        this.preview.on('click', function () {
            that.demand.image = '';
            that.setImg();
        });
        /**預覽上傳圖片 */
        this.inputUpload.on('change', function (event) {
            // 根據這個 <input> 獲取檔案的 HTML5 js 物件
            var files = event.target.files, file;
            if (files && files.length > 0) {
                // 獲取目前上傳的檔案
                file = files[0];
                // 來在控制檯看看到底這個物件是什麼
                console.log(file);
                // 那麼我們可以做一下諸如檔案大小校驗的動作
                if (file.size > 1024 * 1024 * 2) {
                    alert('圖片大小不能超過 2MB!');
                    return false;
                }

                // 圖片預覽 function 1
                if (window['FileReader']) {
                    var reader = new FileReader();
                } else {
                    alert("您的裝置不支援圖片預覽功能,如需該功能請升級您的裝置!");
                }
                var reader = new FileReader();
                var imageType = /^image\//;
                //是否是圖片
                if (!imageType.test(file.type)) {
                    alert("請選擇圖片!");
                    return;
                }
                //讀取完成
                reader.onload = function (e) {
                    //圖片路徑設定為讀取的圖片
                    that.demand.image = this.result;
                };
                reader.readAsDataURL(file);

                // 圖片預覽 function 2
                // 下面是關鍵的關鍵,通過這個 file 物件生成一個可用的影象 URL
                // 獲取 window 的 URL 工具
                // var URL = window.URL || window['webkitURL'];
                // 通過 file 生成目標 url
                // var imgURL = URL.createObjectURL(file);
                // 用這個 URL 產生一個 <img> 將其顯示出來
                // demand.image = imgURL;
                // 使用下面這句可以在記憶體中釋放對此 url 的伺服,跑了之後那個 URL 就無效了
                // URL.revokeObjectURL(imgURL);


               that.fileUpload(file);//預覽出現後呼叫上傳方法,傳值為一個file物件,也可以傳demand.image預覽地址,看伺服器那邊怎麼要求的
            }
        });
        this.setImg();
        //this._watchEvent();
    }
    /** 初始化*/
    private setImg() {
        /**是否有圖片 */
        if ("" == this.demand.image) {
            this.preview.addClass("hide");
            this.btnUpload.removeClass("hide");
        } else {
            this.btnUpload.addClass("hide");
            this.preview.removeClass("hide");
        }
    }

    /**上傳檔案,引數:訂單id和檔案物件 */
    private fileUpload(file) {
        var that=this;
        var demand_id = this.demand.id;
        var formData = new FormData();
        formData.append('demand_id', demand_id);
        formData.append('file', file);
        $.ajax({
            xhrFields: {withCredentials: true},//ajx請求時帶上cookie
            url: 'http://dev.v2.api.wanpinghui.com/Img/uploadDemandPlaceImage',
            type: 'POST',
            cache: false,
            data: formData,
            processData: false,
            contentType: false
        }).done(function (json) {
            console.log("::"+json.image);
            model.globalData.demand.image = json.image;
        }).fail(function (json) { });
    }
}
export = VPresenter;