移动端h5开发移动开发小程序学习

手机H5仿微信多图上传

2017-07-24  本文已影响173人  ONEDAYLOG

手机H5网站上传图片是基本的一个功能,所以一般程序都会用到。思路基本如下
1.图片选择
2.图片缩略展示
3.图片详情展示
4.图片删除
5.图片上传

1.图片选择

html标签代码

            <div class="bd">
                <div class="upload_label">上传图片(最多可上传9张)</div>
                <div class="cDiv" id="listView"></div>

                <div class="cDiv clearfix" id="inputDiv">
                    <div class="weui_uploader_input_wrp">
                        ![](/img/mobile/icon_add.png)
                        <input class="weui_uploader_input" id="input" type="file" accept="image/*" multiple="multiple" />
                    </div>
                </div>
            </div>

图片展示的时候必须要将手机端的图片旋转角度,不然上传的图片就是90度的图片会影响图片的浏览
使用插件JavaScript-Load-Image可以将图片旋转和压缩大小

    $(document).on("click",".btn_add",function () {
        $('#input').trigger('click')
    });

    $(document).on("change","#input",function () {
        var input = $(this)[0]; // input 控件
        imagesChanged(input);
    });
  
/**
 * 添加图片回调
 */
function imagesChanged(input) {
    var files = input.files;

    // 假设 "listView" 是将要展示图片的 div
    var listView = $("#listView");

    for (var i = 0; i < files.length; i++) { //新添加的图片
        var file = files[i];
        imgFiles.push(file);

        // Make sure `file.name` matches our extensions criteria
        if ( !/\.(jpe?g|png|gif)$/i.test(file.name) ) {
            continue;
        }
        var options = {
            orientation: true,
            maxWidth: 640,
        }

        loadImage(
            file,
            function (img) {
                var base = img.toDataURL("image/jpeg");
                var imgRow = getImageRow(base);
                imgData.push(base);
                // add_doc(base);
                listView.append(imgRow);
            },
            options // Options
        );
        //最多张数
        if (imgFiles.length >= imgCountMax) {
            $("#inputDiv").hide();
            break;
        }
    }
}

// 插入一行图片
function getImageRow(imgSrc) {
    // 向 listView 添加一行 row
    var imgRow =
        '<div class="cell_img" >' +
        '![](/img/mobile/icon_del.png)'+
        '![](' + imgSrc + ')</img>' +
        '</div>';
    return imgRow;
}
手机端界面.png

2.缩略展示已经在上中

3.详情图片展示

    <!-- 图片显示详情 -->
    <div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
        <!-- Background of PhotoSwipe.
             It's a separate element, as animating opacity is faster than rgba(). -->
        <div class="pswp__bg"></div>
        <!-- Slides wrapper with overflow:hidden. -->
        <div class="pswp__scroll-wrap">
            <!-- Container that holds slides. PhotoSwipe keeps only 3 slides in DOM to save memory. -->
            <!-- don't modify these 3 pswp__item elements, data is added later on. -->
            <div class="pswp__container">
                <div class="pswp__item"></div>
                <div class="pswp__item"></div>
                <div class="pswp__item"></div>
            </div>
            <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
            <div class="pswp__ui pswp__ui--hidden">
                <div class="pswp__top-bar">
                    <!--  Controls are self-explanatory. Order can be changed. -->
                    <div class="pswp__counter"></div>
                    <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
                    <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
                    <div class="pswp__preloader">
                        <div class="pswp__preloader__icn">
                            <div class="pswp__preloader__cut">
                                <div class="pswp__preloader__donut"></div>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                    <div class="pswp__share-tooltip"></div>
                </div>
                <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
                </button>
                <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
                </button>
                <div class="pswp__caption">
                    <div class="pswp__caption__center"></div>
                </div>
            </div>
        </div>
    </div>
    <!-- /图片显示详情 -->

主要使用了插件photoswipe友好的展示了图片的详情

    $(document).on("click",".weui_uploader_file",function () {
        var indexSel = $('.weui_uploader_file').index(this);
        var imgArr = $('.weui_uploader_file');
        var items = new Array();
        imgArr.each(function (i) {
            var img = imgArr[i];

            var item = new Object();
            item.src = img.src;
            item.w = img.naturalWidth;
            item.h = img.naturalHeight;
            items.push(item);
        });
        var pswpElement = document.querySelectorAll('.pswp')[0];
        var options = {
            index: indexSel,
            history: false,
            focus: false,
            showAnimationDuration: 0,
            hideAnimationDuration: 0
        };
        var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
        gallery.init();

    });
手机端界面2.png

4.删除图片
这个最简单删除临时的图片存储数据,删除展示div即可

      $(document).on("click",".btn_close",function(){
        indexSel = $('.btn_close').index(this);
        imgFiles.splice(indexSel,1);
        imgData.splice(indexSel,1);
        // $('.update_img')[indexSel].remove();
        $('.cell_img')[indexSel].remove();

        if (imgFiles.length >= imgCountMax) {
            $("#inputDiv").hide();
        }else{
            $("#inputDiv").show();
        }

    })

5.图片上传

我是用laravel框架的所以要设置CSRF令牌,因为是图片上传所以会有点慢,那就需要一个友好的交互等待界面
使用iosOverlay,简单易用

$(document).on("click",".btn_primary",function () {
        var title = $('#title').val();
        var mood = $('#mood').val();
        if (!title) {
            alert("标题不能为空");
            return;
        }
        if (!mood) {
            alert("心情不能为空");
            return;
        }
        if (!imgData) {
            alert("图片不能为空");
            return;
        }

        var overlay = iosOverlay({
            text: "Loading",
            duration: 20e3,
            icon: "/packages/common/iosOverlay/img/load.gif"
        });

        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });

        $.ajax({
            method: "POST",
            url: "/ssp_updata",
            data: {"title": title, "mood": mood, "imgData": imgData},
            dataType: 'json',
            success: function (data) {
                if (data.success) {
                    overlay.update({
                        icon: "/packages/common/iosOverlay/img/check.png",
                        text: data.msg
                    });

                    window.location.href = "/ssp";

                } else {
                    overlay.update({
                        icon: "/packages/common/iosOverlay/img/cross.png",
                        text: data.msg
                    });
                }

            },
            error: function (xhr, type) {
                overlay.update({
                    icon: "/packages/common/iosOverlay/img/cross.png",
                    text: "服务器连接错误"
                });
            }
        });

    });

手机端界面3.png

6.最后一步服务器端接收图片

注意本人使用的是Laravel所以是这样的的写法,用TP的就要自己写了
只需要注意传回的canvas流需要去除前面描述字段·base64_decode(substr($value, 23))·
jpg的是23个字段,png是22个字段

public function ssp_updata(Request $request){
        $data = $request->all();
        $rules = [
            'title'    => 'required',
            'mood'    => 'required',
            'imgData'    => 'required'
        ];
        $messages = [
            'title.required'    => '标题必须填写',
            'mood.required'    => '心情必须填写',
            'imgData.required'    => '图片必须大于1张'
        ];

        $validator = Validator($data, $rules, $messages);
        if ($validator->passes()) {
            $imgPath = [];
            $imgArr = $data['imgData'];
            $storage =  Storage::disk(config('admin.upload.disk'));
            $directory = '/image/'.date('Y', time()).'/'.date('md', time())."/";
            $name = time();
            foreach ($imgArr as $key => $value){
                $target = $directory.$name.$key.".jpg";
                $storage->put($target, base64_decode(substr($value, 23)));
                $imgPath[$key] = $target;
            }

            $user = session('user');
            $Snap = new Snapshots();
            $Snap->title = $data['title'];
            $Snap->mood = $data['mood'];
            $Snap->files = json_encode($imgPath);
            $Snap->users_id = $user->id;
            $Snap->save();
            $res = ['success'=>true,'msg'=>"提交成功"];
            return $res;

        } else {
            $res = ['success'=>false,'msg'=>$validator->messages()->first()];
            return $res;
        }


    }
手机端界面4.png
上一篇 下一篇

猜你喜欢

热点阅读