SpringMVC + ajaxfileupload的多文件上传

2023-11-11

    最近做一个springmvc ajax多文件上传,倒腾了下,查阅了部分资料搞定了!现在分享:

   1.Spring mvc

       a.xml配置:

    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
        <!-- set the max upload size1MB   1048576     -->
        <property name="maxUploadSize">
            <value>52428800</value>
        </property>
        <property name="maxInMemorySize">
            <value>2048</value>
        </property>
    </bean>
      b. 服务器端接收解析
        public void imgUpload(
		MultipartHttpServletRequest multipartRequest,
		HttpServletResponse response) throws Exception {
		response.setContentType("text/html;charset=UTF-8");
		Map<String, Object> result = new HashMap<String, Object>();
                //获取多个file
		for (Iterator it = multipartRequest.getFileNames(); it.hasNext();) {
			String key = (String) it.next();
			MultipartFile imgFile = multipartRequest.getFile(key);
			if (imgFile.getOriginalFilename().length() > 0) {
				String fileName = imgFile.getOriginalFilename();
                                //改成自己的对象哦!
				Object obj = new Object();
				//Constant.UPLOAD_GOODIMG_URL 是一个配置文件路径
				try {
					String uploadFileUrl = multipartRequest.getSession().getServletContext().getRealPath(Constant.UPLOAD_GOODIMG_URL);
					File _apkFile = saveFileFromInputStream(imgFile.getInputStream(), uploadFileUrl, fileName);
					if (_apkFile.exists()) {
						FileInputStream fis = new FileInputStream(_apkFile);
					} else
						throw new FileNotFoundException("apk write failed:" + fileName);
					List list = new ArrayList();
					//将obj文件对象添加到list
					list.add(obj);
					result.put("success", true);
				} catch (Exception e) {
					result.put("success", false);
					e.printStackTrace();
				}
			}
		}
		String json = new Gson().toJson(result,
				new TypeToken<Map<String, Object>>() {
				}.getType());
		response.getWriter().print(json);
	}

        //保存文件
	private File saveFileFromInputStream(InputStream stream, String path,
			String filename) throws IOException {
		File file = new File(path + "/" + filename);
		FileOutputStream fs = new FileOutputStream(file);
		byte[] buffer = new byte[1024 * 1024];
		int bytesum = 0;
		int byteread = 0;
		while ((byteread = stream.read(buffer)) != -1) {
			bytesum += byteread;
			fs.write(buffer, 0, byteread);
			fs.flush();
		}
		fs.close();
		stream.close();
		return file;
	}

2.关于前端代码

a.修改ajaxfileupload.js

  先到官网下载该插件.

  将源文件的createUploadForm的代码替换如下:

createUploadForm: function(id, fileElementId, data)
		{
			//create form	
	    	var formId = 'jUploadForm' + id;
	    	var fileId = 'jUploadFile' + id;
	    	var form = jQuery('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');	
	    	if (data) {
				for ( var i in data) {
					jQuery(
							'<input type="hidden" name="' + i + '" value="'
									+ data[i] + '" />').appendTo(form);
				}
			}
	    	for (var i = 0; i < fileElementId.length; i ++) {
				var oldElement = jQuery('#' + fileElementId[i]);
				var newElement = jQuery(oldElement).clone();
				jQuery(oldElement).attr('id', fileElementId[i]);
				jQuery(oldElement).attr('name', fileElementId[i]);
				jQuery(oldElement).before(newElement);
				jQuery(oldElement).appendTo(form);
			}
	    	//set attributes
	    	jQuery(form).css('position', 'absolute');
	    	jQuery(form).css('top', '-1200px');
	    	jQuery(form).css('left', '-1200px');
	    	jQuery(form).appendTo('body');
			return form;
	    }
第一步高定

b. 页面代码

html:

<input type="button"  value="添加附件" οnclick="createInput('more');" />
<div id="more"></div>
js:这里可以专门写封装类,以及给file加onchange事件判断文件格式。由于时间有限,未修改
var count = 1;
/**
* 生成多附件上传框
*/
function createInput(parentId){
    count++;
    var str = '<div name="div" ><font style="font-size:12px;">附件</font>'+
    '   '+ '<input type="file" contentEditable="false" id="uploads' + count + '' +
    '" name="uploads'+ count +'" value="" style="width: 220px"/><input type="button"  value="删除" οnclick="removeInput(event)" />'+'</div>';
    document.getElementById(parentId).insertAdjacentHTML("beforeEnd",str);
}
/**
* 删除多附件删除框
*/
function removeInput(evt, parentId){
   var el = evt.target == null ? evt.srcElement : evt.target;
   var div = el.parentNode;
   var cont = document.getElementById(parentId);       
   if(cont.removeChild(div) == null){
    return false;
   }
   return true;
}
下面是2个修改多file用的js,用于显示和删除,可以于上面的合并精简代码:

function addOldFile(data){
	var str = '<div name="div' + data.name + '" ><a href="#" style="text-decoration:none;font-size:12px;color:red;" οnclick="removeOldFile(event,' + data.id + ')">删除</a>'+
    '   ' + data.name + 
    '</div>';
    document.getElementById('oldImg').innerHTML += str;
}

function removeOldFile(evt, id){
    //前端隐藏域,用来确定哪些file被删除,这里需要前端有个隐藏域
    $("#imgIds").val($("#imgIds").val()=="" ? id :($("#imgIds").val() + "," + id));
    var el = evt.target == null ? evt.srcElement : evt.target;
    var div = el.parentNode;
    var cont = document.getElementById('oldImg');    
    if(cont.removeChild(div) == null){
        return false;
    }
    return true;
}
ajax上传文件:
function ajaxFileUploadImg(id){
        //获取file的全部id
        var uplist = $("input[name^=uploads]");
	var arrId = [];
	for (var i=0; i< uplist.length; i++){
	    if(uplist[i].value){
	    	arrId[i] = uplist[i].id;
		}
        }
	$.ajaxFileUpload({
		url:'xxxxx',
		secureuri:false,
		fileElementId: arrId,  //这里不在是以前的id了,要写成数组的形式哦!
		dataType: 'json',
		data: {
                     //需要传输的数据
                },
		success: function (data){
		},
		error: function(data){
		}
	});
}

亲们,一个spingmvc +ajax多文件上传有搞定了,功能很简单,有问题联系本人


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC + ajaxfileupload的多文件上传 的相关文章

  • Java技术栈(跳槽,面试必备)

    Java技术栈 来到北京后 感觉氛围有点浮躁 人员流动性很大 很少有人能沉下心学习 所以最近打算把整理过的知识点拿出来给大家分享下 基础扎实了 无论是工作还是跳槽都很有用 跳槽前将知识点整理成word打印出来 然后背其中的知识点 保证你能面
  • 【渗透测试】常见的数据库

    一 网站暴库漏洞 暴库 就是通过一些技术手段或者程序漏洞得到数据库的地址 并将数据非法下载到本地 黑客非常乐意于这种工作 为什么呢 因为黑客在得到网站数据库后 就能得到网站管理账号 对网站进行破坏与管理 黑客也能通过数据库得到网站用户的隐私
  • GitHub 组织是什么?您应该使用一个吗?

    GitHub 作为一个平台 被个人程序员和大型组织所使用 无论您与多少人一起工作 GitHub Organizations 都为管理多个项目的人员提供了一些不错的工具 GitHub 组织是什么 GitHub Organizations 是
  • 解决linux mysql命令 bash: mysql: command not found 的方法

    解决linux mysql命令 bash mysql command not found 的方法 腾讯云开发者社区 腾讯云 tencent com
  • 服务器的安装与维护技巧——数据湾

    机房服务器的安装与维护是机房管理中的主要任务 安装维护好服务器才能保证服务器正常 安全稳定地运行 才能确保数据的安全 服务器生产的厂家 类型 系列不同其具体的安装维护方法 步骤是有差异的 本文主要以戴尔 DELL 系列服务器为例介绍服务器的
  • 数据结构经典算法集锦

    数据结构经典算法集锦 第2章 线性表 KMP算法 获得next数组 void GetNext char t int next MAX int i 1 j 0 next 1 0 设t 0 中为字符串长度 字符保存在t 1 之后 while i
  • 谈一谈c/c++程序的内存布局

    文章目录 内存布局 文本段 初始化数据段 未初始化数据段 bss 堆区 栈区 如何查看一个程序的内存布局 内存布局 一个C 程序的典型内存布局由以下几部分组成 文本段 初始化数据段 未初始化的数据段 bss 堆区 栈区 文本段 文本段也叫代
  • Golang Http Server源码阅读

    这篇文章出现的理由是业务上需要创建一个Web Server 创建web是所有语言出现必须实现的功能之一了 在nginx fastcgi php广为使用的今天 这里我们不妨使用Go来进行web服务器的搭建 前言 使用Go搭建Web服务器的包有
  • 微信小程序-关于新版隐私协议接口wx.onNeedPrivacyAuthorization getPrivacySetting requirePrivacyAuthorize的适配解读以及实现代码

    代码插件已集成 即插即用 五分钟集成进项目 免费下载 欢迎大家交流 微信小程序用户隐私保护协议弹窗插件下载 官方公告地址 关于小程序隐私保护指引设置的公告 微信开放社区 1 首先看一下这个网址 里边包含涉及到的隐私的接口 这些接口都要适配一
  • MIPS 指令集速查

    MIPS 指令集 共31条 助记符 指令格式 示例 示例含义 操作及其解释 Bit 31 26 25 21 20 16 15 11 10 6 5 0 R type op rs rt rd shamt func add 000000 rs r

随机推荐

  • 泰凌微8258入门指导1-环境搭建

    泰凌微8258入门指导1 环境搭建 第一步 准备工作 1 下载对应SDK包 2 安装jdk环境 2 安装esclipe编译器 3 对SDK进行补丁 4 烧录环境 第一步 准备工作 1 下载对应SDK包 Telink 官网地址 在开发者支持中
  • 命令行清除Redis缓存

    一 打开命令行窗口 打开Redis安装目录下的 redis li exe 二 授权 在打开的命令行里直接操作会提示没有权限 需要先使用auth命令授权 使用方法如下 auth 这里是Redis密码 三 清除缓存 清除缓存有两种方式 清除数据
  • Java 控制结构练习题

    练习1 某人有100 000元 每经过一次路口 需要交费 规则如下 1 当现金 gt 50000时 每次交5 2 当现金 lt 50000时 每次交1000 编程计算该人可以经过多少次路口 要求 使用while break方式完成 publ
  • opencv_contrib-master/modules/xfeatures2d/src/boostdesc.cpp:654:20: fatal error: boostdesc_bgm.i: No

    Hello i have downloaded opencv master and opencv contrib then tried to build opencv contrib using this command cmake DOP
  • Springcloud五大组件

    1 什么是springcloud springcloud是一系列框架的有序集合 它利用springboot的开发便利性巧妙地简化了分布式系统基础设施的开发 如服务发现注册 配置中心 消息总线 负载均衡 断路器 数据监控等 都可以用sprin
  • 提高代码阅读能力的7种方法

    原文 7 Ways to Improve Your Code Reading Skills 作者 A N M Bazlur Rahman 翻译 无阻我飞扬 摘要 随着越来越多的公司使用敏捷开发 能够阅读别人的代码比以往显得更重要 这就需要学
  • Python小项目:利用tkinter开发AI对战井字棋游戏

    文章目录 1 前言 2 代码分模块介绍 2 1 导入需要的库 2 2 定义全局变量 2 2 定义玩家类 2 3 定义页面类 2 4 定义页面变化类以及玩家与AI轮流转换下子权限 2 5 定义判断胜负类 2 6 定义智能AI下子类 3 整体代
  • java util.function.Supplier

    Interface Supplier
  • Java-模板方法设计模式

    Java 模板方法设计模式 1 概念 2 code举例 package p2 public class TemplateTest public static void main String args Template t new SubT
  • Web API-BOM- 操作浏览器

    Window对象 BOM Browser Object Model 是浏览器对象模型 window 对象下包含了 navigator location document history screen 5个属性 即所谓的 BOM 浏览器对象
  • h5手机端及pc端标准文档结构

    pc端
  • 为什么阻抗等于实加虚部呢?为什么有虚部呢,虚部是什么啊?

    为什么阻抗等于实加虚部呢 为什么有虚部呢 虚部是什么啊 2012 09 25 17 16 江山八秀 分类 物理学 浏览372次 提问者采纳 2012 09 25 17 40 电阻用实部表示 电抗用正的虚部表示 电容用负的虚部表示 一个器件的
  • 系列一、Fate简介及基于Docker的单机部署

    一 Fate简介 Fate是一个工业级联邦学习框架 所谓联邦学习指的就是可以联合多方的数据 共同构建一个模型 与传统数据使用方式相比 它不需要聚合各方数据搭建 数据仓库 联邦学习在联合计算建模的过程中 多方机构之间的数据是不会进行共享的 实
  • C++ ofstream和ifstrem

    原文出自 比特网 转载请保留原文链接 http soft chinabyte com database 460 11433960 sh ofstream是从内存到硬盘 ifstream是从硬盘到内存 其实所谓的流缓冲就是内存空间 在C 中
  • 【问题解决】ElasticSearch分页查询时数据顺序错乱/不一致的问题

    问题解决 ElasticSearch分页查询时数据顺序错乱 不一致的问题 问题描述 使用ElasticSearch分页查询时 每次输入同样的分页参数以及查询条件 得到的结果不一致的问题 问题分析 ElasticSearch中索引可能是由多个
  • mysql in 的两种用法

    简述MySQL 的in 的两种用法 他们分别是在 in 关键字后跟一张表 记录集 以及在in后面加上字符串集 先讲后面跟着一张表的 首先阐述三张表的结构 s sno sname sex age dept 学生信息表 c cno cname
  • 并发编程 三 synchronized

    多线程编程中 有可能会出现多个线程同时访问同一个共享 可变资源的情况 这个资源我们称之其为临界资源 这种资源可能是 对象 变量 文件等 由于线程执行的过程是不可控的 所以需要采用同步机制来协同对对象可变状态的访问 实际上 所有的并发模式在解
  • 双线性插值(超级易懂的)

    双线性插值 简介 在两个方向分别进行一次线性插值 首先在一个方向上使用线性插值 然后再在另一个方向上使用线性插值执行双线性插值 尽管每个步骤在采样值和位置上都是线性的 但是插值总体上不是线性的 而是在采样位置上是二次的 作用 一般用于重新采
  • 手把手带你用PyQt5做小型桌面应用

    导语 想制作属于自己的桌面应用程序吗 今天Disen带你手把手入门 桌面应用 什么是桌面应用 即在操作系统的可视化的桌面上 可以运行的程序 比如说QQ 微信 爱奇艺等这些都是桌面应用 早期开发桌面应用 都用哪些语言呢 桌面应用软件 在操作系
  • SpringMVC + ajaxfileupload的多文件上传

    最近做一个springmvc ajax多文件上传 倒腾了下 查阅了部分资料搞定了 现在分享 1 Spring mvc a xml配置