一行代码实现图片上传以及回显

通用图片上传

       在原有项目中,上传图片地方不太多,由于input框为file类型的时候,显示的挺丑的,于是我们做成点击上传图片按钮后,会弹框,把上传文件的输入框放在弹框里面。即起到提示作用,又避免了样式难看,效果如下:

而且每一个上传图片的地方,都单独写一个弹框,单独的js,来获取input框的值,来上传图片,如下

模态框代码
<div id="upLoadModal" class="modal fade bs-example-modal-sm" tabindex="1" role="dialog">
    <div class="modal-dialog modal-sm">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                        aria-hidden="true">&times;</span></button>
                <h5 class="modal-title">图片上传</h5>
            </div>
            <div class="modal-body">
                <form role="form" id="formImg" enctype="multipart/form-data">
                    <input type="file" id="imageFileInput" name="imageFileInput" class="file"/>
                </form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-primary" onclick="upLoadImg()">上传</button>
                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
            </div>
        </div>
        <!-- /.modal-content -->
    </div>
    <!-- /.modal-dialog -->
</div>





//商品图片上传
function upLoadImg() {
    var file = $("#imageFileInput");
    var fileSuffix = file.val().substr(file.val().indexOf('.'));
    if (fileSuffix == ".JPG" || fileSuffix == ".JPEG" || fileSuffix == ".PNG" ||
        fileSuffix == ".jpg" || fileSuffix == ".jpeg" || fileSuffix == ".png") {
        var formData = new FormData($("#formImg")[0]);
        $.ajax({
            url: 。。。。,
            type: 'POST',
            data: formData,
            async: false,
            cache: false,
            contentType: false,
            processData: false,
            success: function (data) {
                //处理图片,回显代码
                $("#upLoadModal").modal('hide');
            }
        });
    } else {
        wbAlert("请选择正确图片格式,支持[.jpg .jpeg .png]格式", 'warning', 3000);
        return;
    }

}





        需要上传图片的地方少还比较好,不过,新开了一个项目,大量涉及上传图片。有的一个界面需要十几处不同的上传地方。不说需要写多少代码。想想十几处命名的地方。头皮发麻,不合在一起不行了。首先请求的js是大头,除了路径不同,其他的几乎全部相同,先把js代码抽取出来。每个地方上传的路径不同,弹不同的模态框。把这三个值抽取出来。

//图片上传  传入当前图片的表单id和输入框id,以及给不同的地方回显图片的逻辑代码
function upLoadImg(fun,formId,inputId) {
    var file = $(inputId);
    var fileSuffix = file.val().substr(file.val().indexOf('.'));
    if (fileSuffix == ".JPG" || fileSuffix == ".JPEG" || fileSuffix == ".PNG" ||
        fileSuffix == ".jpg" || fileSuffix == ".jpeg" || fileSuffix == ".png") {
        var formData = new FormData($(formId)[0]);
        $.ajax({
            url: uploadUrl,
            type: 'POST',
            data: formData,
            async: false,
            cache: false,
            contentType: false,
            processData: false,
            success: fun,
            error:function (e) {
                wbAlert("上传图片失败,请重新上传", 'warning', 3000);
            }
        });
    } else {
        wbAlert("请选择正确图片格式,支持[.jpg .jpeg .png]格式", 'warning', 3000);
        return;
    }
}




可是这样的话,十几个模态框还是无法避免,还是比较多的,抽取成公用的模态框?每次上传都要弹框,还是比较麻烦的。看网上有的上传图片直接点击就打开选择文件框了。去看看人家是如何实现的。首先在一个通用的地方,写一个form表单,设置隐藏

<div id="div_fileupload" style="display: none"> 
	<form role="form" id="formImg" enctype="multipart/form-data"> 
		<input type="file" id="fileupload" name="fileupload" value="" /> 
	</form>
</div>



function upLoadImg(fun) {
    var file = $("#fileupload");
    var fileSuffix = file.val().substr(file.val().indexOf('.'));
    if (fileSuffix == ".JPG" || fileSuffix == ".JPEG" || fileSuffix == ".PNG" ||
        fileSuffix == ".jpg" || fileSuffix == ".jpeg" || fileSuffix == ".png") {
        var formData = new FormData($("#formImg")[0]);
        $.ajax({
            url: uploadUrl,
            type: 'POST',
            data: formData,
            async: false,
            cache: false,
            contentType: false,
            processData: false,
            success: fun,
            error:function (e) {
                wbAlert("上传图片失败,请重新上传", 'warning', 3000);
            }
        });
    } else {
        wbAlert("请选择正确图片格式,支持[.jpg .jpeg .png]格式", 'warning', 3000);
        return;
    }
}

这样的话,有隐藏的表单了,然后需要点击按钮来调用上传的通用代码了、

function openImgBox(fun){
    var fileInput = $('#fileupload').get(0);
    fileInput.addEventListener("change", function(e) {
        upLoadImg(fun);//调用通用的上传的js方法
    }, false);
    $('#fileupload').click();//执行点击事件
}

然后在页面中,设置一个点击事件。然后在js中只有设置自个的回调函数就好了,

<a href="javascript:;" class="btn btn-xs blue" onclick="openImgBox(fun)">上传图片</a>

感觉好像大功告成,开始撸码,一个页面还没写完,js代码的关于图片回调的函数又是一堆,明明功能相同,却一堆,而且命名又是upload1,upload2.... 能不能把回调函数也给省略了。就是单纯的回填,是不是只要传图片id就可以,有的按钮是一个按钮,点击三次,上传图片到不同的框里面,所以id需要取的有规律点。最终通用回调为

function returnImageObj(imgid,imgnum,inputid) {
    var shopUploadImg = {};
    shopUploadImg.offectfun = function () {
        var img = "";
        if (imgnum == 1){
            img = $("#"+imgid)[0];
            if (img.src.indexOf("upload_icon.png") != -1){
                return true;
            }
        } else {
            for (var i = 1; i <= imgnum; i++) {
                img = $("#"+imgid + i)[0];
                if (img.src.indexOf("upload_icon.png") != -1){
                    return true;
                }
            }
        }
        wbAlert("已经上传了"+imgnum+"张图片啦!", 'warning', 3000);
        return false;
    };
    shopUploadImg.upload = function (data) {
        imageProcess = true;
        var img = "";
        if (imgnum == 1){
            var img = $("#"+imgid)[0];
            $("#"+inputid).val(data.strPath);
            $("#"+imgid).attr("src",data.strPath);
        } else {
            for (var i = 1; i <= imgnum; i++) {
                var img = $("#"+imgid + i)[0];
                if (img.src.indexOf("upload_icon.png") != -1){
                    $("#"+inputid + i).val(data.strPath);
                    $("#"+imgid + i).attr("src",data.strPath);
                    return;
                }
            }
        }
    };
    return shopUploadImg;
}

通用的上传js代码为

//imageProcess设置的boolean类型,防止上一张未上传完,又上传一张
function upLoadImg(fun) {
    if (imageProcess) {
        imageProcess = false;
        //判断是否能上传图片
        if (!fun.offectfun()){
            imageProcess = true;
            return;
        }
        var file = $("#fileupload");
        var fileSuffix = file.val().substr(file.val().indexOf('.'));
        if (fileSuffix == ".JPG" || fileSuffix == ".JPEG" || fileSuffix == ".PNG" ||
            fileSuffix == ".jpg" || fileSuffix == ".jpeg" || fileSuffix == ".png") {
            var formData = new FormData($("#formImg")[0]);
            $.ajax({
                url: uploadUrl,
                type: 'POST',
                data: formData,
                cache: false,
                contentType: false,
                processData: false,
                success: fun.upload,
                error:function (e) {
                    imageProcess = true;
                    wbAlert("上传图片失败,请重新上传", 'warning', 3000);
                    return;
                }
            });
        } else {
            wbAlert("请选择正确图片格式,支持[.jpg .jpeg .png]格式", 'warning', 3000);
            return;
        }
    }else {
        wbAlert("图片正在上传中,请稍候", 'warning', 3000);
        return;
    }
}

调用通用上传方法的js代码为:其中把通用form表单里面的input框提取出来,因为如果不提出来,用户上传同一张图片的时候,没有提示。

var inputFileupload = "<input type="file" id="fileupload" name="fileupload" value="" />";
function openImgBox(fun){
    $('#formImg').html(inputFileupload);
    var fileInput = $('#fileupload').get(0);
    fileInput.addEventListener("change", function(e) {
        upLoadImg(fun);
    }, false);
    $('#fileupload').click();
}

页面中上传按钮上传的方法为

<a onclick="openImgBox(returnImageObj('preview_goodImg',1,'goodImg'))" type="button" class="btn btn-success">上传图片</a>

转载于:https://my.oschina.net/u/3614139/blog/3026363

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值