ajaxfileupload+Jqgrid实现异步文件上传

jqGrid控件导入导出Excel文件 jqGrid控件导入导出Excel文件,将几个jqgrid导出一份Excel多sheet文件 ,亦可多sheet的excel导入至多个jqGrid表格。 立即下载

1.环境搭建

引入ajaxfileupload.js文件(ajaxfileupload.js是基于jQuery编写的插件,故此也需要引入jQuery文件)

    <script type="text/javascript" src="${pageContext.request.contextPath}/statics/jqgrid/js/ajaxfileupload.js"></script>

引入jqgrid相关文件

    <!--引入样式文件-->
    <link rel="stylesheet" href="${pageContext.request.contextPath}/statics/boot/css/bootstrap.css" type="text/css">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/statics/jqgrid/css/trirand/ui.jqgrid-bootstrap.css" type="text/css">
    <!--引入js功能文件-->
    <script src="${pageContext.request.contextPath}/statics/boot/js/jquery-2.2.1.min.js" type="text/javascript"></script>
    <script src="${pageContext.request.contextPath}/statics/boot/js/bootstrap.min.js" type="text/javascript"></script>
    <script src="${pageContext.request.contextPath}/statics/jqgrid/js/trirand/i18n/grid.locale-cn.js" type="text/javascript"></script>
    <script src="${pageContext.request.contextPath}/statics/jqgrid/js/trirand/jquery.jqGrid.min.js" type="text/javascript"></script>

2.页面代码编写

下例为上传封面cover

	<table id="banner-table"></table>
	<div id="banner-pager"></div>
	
	<script>
        $(function () {
            //展示供应商信息
            $("#banner-table").jqGrid({
                // 整合使用bootstrap样式的属性
                styleUI:'Bootstrap',
                url:'${pageContext.request.contextPath}/banner/findBannerByPage',
                editurl:'${pageContext.request.contextPath}/banner/operBanner',
                caption : "轮播图详细信息",   //设置表格名
                datatype:'json',
                colNames:['名称','封面','描述','创建日期','状态','最后修改时间'],
                // 开启表格编辑模式
                cellEdit:true,
                colModel:[
                    // {name:'id',align:'center'},
                    {name:'title',align:'center',editable:true},
                    {
                        name:'cover',
                        formatter:function(value,options,row){
                            return '<img src="${pageContext.request.contextPath}/view/banner/image/'+row.cover+'"  width="150px" height="60px"/>';
                        },
                     	// index:'cover', 相当于索引id,唯一标识(没有用到)
                        align:'center',
                        editable:true,
                        //editoptions: {enctype: "multipart/form-data"},
                        //代表编辑后表单有文件类型数据传输,(没有用到)
                        edittype:'file', //设置后,编辑时此选项为文件类型

                    },
                    {name:'description',align:'center',editable:true},
                    {
                        name:'createDate',
                        align:'center',
                        //日期格式化
                        formatter:"date",    
                        formatoptions: {srcformat:'Y-m-d H:i:s',newformat:'Y-m-d'}
                    },
                    {name:'status',align:'center',editable:true},
                    {
                        name:'lastUpdateDate',
                        align:'center',
                        //日期格式化
                        formatter:"date",
                        formatoptions: {srcformat:'Y-m-d H:i:s',newformat:'Y-m-d'}
                    },
                ],

                //数据表格是否自适应父容器的大小宽度
                autowidth:true,
                //显示行号
                rownumbers:true,
                //在第一列前加入复选框
                multiselect:true,
                //设置高度
                height:400,
                //添加分页
                //使用分页工具栏
                pager:'#banner-pager',
                rowList:[5,10,15],
                rowNum:10,
                page:1,
                //显示总记录数
                viewrecords:true,
            }).navGrid('#banner-pager',{edit : true,add : true,del : true,search:false},
                //.navGrid("工具栏id",{显示内容},{修改操作},{添加操作}),{删除操作}
				//注意注意!!!!!!!!!!!顺序一定不能错

                //=====控制修改操作====================================
                {
                    //修改后关闭编辑框
                    closeAfterEdit:true,
                },


                //=====控制添加操作======================================
                {
                    //添加后关闭编辑框
                    closeAfterAdd: true,
                    //提交后:
                    //执行完添加操作后这里返回了一个Map<String,Object>
                    //里面存有刚添加数据的ID和状态码  {data:id;code:200/404/500...}
                    afterSubmit:function (response) {
                        var id = response.responseJSON.data;   //返回的id
                        var code = response.responseJSON.code; //返回的状态码

                        if(code==200) {
                            $.ajaxFileUpload({
                                fileElementId: "cover",    //需要上传的文件域的ID,即<input type="file">的ID。
                                url: "${pageContext.request.contextPath}/banner/upload",     //后台方法的路径
                                type: 'post',              //当要提交自定义参数时,这个参数要设置成post
                                data: {id: id},              //发送请求时传递的参数(数据)
                                //dataType: 'json',          //服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。不要加它了,太恶心了!!
                                //   secureuri: false,        //是否启用安全提交,默认为false。
                                //   async : true,            //是否是异步
                                success:function() {
                                    alert("成功!");
                                    $("#banner-table").trigger("reloadGrid");
                                }
                            })
                            return "true";
                            //注意注意!!!!!!!这个一定不能少,随便返回一个字符串即可
                            //ajaxFileUpload需要一个返回值,否则上述设置的修改后关闭编辑框不会生效
                        }
                    }
                }
            );
        })
    </script>

3.后台代码编写

@RequestMapping("banner")
@RestController
public class BannerController extends BaseApiService{

    @Autowired
    private BannerService bannerService;

    @RequestMapping("findBannerByPage")
    /**
     * page:查询页数
     * rows:每页显示条数
     * searchField: 查询条件
     * searchString: 查询内容
     * 加入分页工具栏后,远程响应json数据格式为:
     * {"rows":[当前页结果(list)],"page":"当前页","total":"总页数","records":"总条数"}
     */
    public Map<String,Object> findBannerByPage(Integer page, Integer rows,
                                               String searchField, String searchString){
        //创建结果集
        List<Banner> bannerList = null;
        Integer records = 0;
        HashMap<String, Object> map = new HashMap<>();
        Integer total = 0;


        //判断是否为模糊查询
        if(searchField==null){
            //查询集合
            bannerList = bannerService.findAllByPage(page, rows);
            //查询总条数
            records = bannerService.getCount();
            //计算总页数
            total = records%rows==0?records/rows:records/rows+1;
        }else {
            //查询集合
            bannerList = bannerService.findAllByPageBySearch(page, rows,searchField,searchString);
            //查询总条数
            records = bannerService.getCountBySearch(searchField,searchString);
            //计算总页数
            total = records%rows==0?records/rows:records/rows+1;
        }
        //封装的一个map集合
        return setPageMap(bannerList,page,total,records);
    }

    @RequestMapping("operBanner")
    public Map<String,Object> operBanner(Banner banner,MultipartFile cover,String id,String oper) {
        //添加
        if("add".equals(oper)){
            String i = bannerService.add(banner);
            return setResultSuccessData(i);
        }

        //修改
        if("edit".equals(oper)){

            String i = bannerService.update(banner);
            return setResultSuccessData(i);
        }

        //删除
        if("del".equals(oper)){
            String[] ids = id.split(",");
            for (String i : ids) {
                bannerService.delete(i);
            }
        }

        return null;

    }

    @RequestMapping("upload")
    public void upload(MultipartFile cover, String id, HttpSession session) throws IOException {

        System.out.println("id===="+id);
        System.out.println("cover===="+cover.getOriginalFilename());
        if ("".equals(cover.getOriginalFilename())) throw new RuntimeException("文件为空");
        //获取文件上传路径
        String realPath = session.getServletContext().getRealPath("/view/banner/image");
        //文件上传
        cover.transferTo(new File(realPath,cover.getOriginalFilename()));

        //修改数据库图片中的路径
        Banner banner = new Banner();
        banner.setId(id).setCover(cover.getOriginalFilename());
        bannerService.update(banner);

        //return "success";
    }

}

4.流程介绍

如上例,主要实现使用jqgrid添加一条数据时,该数据为图片类型,展示时要求展示图片。
方案:

a).先将普通字段数据入库,添加完成后返回一个Map<String,Object>类型集合,存入数据data=刚添加数据的id,(code=200/500/404…状态码)。

b).前台在控制添加数据(后面介绍)后加入事件,afterSubmit代表调教数据之后触发。然后使用ajaxFileUpload发送ajax请求上传文件。

	afterSubmit:function (response) {
	var id = response.responseJSON.data;   //返回的id
	var code = response.responseJSON.code; //返回的状态码
	...
	}
	$.ajaxFileUpload({
	   fileElementId: "cover",    //需要上传的文件域的ID,即<input type="file">的ID。
	   url: "${pageContext.request.contextPath}/banner/upload",     //后台方法的路径
	   type: 'post',              //当要提交自定义参数时,这个参数要设置成post
	   data: {id: id},              //发送请求时传递的参数(数据)
	   dataType: 'json',          //服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
	   //   secureuri: false,        //是否启用安全提交,默认为false。
	   //   async : true,            //是否是异步
	   success:function() {
	       //alert("成功!");
	       $("#banner-table").trigger("reloadGrid");
	   }
	})

c).在控制上传文件的controller里进行文件上传然后修改数据库中该条数据的图片路径。

	   if ("".equals(cover.getOriginalFilename())) throw new RuntimeException("文件为空");
       //获取文件上传路径
       String realPath = session.getServletContext().getRealPath("/view/banner/image");
       //文件上传
       cover.transferTo(new File(realPath,cover.getOriginalFilename()));

       //修改数据库图片中的路径
       Banner banner = new Banner();
       banner.setId(id).setCover(cover.getOriginalFilename());
       bannerService.update(banner);

       return "success";

注意事项:

  • 如果文件框内没有文件上传该字段为“”,而并非nul。
  • 在修改时如果修改图片则正常,但如果没有修改图片则会把数据库中原图片路径置空
    原因:没有文件上传该字段为“”,会直接传入实体类中以至于修改数据库。
    解决方法:如果使用通用mapper,则在service中更新数据之前判断是否为空串,如果是则置为null;如果没有使用通用mapper,则获取原始数据重新赋值即可。
	if ("".equals(banner.getCover())) banner.setCover(null);

5.注意事项

a). jqgrid中对工具栏id、工具栏展示功能设置、修改、添加、删除操作的顺序有严格要求,不可缺少或错位;

	.navGrid('#banner-pager',{edit : true,add : true,del : true,search:false},{},{},{})
  //.navGrid("工具栏id",{显示内容},{修改操作},{添加操作}),{删除操作}

b). 执行ajaxfileupload请求时,需要有个返回值(任意字符串),否则修改、添加后关闭模态框(closeAfterAdd: true/closeAfterEdit: true)不会生效。

c). 修改或添加操作后刷新表格:此时是执行完文件上传之后,success函数中进行操作。一定注意,如果ajaxfileupload中加入了dataType,请一定要和后台controller中upload方法的返回值类型对应,若不对应则success中方法不会执行,默认请求失败,但不影响文件上传,但需要上传后手动刷新。
综上,还是不要加了!!!!!!!

	//服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
	dataType: 'json',          
	success:function() {
		//alert("成功!");
		$("#表格id").trigger("reloadGrid");
	}
jqgrid实现图片上传功能(java版) 通过jqgrid插件实现增删查改功能,最重要的一点:是支持文件上传功能 并显示到页面,java端采用servlet进行操作,三层架构,全球首发! 立即下载

相关推荐

Java 大视界 -- Java+Spark MLlib 构建智能推荐系统:协同过滤算法实战与优化(441)

Java+Spark MLlib构建智能推荐系统实战 本文详细介绍了基于Java和Spark MLlib构建协同过滤推荐系统的全流程实践方案。主要内容包括: 架构设计:采用离线批处理为主、近实时更新为辅的架构,包含数据采集层、处理层、模型层、推荐生成层、存储层和应用层六大模块,可支撑千万级用户推荐需求。 技术实现: 使用Spark MLlib的ALS算法进行协同过滤模型训练 提供数据清洗、模型训练、推荐生成等核心代码实现 采用MySQL存储推荐结果,支持批量插入和事务保障 生产级优化: 版本化模型存储规避覆

【青云交】华为云云享专家 | 阿里云开发者社区专家博主 技术圈个人影响力前 9 | 博客之星 TOP12 优快云 首位四榜(原力榜 / 作者周榜 / 领军人物 / 综合热榜)榜首,破平台纪录! 苏州地区全榜霸榜,感恩全网十多万粉丝同行! 2519

jqGrid结合ajaxFileUpload插件进行图片上传

项目背景: 项目开发需要使用jqGrid生成表格并在表格中显示图片,并实现从用户本地上传图片至服务器,如下图所示 知识点 首先,需要使用jqGrid将所需要的信息写入数据库 然后,进行文件的上传,这里使用ajaxFileUpload插件进行文件上传 最后,更改数据库中所存储的文件路径为项目中的相对路径 代码如下 代码实现 前台代码 注意需要导js文件,ajax...

菜鸟的自我修养 618

告别Mac自带终端:iTerm2 + Oh My Zsh 保姆级配置指南(含国内镜像源)

本文提供了一份详细的Mac终端优化指南,涵盖iTerm2、Oh My Zsh和Homebrew的配置流程,特别针对国内用户提供镜像源解决方案。通过安装现代化工具链和优化配置,帮助开发者打造高效、美观的终端工作环境,提升日常开发效率。

weixin_42638178的博客 396

jqGrid之ajaxfileupload文件上传

当我们使用jqgrid进行表格展示时,在使用其工具栏进行增删改查,避免不了的上传文件,所以需要发ajaxfileupload请求进行文件到服务器。 引入ajaxfileupload.js文件 <script src="/statics/jqgrid/js/ajaxfileupload.js" type="text/javascript"></script> 当引入j...

Seeyou_y的博客 791

电赛控制-----经验分享

1.赛前准备 先简单介绍一下电赛。电赛是两年一届,单数年是大电赛,全称是全国大学生电子设计大赛,之前由瑞萨电子赞助,所以之前也叫瑞萨杯,从19年开始赞助方变成了TI公司,偶数年是小电赛,全称是“TI杯”模电邀请赛,(这里不得不提TI公司的实力是愈来愈大了),一般来说小电赛的含金量会略低于大电赛,而且对与想拿国奖的同学来说还是要参加大电赛,因为小电赛一般每个学校会限制只有两个队伍进国赛,而大电赛是没有这个限制的,而且我们学校电赛保研的话,大电赛只要求国二,而小电赛只有国一才可以保,这样难度就增加了很多。..

qq_35656655的博客 1万+

iPhone免越狱Git服务器搭建教程-iSH

iPhone免越狱Git服务器搭建教程

jts666的博客 4426

自定义jqGrid编辑页面并上传文件或者图片

最近在使用jqGrid展示数据,上传图片功能花费了很长时间来实现,记录下来以便下次查阅。 jqGrid的colModel中有很多属性,如果需要上传图片,那么需要添加如下属性: name : "url", index : "url", formatter : showPicture, editable : true, edittype :

香菇的博客 6969

别再乱删文件了!修复Print Spooler服务自动停止的3个关键检查点(附Win10/Win11实测)

本文深入解析Windows系统中Print Spooler服务自动停止的常见原因及修复方法。从第三方驱动冲突、权限与服务依赖关系到打印队列积压,提供3个关键检查点的详细排查步骤,帮助用户彻底解决打印服务异常问题,适用于Win10/Win11系统。

weixin_31569671的博客 671

JQGrid 文件上传

最近公司有个项目要做,时间比较紧,公司同事推荐一款JQgrid,打开官网一看效果不错,所以公司花了$449买了个,使用起来感觉不错,开发简单模块速度快~超赞,基本的实例代码可以看官方Demo:http://www.trirand.net/demoaspnet.aspx 最近使用中发现一个问题,该控件不支持上传,最近刚接触JQuery,所以就找了个JQuery插件完成上传功能。...

weixin_30826761的博客 277

QT+QGIS跨平台编译(基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译)

QT+QGIS跨平台编译。 基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译。

LuckyHanMo的博客 4372

Android 蓝牙——概述(一)

Profiles (蓝牙应用规范),它从应用场景的角度为蓝牙技术的使用制定了不同的规范。这也是和大众日常生活接触最多的一部分。蓝牙支持很多Profiles:MAP:(MessageAccessProfile),短信访问协议,允许设备间的信息交换,短信。使用场景:智能车载中同步短信等信息。HFP:(Hands-free Profile),电话免提协议,让蓝牙设备(如蓝牙耳机/车机)可以控制电话,如接听、挂断、拒接等。

小旭的专栏 3491

文件的上传与JQGrid

最近重拾jq,下面是一位同志的参考,暂时还没觉得用到

vigor(软件开发) 4985

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

前端:jQuery笔记

 前端:jQuery笔记 此系列文章乃是学习jQuery的学习笔记。 Asp.net MVC Comet推送 摘要: 一、简介 在Asp.net MVC实现的Comet推送的原理很简单。 服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回。 客户端:请求异步Action,当接收到一个返回时,立即又再发送一个。 缺...

weixin_34148340的博客 162

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用jqGrid进行图片上传

1.jsp代码 <script type="text/javascript"> $(function () { $('#table').jqGrid({ // 整合使用bootstrap样式的属性 styleUI: 'Bootstrap', url: ...

刘不怂的博客 1209

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JqGrid结合AjaxFileUpload插件进行文件上传

项目背景: 项目开发需要使用jqGrid生成表格并在表格中显示图片,并实现从用户本地上传图片至服务器,如下图所示 知识点 首先,点击添加按钮,用jqGrid将信息写入数据库,此时文件上传的路径是经过浏览器保护处理之后的路径,不是文件的真实路径。 然后进行文件的上传,这里使用ajaxFileUpload插件进行文件上传,点击添加之后信息和错误的文件路径先进入数据库。 最后执...

zhang33565417的博客 499

jqGrid结合ajaxFileUpload插件进行音频上传+音频文件获取时长和文件获取大小+jqGrid二级表格+jqGrid操作完成后的操作

项目背景: 项目开发需要使用jqGrid生成表格并在表格中生成音频并可在线听歌,并实现从用户本地上传音频至服务器,如下图所示 基本方法与jqGrid结合ajaxFileUpload插件进行图片上传相似,这里只写部分不同的地方 代码实现 前台代码 注意需要导js文件,ajaxFileUpload的js和jqGrid和BootStrap的js $('#tt').jqGri...

菜鸟的自我修养 586

ajaxFileUpload+ThinkPHP+jqGrid 图片上传与显示

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34050519的博客 192

项目笔记之jqGrid实现文件上传以及回显

业务需求: 使用jqGridt添加功能时实现文件的上传及表格刷新和文件的回显 实现实例图: 实现步骤: 前台代码: <%-- Created by IntelliJ IDEA. User: 15757 Date: 2019/12/5 Time: 11:49 To change this template use File | Settings | File Temp...

zyhnini的博客 719

JQuery ajaxFileUpload.js上传文件的使用问题

使用在框架使用jq的情况下,使用ajaxFileUpload上传文件是一个不错的选择,ajaxFileUpload支持异步上传,采用的是隐藏的表单提交,避免了直接使用表单提交文件带来的问题,由于ajaxFileUpload依赖的jq版本较老,在jq_1.2.x之前了,所以用高版本的jq会报错,网上改写了ajaxFileUpload部分代码,以适配高低版本的jq,而且支持data来传另外的参数(之前...

lucky_ly的博客 1275

基于jQuery上传文件插件

由于最近项目的需求,需要做一个上传文件的插件,支持上传,下载,删除等功能,该插件主要运用了jQuery与jqgrid以及easyui,先贴出主要代码 /** * 上传附件插件--uploadFile * 调用示例: * $("#commonUploadBtn").click(function(){ $("#commonUpload").uploadFile({

乐于学习、乐于分享、乐于总结 8932

Day28 XD安全学习笔记--JS 应用&原生开发&Query库&Ajax 技术&前端后端&安全验证处理

本节课讲解了前端验证绕过技巧:文件上传通过删除onchange事件和修改表单提交地址,绕过JS后缀过滤上传恶意文件;登录验证利用Ajax请求抓包,篡改响应中的infoCode从0改为1实现免登录;购物漏洞同理,通过修改返回数据绕过验证。均体现前端验证可被轻易绕过,强调安全验证应部署在后端。

一支蜉蝣的博客 319

Apache Spark4.1.3 一键部署与卸载脚本

本文介绍了一套基于三台主机(node11/node12/node13)的Spark 4.1.3集群一键部署与卸载方案。在已配置主机名、SSH免密、JDK17及Hadoop 3.5.0的前提下,通过spark_deploy.sh脚本自动完成Scala 2.13.16与Spark的安装、配置分发、集群启动及进程验证。脚本支持重复执行,避免配置重复。配套的spark_uninstall.sh可安全卸载Spark与Scala,保留JDK和Hadoop环境。整个过程自动化程度高,适用于教学与生产环境快速搭建与清理。

super_mochi1 94
上一篇: lombok的使用
下一篇: mybatis generator的使用(自动生成实体类、dao等)
spring_ev
博客等级 码龄8年 4粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值