乏mily

导航

WebUploader 上传图片回显

/*
fileMaxCount 最大文件数
buttonText 按钮文本
multiple 是否多选
*/
(function ($) {
    $.fn.extend({
        uploadImg: function (opt) {
            var webUploader;
            //可行性判断
            if (!WebUploader.Uploader.support()) {
                alert('Web Uploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器');
                throw new Error('WebUploader does not support the browser you are using.');
            }
            if (typeof opt != "object") {
                alert('参数错误!');
                return;
            }
            (function (opt, $uploaderDiv) {
                // 可能有pedding, ready, uploading, confirm, done.
                var state = 'pedding',
                    // 添加的文件数量
                    fileCount = 0,
                    // 优化retina, 在retina下这个值是2
                    //ratio = window.devicePixelRatio || 1,
                    // 缩略图大小
                    thumbnailWidth = 700,
                    thumbnailHeight = 700,
                    // 判断浏览器是否支持图片的base64
                    isSupportBase64 = (function () {
                        var data = new Image();
                        var support = true;
                        data.onload = data.onerror = function () {
                            if (this.width != 1 || this.height != 1) {
                                support = false;
                            }
                        }
                        data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
                        return support;
                    })(),

                    // $uploaderDiv = $(this),
                    $uploaderDivId = $uploaderDiv.attr('id'),

                    //图片容器
                    $queue = $uploaderDiv.find('ul.filelist').length > 0 ? $("ul.filelist") : $('<ul class="filelist"></ul>').appendTo($uploaderDiv),

                    //拖拽区域
                    $dndDiv = $('<div id="dndArea_' + $uploaderDivId + '" class="placeholder">').appendTo($uploaderDiv),
                    $dndDivId = $dndDiv.attr('id'),

                    //点选区域
                    $pickerDiv = $(' <div id="filePicker_' + $uploaderDivId + '"></div>').appendTo($dndDiv),
                    $pickerDivId = $pickerDiv.attr('id');

                //迭代出默认配置
                $.each(getOption('#' + $uploaderDivId), function (key, value) {
                    opt[key] = opt[key] || value;
                });


                opt = $.extend(true, {}, opt, {
                    dnd: '#' + $dndDivId,
                    paste: '#' + $uploaderDivId,
                    //按钮容器;
                    pick: {
                        id: '#' + $pickerDivId,
                        label: '<i class="fa icon-create"></i><p class="filePickerText"><span>添加图片</span><br/>(最多' + (opt.fileMaxCount ? opt.fileMaxCount : opt['fileNumLimit']) + '张)</p>',
                        multiple: true
                    },
                });
                if (opt.buttonText) {
                    opt['pick']['label'] = opt.buttonText;
                    delete opt.buttonText;
                }
                if (!opt.multiple) {
                    opt['pick']['multiple'] = opt.multiple;
                    delete opt.multiple;
                }
                if (opt.fileMaxCount) {
                    opt['fileNumLimit'] = opt.fileMaxCount;
                    delete opt.fileMaxCount;
                }
                webUploader = WebUploader.create(opt);
                //if (!WebUploader.Uploader.support()) {
                //    alert(' 上传组件不支持您的浏览器!');
                //    return false;
                //}
                //绑定文件加入队列事件;
                webUploader.on('fileQueued', function (file) {
                    if (fileCount == opt.fileNumLimit) {
                        return NotifyDanger('上传文件数量超过限制!');
                    }
                    fileCount++;                    
                    addFile(file);
                    if (opt.fileNumLimit === fileCount) {
                        setState('ready');
                    }
                });
                webUploader.on('fileDequeued', function (file) {
                    fileCount--;
                    if (!fileCount || fileCount < opt.fileNumLimit) {
                        setState('pedding');
                    }

                    removeFile(file);

                });
                // 拖拽时不接受 js, txt 文件。
                webUploader.on('dndAccept', function (items) {
                    var denied = false,
                        len = items.length,
                        i = 0,
                        // 修改js类型
                        unAllowed = 'text/plain;application/javascript ';

                    for (; i < len; i++) {
                        // 如果在列表里面
                        if (~unAllowed.indexOf(items[i].type)) {
                            denied = true;
                            break;
                        }
                    }

                    return !denied;
                });
                //选择文件错误触发事件;
                webUploader.on('error', function (code) {
                    var text = '';
                    switch (code) {
                        case 'F_DUPLICATE': text = '该文件已经被选择了!';
                            break;
                        case 'Q_EXCEED_NUM_LIMIT': text = '上传文件数量超过限制!';
                            break;
                        case 'F_EXCEED_SIZE': text = '文件大小不能超过1M!';
                            break;
                        case 'Q_EXCEED_SIZE_LIMIT': text = '所有文件总大小超过限制!';
                            break;
                        case 'Q_TYPE_DENIED': text = '文件类型不正确或者是空文件!';
                            break;
                        default: text = '未知错误!';
                            break;
                    }
                    NotifyDanger(text);
                });
                webUploader.on('all', function (type) {
                    switch (type) {
                        case 'uploadFinished':
                            setState('confirm');
                            break;
                        case 'startUpload':
                            setState('uploading');
                            break;
                        case 'stopUpload':
                            setState('paused');
                            break;

                    }
                })
                function setState(val) {
                    if (val === state) {
                        return;
                    }
                    state = val;

                    switch (state) {
                        case 'pedding':
                            $dndDiv.removeClass('element-invisible');
                            //$queue.hide();
                            webUploader.refresh();
                            break;
                        case 'ready':
                            $dndDiv.addClass('element-invisible');
                            //$queue.show();
                            webUploader.refresh();
                            break;
                    }
                }
                // 当有文件添加进来时执行,负责view的创建
                function addFile(file) {
                    var $li = $('<li id="' + file.id + '">' +
                        //'<p class="title">' + file.name + '</p>' +
                        '<a href="" class="linkA" data-fancybox="group" data-caption=""><p class="imgWrap"></p></a>' +
                        //'<p class="progress"><span></span></p>' +
                        '</li>'),

                        $btns = $('<div class="file-panel">' +
                            '<span class="cancel">删除</span></div>').appendTo($li),
                        $prgress = $li.find('p.progress span'),
                        $wrap = $li.find('p.imgWrap'),
                        $info = $('<p class="error"></p>'),
                        $link = $li.find('a.linkA');

                    showError = function (code) {
                        switch (code) {
                            case 'exceed_size':
                                text = '文件大小超出';
                                break;

                            case 'interrupt':
                                text = '上传暂停';
                                break;

                            default:
                                text = '上传失败,请重试';
                                break;
                        }

                        $info.text(text).appendTo($li);
                    };

                    if (file.getStatus() === 'invalid') {
                        showError(file.statusText);
                    } else {
                        // @todo lazyload
                        $wrap.text('预览中');
                        webUploader.makeThumb(file, function (error, src) {
                            if (error) {
                                $wrap.text('不能预览');
                                return;
                            }

                            if (isSupportBase64) {
                                var img = $('<img src="' + src + '">');
                                $wrap.empty().append(img);
                                $link.attr('href', src);
                            } else {
                                $wrap.text("预览出错");
                            }
                        }, thumbnailWidth, thumbnailHeight);
                    }

                    file.on('statuschange', function (cur, prev) {
                        if (prev === 'progress') {
                            $prgress.hide().width(0);
                        } else if (prev === 'queued') {
                            $li.off('mouseenter mouseleave');
                            $btns.remove();
                        }

                        // 成功
                        if (cur === 'error' || cur === 'invalid') {
                            console.log(file.statusText);
                            showError(file.statusText);
                        } else if (cur === 'interrupt') {
                            showError('interrupt');
                        } else if (cur === 'queued') {
                        } else if (cur === 'progress') {
                            $info.remove();
                            $prgress.css('display', 'block');
                        } else if (cur === 'complete') {
                            $li.append('<span class="success"></span>');
                        }

                        $li.removeClass('state-' + prev).addClass('state-' + cur);
                    });

                    $li.on('mouseenter', function () {
                        $btns.stop().animate({ height: 30 });
                    });

                    $li.on('mouseleave', function () {
                        $btns.stop().animate({ height: 0 });
                    });

                    $btns.on('click', 'span', function () {
                        webUploader.removeFile(file);

                        //if (supportTransition) {
                        //    deg = 'rotate(' + file.rotation + 'deg)';
                        //    $wrap.css({
                        //        '-webkit-transform': deg,
                        //        '-mos-transform': deg,
                        //        '-o-transform': deg,
                        //        'transform': deg
                        //    });
                        //} else {
                        //    $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')');
                        //    // use jquery animate to rotation
                        //    // $({
                        //    //     rotation: rotation
                        //    // }).animate({
                        //    //     rotation: file.rotation
                        //    // }, {
                        //    //     easing: 'linear',
                        //    //     step: function( now ) {
                        //    //         now = now * Math.PI / 180;

                        //    //         var cos = Math.cos( now ),
                        //    //             sin = Math.sin( now );

                        //    //         $wrap.css( 'filter', "progid:DXImageTransform.Microsoft.Matrix(M11=" + cos + ",M12=" + (-sin) + ",M21=" + sin + ",M22=" + cos + ",SizingMethod='auto expand')");
                        //    //     }
                        //    // });
                        //}


                    });

                    $li.appendTo($queue);
                }
                // 负责view的销毁
                function removeFile(file) {
                    var $li = $('#' + file.id);
                    $li.remove();
                }
            })(opt, $(this))

       //以下是图片回显的重点内容:先将图片转成File类型,然后通过addFiles把图片添加到队列。参考:https://segmentfault.com/q/1010000007428390
            var pictureObj = new Object();
            pictureObj.getPictures = function (opt) {
                if (opt.pictures) {
                    //convertBase64UrlToBlob
                    var getFileBlob = function (url, cb) {
                        var bytes = window.atob(url);        //去掉url的头,并转换为byte  

                        //处理异常,将ascii码小于0的转换为大于0  
                        var ab = new ArrayBuffer(bytes.length);
                        var ia = new Uint8Array(ab);
                        for (var i = 0; i < bytes.length; i++) {
                            ia[i] = bytes.charCodeAt(i);
                        }

                        cb(new Blob([ab], { type: 'image/jpeg' }));
                    };

                    var blobToFile = function (blob, name) {
                        blob.lastModifiedDate = new Date();
                        blob.name = name;
                        return blob;
                    };

                    var getFileObject = function (filePathOrUrl, cb) {
                        getFileBlob(filePathOrUrl, function (blob) {
                            cb(blobToFile(blob, 'test.jpg'));
                        });
                    };
                    var pictures = opt.pictures.split(',');
                    $.each(pictures, function (index, item) {
                        getFileObject(item, function (fileObject) {
                            var wuFile = new WebUploader.Lib.File(WebUploader.guid('rt_'), fileObject);
                            var file = new WebUploader.File(wuFile);
                            webUploader.addFiles(file)
                        })
                    })
                }
            }
            return pictureObj;
        }
    })
})(jQuery)

//Web Uploader默认配置;
function getOption(objId) {
    /*
    *    配置文件同webUploader一致,这里只给出默认配置.
    *    具体参照:http://fex.baidu.com/webuploader/doc/index.html
    */
    return {
        //按钮容器;
        pick: {
            id: objId,
            label: '<i class="fa icon- create"></i><p class="filePickerText"><span>点击添加图片</span></p>',//'<i class="fa icon-create"></i><p class="filePickerText"><span>添加图片</span><br/>(最多20张)</p>',
            multiple: true
        },
        //类型限制;
        //accept: {
        //    title: "Images",
        //    extensions: "gif,jpg,jpeg,bmp,png,ico",
        //    mimeTypes: "image/*"
        //},
        //配置生成缩略图的选项
        thumb: {
            width: 170,
            height: 150,
            // 图片质量,只有type为`image/jpeg`的时候才有效。
            quality: 70,
            // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false.
            allowMagnify: false,
            // 是否允许裁剪。
            crop: false,
            // 为空的话则保留原有图片格式。
            // 否则强制转换成指定的类型。
            type: "image/jpeg"
        },
        //文件上传方式
        method: "POST",
  tyty      //fh;
       tguty server: "",
        //是否已二进制的流的方式发送文件,这样整个上传内容php://input都为文件内容
        sendAsBinary: false,
        // 开起分片上传。 thinkphp的上传类测试分片无效,图片丢失;
        chunked: true,
        // 分片大小
        chunkSize: 512 * 1024,
        //最大上传的文件数量, 总文件大小,单个文件大小(单位字节);
        fileNumLimit: 50,
        fileSizeLimit: 10240 * 1024,
        fileSingleSizeLimit: 1024 * 1024,
    };
}

////实例化Web Uploader
//function getUploader(opt) {
//    return new WebUploader.Uploader(opt);
//

前台调用方式:

 this.init_uploader_picture = function () { //实例化并绑定药品图片
        $('#uploader_picture').uploadImg({
            fileMaxCount: 1,
            multiple: false,
            //pictures: self.form.picture()
        }).getPictures({
            pictures: self.form.picture()
        });
    }

 

方式二

/*
fileMaxCount 最大文件数
buttonText 按钮文本
multiple 是否多选
pictures base64图片,以逗号隔开
*/
(function ($) {
    $.fn.extend({
        diyUpload: function (opt) {
            //可行性判断
            if (!WebUploader.Uploader.support()) {
                alert('Web Uploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器');
                throw new Error('WebUploader does not support the browser you are using.');
            }

            if (typeof opt != "object") {
                alert('参数错误!');
                return;
            }

            (function (opt, $uploaderDiv) {

                // 可能有pedding, ready, uploading, confirm, done.
                var state = 'pedding',

                    // 添加的文件数量
                    fileCount = 0,

                    // 优化retina, 在retina下这个值是2
                    //ratio = window.devicePixelRatio || 1,

                    // 缩略图大小
                    thumbnailWidth = 700,
                    thumbnailHeight = 700,

                    // 判断浏览器是否支持图片的base64
                    isSupportBase64 = (function () {
                        var data = new Image();
                        var support = true;
                        data.onload = data.onerror = function () {
                            if (this.width != 1 || this.height != 1) {
                                support = false;
                            }
                        }
                        data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
                        return support;
                    })(),

                    // $uploaderDiv = $(this),
                    $uploaderDivId = $uploaderDiv.attr('id'),

                    //图片容器
                    $queue = $uploaderDiv.find('ul.filelist').length > 0 ? $("ul.filelist") : $('<ul class="filelist"></ul>').appendTo($uploaderDiv),

                    //拖拽区域
                    $dndDiv = $('<div id="dndArea_' + $uploaderDivId + '" class="placeholder">').appendTo($uploaderDiv),
                    $dndDivId = $dndDiv.attr('id'),

                    //点选区域
                    $pickerDiv = $(' <div id="filePicker_' + $uploaderDivId + '"></div>').appendTo($dndDiv),
                    $pickerDivId = $pickerDiv.attr('id');

                //迭代出默认配置
                $.each(getOption('#' + $uploaderDivId), function (key, value) {
                    opt[key] = opt[key] || value;
                });


                opt = $.extend(true, {}, opt, {
                    dnd: '#' + $dndDivId,
                    paste: '#' + $uploaderDivId,
                    //按钮容器;
                    pick: {
                        id: '#' + $pickerDivId,
                        label: '<i class="fa icon-create"></i><p class="filePickerText"><span>添加图片</span><br/>(最多' + (opt.fileMaxCount ? opt.fileMaxCount : opt['fileNumLimit']) + '张)</p>',
                        multiple: true
                    },
                });
                if (opt.buttonText) {
                    opt['pick']['label'] = opt.buttonText;
                    delete opt.buttonText;
                }
                if (opt.multiple) {
                    opt['pick']['multiple'] = opt.multiple;
                    delete opt.multiple;
                }
                if (opt.fileMaxCount) {
                    opt['fileNumLimit'] = opt.fileMaxCount;
                    delete opt.fileMaxCount;
                }
         //图片回显的另一种方式
         if (opt.pictures) { var pictures = opt.pictures.split(','); for (var i = 0; i < pictures.length; i++) { fileCount++; (function () { //加载原来的图片 var href = "data:image/jpeg;base64," + pictures[i], $li = $('<li id="PIC_WU_FILE_' + i.toString() + '">\ <a href="' + href + '" class="linkA" data-fancybox="group" data-caption=""><p class="imgWrap"><img src="' + href + '"/></p></a>\ </li>'), $btns = $('<div class="file-panel">\ <span class="cancel">删除</span>\ </div>').appendTo($li); $li.appendTo($queue); $li.on('mouseenter', function () { $btns.stop().animate({ height: 30 }); }); $li.on('mouseleave', function () { $btns.stop().animate({ height: 0 }); }); $btns.on('click', 'span', function () { $(this).parent().parent().remove(); fileCount--; if (!fileCount || fileCount < opt.fileNumLimit) { $dndDiv.removeClass('element-invisible'); } }); })(i) } //上传照片数量等于限制数量时,隐藏上传按钮 if (pictures.length > 0 && opt.fileNumLimit && opt.fileNumLimit == fileCount) { $dndDiv.addClass('element-invisible'); } //重新设置限制文件个数参数 if (fileCount > 0) { opt['fileNumLimit'] = opt.fileNumLimit - fileCount; fileCount = 0; } } var webUploader = WebUploader.create(opt); //if (!WebUploader.Uploader.support()) { // alert(' 上传组件不支持您的浏览器!'); // return false; //} //绑定文件加入队列事件; webUploader.on('fileQueued', function (file) { fileCount++; addFile(file); if (opt.fileNumLimit === fileCount) { setState('ready'); } }); webUploader.on('fileDequeued', function (file) { fileCount--; if (!fileCount || fileCount < opt.fileNumLimit) { setState('pedding'); } removeFile(file); }); // 拖拽时不接受 js, txt 文件。 webUploader.on('dndAccept', function (items) { var denied = false, len = items.length, i = 0, // 修改js类型 unAllowed = 'text/plain;application/javascript '; for (; i < len; i++) { // 如果在列表里面 if (~unAllowed.indexOf(items[i].type)) { denied = true; break; } } return !denied; }); //选择文件错误触发事件; webUploader.on('error', function (code) { var text = ''; switch (code) { case 'F_DUPLICATE': text = '该文件已经被选择了!'; break; case 'Q_EXCEED_NUM_LIMIT': text = '上传文件数量超过限制!'; break; case 'F_EXCEED_SIZE': text = '文件大小不能超过1M!'; break; case 'Q_EXCEED_SIZE_LIMIT': text = '所有文件总大小超过限制!'; break; case 'Q_TYPE_DENIED': text = '文件类型不正确或者是空文件!'; break; default: text = '未知错误!'; break; } NotifyDanger(text); //alert(text); }); webUploader.on('all', function (type) { switch (type) { case 'uploadFinished': setState('confirm'); break; case 'startUpload': setState('uploading'); break; case 'stopUpload': setState('paused'); break; } }) function setState(val) { if (val === state) { return; } state = val; switch (state) { case 'pedding': $dndDiv.removeClass('element-invisible'); //$queue.hide(); webUploader.refresh(); break; case 'ready': $dndDiv.addClass('element-invisible'); //$queue.show(); webUploader.refresh(); break; } } // 当有文件添加进来时执行,负责view的创建 function addFile(file) { var $li = $('<li id="' + file.id + '">' + //'<p class="title">' + file.name + '</p>' + '<a href="" class="linkA" data-fancybox="group" data-caption=""><p class="imgWrap"></p></a>' + //'<p class="progress"><span></span></p>' + '</li>'), $btns = $('<div class="file-panel">' + '<span class="cancel">删除</span></div>').appendTo($li), $prgress = $li.find('p.progress span'), $wrap = $li.find('p.imgWrap'), $info = $('<p class="error"></p>'), $link = $li.find('a.linkA'); showError = function (code) { switch (code) { case 'exceed_size': text = '文件大小超出'; break; case 'interrupt': text = '上传暂停'; break; default: text = '上传失败,请重试'; break; } $info.text(text).appendTo($li); }; if (file.getStatus() === 'invalid') { showError(file.statusText); } else { // @todo lazyload $wrap.text('预览中'); webUploader.makeThumb(file, function (error, src) { if (error) { $wrap.text('不能预览'); return; } if (isSupportBase64) { var img = $('<img src="' + src + '">'); $wrap.empty().append(img); $link.attr('href', src); } else { $wrap.text("预览出错"); } }, thumbnailWidth, thumbnailHeight); } file.on('statuschange', function (cur, prev) { if (prev === 'progress') { $prgress.hide().width(0); } else if (prev === 'queued') { $li.off('mouseenter mouseleave'); $btns.remove(); } // 成功 if (cur === 'error' || cur === 'invalid') { console.log(file.statusText); showError(file.statusText); } else if (cur === 'interrupt') { showError('interrupt'); } else if (cur === 'queued') { } else if (cur === 'progress') { $info.remove(); $prgress.css('display', 'block'); } else if (cur === 'complete') { $li.append('<span class="success"></span>'); } $li.removeClass('state-' + prev).addClass('state-' + cur); }); $li.on('mouseenter', function () { $btns.stop().animate({ height: 30 }); }); $li.on('mouseleave', function () { $btns.stop().animate({ height: 0 }); }); $btns.on('click', 'span', function () { webUploader.removeFile(file); //if (supportTransition) { // deg = 'rotate(' + file.rotation + 'deg)'; // $wrap.css({ // '-webkit-transform': deg, // '-mos-transform': deg, // '-o-transform': deg, // 'transform': deg // }); //} else { // $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); // // use jquery animate to rotation // // $({ // // rotation: rotation // // }).animate({ // // rotation: file.rotation // // }, { // // easing: 'linear', // // step: function( now ) { // // now = now * Math.PI / 180; // // var cos = Math.cos( now ), // // sin = Math.sin( now ); // // $wrap.css( 'filter', "progid:DXImageTransform.Microsoft.Matrix(M11=" + cos + ",M12=" + (-sin) + ",M21=" + sin + ",M22=" + cos + ",SizingMethod='auto expand')"); // // } // // }); //} }); $li.appendTo($queue); } // 负责view的销毁 function removeFile(file) { var $li = $('#' + file.id); $li.remove(); } })(opt, $(this)) } }) })(jQuery) //Web Uploader默认配置; function getOption(objId) { /* * 配置文件同webUploader一致,这里只给出默认配置. * 具体参照:http://fex.baidu.com/webuploader/doc/index.html */ return { //按钮容器; pick: { id: objId, label: '<i class="fa icon- create"></i><p class="filePickerText"><span>点击添加图片</span></p>',//'<i class="fa icon-create"></i><p class="filePickerText"><span>添加图片</span><br/>(最多20张)</p>', multiple: true }, //类型限制; //accept: { // title: "Images", // extensions: "gif,jpg,jpeg,bmp,png,ico", // mimeTypes: "image/*" //}, //配置生成缩略图的选项 thumb: { width: 170, height: 150, // 图片质量,只有type为`image/jpeg`的时候才有效。 quality: 70, // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. allowMagnify: false, // 是否允许裁剪。 crop: false, // 为空的话则保留原有图片格式。 // 否则强制转换成指定的类型。 type: "image/jpeg" }, //文件上传方式 method: "POST", //服务器地址; server: "", //是否已二进制的流的方式发送文件,这样整个上传内容php://input都为文件内容 sendAsBinary: false, // 开起分片上传。 thinkphp的上传类测试分片无效,图片丢失; chunked: true, // 分片大小 chunkSize: 512 * 1024, //最大上传的文件数量, 总文件大小,单个文件大小(单位字节); fileNumLimit: 50, fileSizeLimit: 10240 * 1024, fileSingleSizeLimit: 1024 * 1024, }; } ////实例化Web Uploader //function getUploader(opt) { // return new WebUploader.Uploader(opt); //}

前台调用方式:

 this.init_uploader_picture = function () { //实例化并绑定药品图片
        $('#uploader_picture').uploadImg({
            fileMaxCount: 1,
            multiple: false,
            pictures: self.form.picture()
        });
    }

 

posted on 2019-06-11 11:27  乏mily  阅读(2140)  评论(0编辑  收藏  举报