AjaxSubmit+Servlet表单文件上传和下载

一、背景

前段时间公司要求我做一个上传和下载固件的页面,以备硬件产品在线升级,现在我把这部分功能抽取出来作为一个Demo Project给大家分享。

话不多说,先看项目演示 --> 演示  源码

二、源码

前端

js库:jquery-3.2.1.min.js,jquery.form.js(异步表单提交),jsviews.min.js(模板渲染)

jsviews科普:jsviews是实现MVVM的js库,分为JsRender(渲染),JsViews(数据视图双向绑定),JsObservable (数据监听),有兴趣的同学可以去官网了解,这里只用到了渲染的功能。

1、下载页面 index.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>ajaxSubmit上传</title><link rel="shortcut icon" href="images/favicon.ico"><link rel="Bookmark" href="images/favicon.ico"><link rel="stylesheet" href="css/index.css" /><script type="text/javascript" src="js/jquery-3.2.1.min.js"></script><script type="text/javascript" src="js/jquery.form.js"></script><script type="text/javascript" src="js/jsviews.min.js"></script><script type="text/javascript" src="js/common.js"></script></head>
<body>
<h1>上传下载Demo</h1>
<h2>1、上传文件</h2>
<form id="addForm"><div><span>选择类型:</span><select name="code" id="code"><option value="0">普通开关</option><option value="1">插座</option></select></div><div><span>选择文件(小于5k):</span><input type="file" id="file" name="file"></div><div><button type="button" id="addConfirm" name="addConfirm">确定</button></div>
</form>
<h2>2、测试上传结果</h2>
<table id="tbBody">
<thead>
<tr><td>类型</td><td>文件名</td><td>通过Servlet下载</td></tr>
</thead>
</table>
</body>
<script type="text/javascript" src="js/index.js"></script>
<!--  jsviews模板 -->
<script id="listTmpl" type="text/x-jsrender"><tr><td>{^{if code=='0'}}普通开关{{else code=='1'}}插座{{else}}数据错误{{/if}}</td><td>{{:fileName}}</td><td><a href="fileDownload?fileName={{:fileName}}">urlServlet</a></td></tr>
</script>
</html>

2、公共js js/common.js

//获取链接参数
function getQueryString(name)
{var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");var r = window.location.search.substr(1).match(reg);if(r!=null)return  unescape(r[2]); return null;
}

 3、 js/index.js

//提交表单
function addSubmit(){var options={url: "fileUpload",type:'post',            datatype:'json',success: function (data) {var result = JSON.parse(data);if(result.code == "0000"){var pageBarTmpl = $.templates("#listTmpl");var html = pageBarTmpl.render(result.content);$("#tbBody").append(html);}else{alert(result.desc);}    }}$("#addForm").ajaxSubmit(options); 
}
//提交前检查
function submitCheck(){var code = $("#code").val();if (!code) {alert("请选择类型");return false;}var file = $("#file").val();if (!file) {alert("请选择需要上传的固件");return false;}return true;}
//按钮触发
$("#addConfirm").click(function(){if(submitCheck())addSubmit();
});

4、css/index.css

table th,table td{ border:1px solid black;
} 
form div{margin:5px;
}

 后端

使用到了commons-fileupload-1.3.1.jar,commons-io-2.4.jar以及gson-2.6.2.jar

1、返回结果类  RspResult.java

/*** 返回结果类* @author zhang**/
public class RspResult{private String code; //返回码private String desc; //返回描述private Map<String,Object> content;  //返回内容public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}public Map<String, Object> getContent() {return content;}public void setContent(Map<String, Object> content) {this.content = content;}}

2、自定义异常类  MyException.java

/*** 自定义异常* @author zhang**/
public class MyException extends Exception{private static final long serialVersionUID = 3075956744530570774L;private String code;  //错误码private String desc;  //描述public MyException(String code, String desc) {super();this.code = code;this.desc = desc;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;} 
}

3、文件上传Servlet  FileUpload.java

/*** 文件上传类* 使用commons-fileupload工具包解析表单内容,捕获自定义异常* @author zhang**/
public class FileUpload extends HttpServlet{private static final long serialVersionUID = -4700695646596658600L;private static final String SAVE_LOCATION = "/home/www/download/blog/ajaxUpload/"; //保存地址
@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException {resp.setCharacterEncoding("UTF-8");RspResult result = new RspResult();result.setCode("0000");result.setDesc("success");try {DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);upload.setFileSizeMax( 5*1024 ); //单个文件最大上传大小为5kupload.setSizeMax( 5*1024 );     //设置全部文件最大上传总大小为5kupload.setHeaderEncoding("utf-8");  //设置编码
            List<FileItem> fileItems = upload.parseRequest(req);Iterator<FileItem> iterator = fileItems.iterator();Map<String, Object> rspConent = new HashMap<>();DiskFileItem fileItem = null;//循环读取表单数据while (iterator.hasNext()) {FileItem item = iterator.next();if (!item.isFormField()) { //是否为文件类型,因为只有一个文件,所以单个引用就行fileItem = (DiskFileItem) item;}else {rspConent.put(item.getFieldName(), item.getString());}}if(fileItem == null)throw new MyException("0001","无选择文件");String fileName = fileItem.getName();fileItem.write(new File(SAVE_LOCATION + fileName));rspConent.put("fileName", fileName);result.setContent(rspConent);} catch (FileUploadException e ) {result.setCode("0001");result.setDesc("文件上传大小为5k");e.printStackTrace();} catch (MyException e ) {  //取得自定义异常结果
            result.setCode(e.getCode());result.setDesc(e.getDesc());} catch (Exception e) {result.setCode("0001");result.setDesc("未知错误");e.printStackTrace();}finally {PrintWriter out = null;try {out = resp.getWriter();} catch (IOException e) {e.printStackTrace();}out.write(new Gson().toJson(result));}}
}

4、文件下载Servlet  FileDownload.java

/*** 文件下载类,读取文件,以字节流形式写到response* @author admin**/
public class FileDownload extends HttpServlet
{    private static final long serialVersionUID = -9135576688701595777L;private final String SAVE_LOCATION = "/home/www/download/blog/ajaxUpload/"; @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException {InputStream in  = null;try {String fileName = req.getParameter("fileName");in  = new FileInputStream(SAVE_LOCATION+fileName);// 设置输出格式resp.setCharacterEncoding("utf-8");resp.addHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");// 读取数据byte[] b = new byte[100];int len = 0;while ((len = in.read(b)) > 0)resp.getOutputStream().write(b, 0, len);} catch (UnsupportedEncodingException e2) {e2.printStackTrace();} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if(in != null)in.close();} catch (IOException e) {e.printStackTrace();}}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}}

配置

1、项目配置  web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>upload-download-demo</display-name><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list><servlet><servlet-name>fileUpload</servlet-name><servlet-class>com.yuejia.servlet.FileUpload</servlet-class></servlet><servlet-mapping><servlet-name>fileUpload</servlet-name><url-pattern>/fileUpload</url-pattern></servlet-mapping><servlet><servlet-name>fileDownload</servlet-name><servlet-class>com.yuejia.servlet.FileDownload</servlet-class></servlet><servlet-mapping><servlet-name>fileDownload</servlet-name><url-pattern>/fileDownload</url-pattern></servlet-mapping>
</web-app>

2、tomcat配置url支持utf-8  server.xml

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

三、总结

本Demo适合一次性上传小文件,多数情况下需要先上传文件再进行表单提交,视需求而定。

在保存文件建议在文件名后面加上时间戳,保证同名文件不会被覆盖。

以上!

转载于:https://www.cnblogs.com/zhangyuejia/p/8532200.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

番石榴的EventBus –简单的发布者/订阅者

在查看Google的Guava Libraries 版本10的最新版本时&#xff0c;我注意到EventBus的添加。 这是发布-订阅样式消息传递系统的轻量级实现。 这类似于JMS提供的发布-订阅模型&#xff0c;但是消息保留在应用程序内&#xff0c;而不是在外部广播。 EventBus允许您在程序中创建对象…

apscheduler -定时任务

https://apscheduler.readthedocs.io/en/latest/userguide.html 简单的使用方式为&#xff1a; from apscheduler.schedulers.blocking import BlockingScheduler sched BlockingScheduler()sched.add_job(ff_task,cron,hour0-1,8-23,minute28)sched.add_job(avor_task, cron,…

java迭代器 异常_java迭代器失效 | 学步园

今天在测试代码的时候出现一个异常ConcurrentModificationException&#xff0c;该异常网上很多解决方案以及解释&#xff0c;但我还是再记录一遍吧。代码抽象出来是这样的&#xff1a;import java.util.ArrayList;import java.util.List;public class Test {public static voi…

CSS3中的圆角边框属性详解(border-radius属性)

实例向 div 元素添加圆角边框&#xff1a;div{border:2px solid;border-radius:25px;}页面底部有更多实例。浏览器支持IEFirefoxChromeSafariOperaIE9 、Firefox 4 、Chrome、Safari 5 以及 Opera 支持 border-radius 属性。定义和用法border-radius 属性是一个简写属性&#x…

83.const与类

const常量对象,无法改变数据,只能引用尾部带const方法类的成员如果是const,可以默认初始化,也可以构造的初始化,不可在构造函数内部初始化类中的const成员,无法直接修改,可以间接修改类的成员函数const三种情形:1.返回值const,2.返回常量,3.参数const,可读不可写,尾部const,常量…

使用Apache CXF开发RESTful服务

介绍 如您所知&#xff0c;有两种开发Web服务的方法 简单对象访问协议&#xff08;SOAP&#xff09; 代表性状态转移&#xff08;REST&#xff09; 在继续学习如何使用Apache CXF创建基于REST的Web服务之前&#xff0c;我们将了解什么是REST。 REST不是一项技术&#xff0c;…

CTU 2017 J - Punching Power (二分图匹配)

题意&#xff1a; 公园管理层最终决定在公园的各个战略位置安装一些流行的拳击机。实际上&#xff0c;为了弥补以前缺少的机器&#xff0c;他们决定安装尽可能多的机器。令人惊讶的是&#xff0c;公园不会被新机器堵塞&#xff0c;因为对于机器的位置存在一些非常严重的法律限制…

UI设计师必知:link和@import引用css文件方法的区别

<link>元素所参考的样式用户可以自由的选择加以改变&#xff0c;而导入的样式表单就自动的与剩下的样式表融合在一起了CSS与HTML文档结合的4中方法&#xff1a;1 使用<link>元素链接到外部的样式文件2 在<head>元素中使用"style"元素来指定3 使用C…

javascript mqtt 发布订阅消息

js client使用paho-mqtt&#xff0c;官网地址&#xff1a;http://www.eclipse.org/paho/&#xff0c;参考http://www.eclipse.org/paho/clients/js/官网给出例子Getting Started&#xff0c;写出下面简单的测试代码。 <!DOCTYPE html> <html> <head> <met…

linux java jar war_简单介绍Java 的JAR包、EAR包、WAR包区别

WAR包WAR(Web Archive file)网络应用程序文件&#xff0c;是与平台无关的文件格式&#xff0c;它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程&#xff0c;都是打成WAR包进行发布的。War是一个web模块&#xff0c;其中需要包括WEB-INF&#xff0…

Spring Web应用程序的最大缺陷

在其应用程序中使用Spring Framework的开发人员很好地谈论了依赖注入的好处。 不幸的是&#xff0c;他们并不是很好地利用它的好处&#xff0c;例如单一负责的原则和在应用程序中关注点的分离 。 如果我们看一下任何基于Spring的Web应用程序&#xff0c;很可能会通过使用以下常…

用C++调用tensorflow在python下训练好的模型(centos7)

本文主要参考博客https://blog.csdn.net/luoyexuge/article/details/80399265 [1] bazel安装参考:https://blog.csdn.net/luoyi131420/article/details/78585989 [2] 首先介绍下自己的环境是centos7&#xff0c;tensorflow版本是1.7&#xff0c;python是3.6&#xff08;anacond…

纯CSS实现圆角边框

HTML部分&#xff1a;<body><div> <b class”t1″></b> <b class”t2″></b> <b class”t3″></b> <b class”t4″></b> <div class”cont”>这边输入实际内容</div> <b clas…

ActiveMQ producer同步/异步发送消息

http://activemq.apache.org/async-sends.html producer发送消息有同步和异步两种模式&#xff0c;可以通过代码配置&#xff1a; ((ActiveMQConnection)connection).setUseAsyncSend(true); producer默认是异步发送消息。在没有开启事务的情况下&#xff0c;producer发送持久化…

Java Priority Queue(PriorityQueue)示例

我们知道&#xff0c; 队列如下&#xff1a;F irst- 我正˚First-UT模型&#xff0c;但有时我们需要处理的基础上&#xff0c;优先级队列中的对象。 例如&#xff0c;假设我们有一个应用程序可以为日常交易生成股票报告&#xff0c;并处理大量数据并花费时间来处理它。 因此&am…

css未知尺寸的图片的水平和垂直居中

纯CSS实现未知尺寸的图片水平和垂直居中.box { /*非IE的主流浏览器识别的垂直居中的方法*/ display: table-cell; vertical-align:middle; /*设置水平居中*/ text-align:center; /* 针对IE的Hack */ *display: block; *font-size:26…

heap 的一些用法

noip 合并果子 #include<bits/stdc.h> using namespace std; int heap[maxn]; int size0; void input(int d) {heap[size]d;push_heap(heap,heapsize,greater<int>()); } int get() {pop_heap(heap,heapsize,greater<int>());//pop_heap(heap,heapsize);ret…

java 反射 new class_Java高级特性-反射:不写死在代码,还怎么 new 对象?

反射是 Java 的一个高级特性&#xff0c;大量用在各种开源框架上。在开源框架中&#xff0c;往往以同一套算法&#xff0c;来应对不同的数据结构。比如&#xff0c;Spring 的依赖注入&#xff0c;我们不用自己 new 对象了&#xff0c;这工作交给 Spring 去做。然而&#xff0c;…

EF Core利用Scaffold从根据数据库生成代码

在EF6 之前的时代&#xff0c;如果需要从数据库中生成代码&#xff0c;是可以直接在界面上操作的&#xff0c;而到了EF Core的时代&#xff0c;操作方式又有更简便的方式了&#xff0c;我们只需要记住以下这条指令。 Scaffold-DbContext "Server服务器地址;Database数据库…

如何通过CSS开启硬件加速来提高网站性能

你知道我们可以在浏览器中用css开启硬件加速&#xff0c;使GPU (Graphics Processing Unit) 发挥功能&#xff0c;从而提升性能吗&#xff1f; 现在大多数电脑的显卡都支持硬件加速。鉴于此&#xff0c;我们可以发挥GPU的力量&#xff0c;从而使我们的网站或应用表现的更为流畅…