中企动力 > 商学院 > java上传excel到数据库
  • ?

    Java开发工程师如何在Mysql数据库中创建表

    Roxana

    展开

    首先我们需要在数据库中创建两张表用来学习MyBatis对数据库增删改查的使用方法。如果是新安装的数据库可以直接复制我下面的sql进行表创建,如果是已使用中的数据库可能表明会与我的表名冲突,需要创建一个新的database再执行sql,也可以直接删除原来的表,如果表有外键关联需要先解除外键约束再删除。在这里我使用的连接数据库工具为Navicat,相对oracle的有SqlDevloper等。

    DROP TABLE IF EXISTS TableName;

    这个语句是删除表的,如果表名存在就执行删除。

    SET FOREIGN_KEY_CHECKS=0;

    这句sql意思是将mysql中外键检查终止,就是说FOREIGN_KEY_CHECKS=0时,外键约束失效,FOREIGN_KEY_CHECKS=1,外键约束启用。所以为了不影响以后的操作,建议在删除表之后将FOREIGN_KEY_CHECKS=1重新启用外键约束。

    orders表

    接下来我们创建表

    CREATE TABLE `orders` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `user_id` int(11) NOT NULL COMMENT '下单用户id',

    `number` varchar(32) NOT NULL COMMENT '订单号',

    `createtime` datetime NOT NULL COMMENT '创建订单时间',

    `note` varchar(100) DEFAULT NULL COMMENT '备注',

    PRIMARY KEY (`id`),

    KEY `FK_orders_1` (`user_id`),

    CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION

    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

    这是一段数据库脚本,大家将这段复制到sqlPlus或者navicat中执行即可。在正式开发环境中,sql建表语句都不是我们手动写出来的,有很多免费的数据库建模工具如powerdesigner,帮助我们构建数据库模型来自动生成sql语句。非常的方便,Mybatis也有一个非常好用的插件叫做逆向工程,它可以帮我们通过sql脚本而生成对应的java 实体类,是持久层开发人员的神器啊,以后都会讲到。

    create 创建 和 TABLE 表 这两个都是关键字,`orders` 是想要创建的表名,需要用单引号或双引导包起来,后面跟一个括号,括号内包含表内字段和字段的属性,括号内可以为空,那就会单独创建一张空的表。

    `id` int(11) 是一种int类型的名字叫做id的字段,长度为位。比如1111这是四位,如果超过11位就不会显示。int类型可指定字段长度最大为255,非常庞大的数字。 当然也可以不指定它的长度,那么写法就是'id ' int ,唯一区别就是如果指定长度的话,前面有未被使用的位则自动填充0进去,如`id` int(11) ,它的值为11时显示就会是000000000011的形式。

    varchar是一种字符数据类型,相当于java里的String,它的最大长度也是255,它的特点就是如果在括号内指定长度则为指定它的最大长度,如果有多余长度没有被占用的话他会自动根据实际情况来缩短自己长度而节省硬盘空间,虽然几位字符不会有多大,但是生产场景中的数据库中的数据量是非常大的,这是一个非常有价值的特性。另外它的实际长度是字段值得长度+1,在数据库设计时会留出一位专门用来保存它的长度,这也就是为什么能够自动缩短长度的原理。

    datetime 是一种时间格式,与此相关的还有date和timestamp时间戳。那么他们有什么区别呢?

    date:2018-4-22 不带时分秒的

    datetime:相反,则是带时分秒的

    timestamp:时间戳 (1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。)

    COMMENT 关键字是我们为字段解释其含义的内容,后面通常在括号内写入字段的中文意思

    NotNULL表示非空,即该字段永不为空,如果ID这种字段就不可以为空,则为数据类型的默认值也叫作缺省值。

    KEY就是键,多用作的外键,它其实也是一种索引,能够帮助我们快速找到相应字段。

    PRIMARY KEY为主键,主键与Key的区别就是主键通常是唯一的,在mysql中ID多为自增序列,后面在复杂项目也会用到联合主键。而Oracle的主键则是通过另一种方法叫做序列sequence,Oracle没有自增这一说而是每一次增加都是从sequence取出值来放入字段内。这一点很像是Java里面的数据结构队列。

    CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)

    CONSTRAINT 约束,FOREIGN KEY外键,REFERENCES 关联,是为表添加外键约束关联至user表的,字段id下。

    接下来我们为表插入字段的值。

    INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null);

    INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null);

    INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null);

    insert 语句非常简单就不细说了,接下来我们创建另一张表,user表。

    user表

    CREATE TABLE `user` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `username` varchar(32) NOT NULL COMMENT '用户名称',

    `birthday` date DEFAULT NULL COMMENT '生日',

    `sex` char(1) DEFAULT NULL COMMENT '性别',

    `address` varchar(256) DEFAULT NULL COMMENT '地址',

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

    创建user表

    INSERT INTO `user` VALUES ('1', '王五', null, '2', null);

    INSERT INTO `user` VALUES ('10', '张三', '2014-07-10', '1', '北京市');

    INSERT INTO `user` VALUES ('16', '张小明', null, '1', '河南郑州');

    INSERT INTO `user` VALUES ('22', '陈小明', null, '1', '河南郑州');

    INSERT INTO `user` VALUES ('24', '张三丰', null, '1', '河南郑州');

    INSERT INTO `user` VALUES ('25', '陈小明', null, '1', '河南郑州');

    INSERT INTO `user` VALUES ('26', '王五', null, null, null);

    插入字段信息

    大家最好能够按照图片上的自己敲一遍,如果执行失败的话可以复制我的文本进行创建即可。这就是两个关联的表,我们可以使用Mybatis框架对数据库进行增删改查,单表查询或多表查询练习使用。大家有不明白的地方可以下房留言回复,数据库是开发人员的一种硬实力,其中存储过程,视图触发器等对熟悉面向对象的Java程序员都是难啃的骨头,一定要掌握扎实的数据库基础才行。

  • ?

    互联网技术时代——JAVA学习之文件上传与下载

    寄文

    展开

    u文件上传和下载

    u说出几种拦截器,及其作用

    u掌握文件上传和下载

    使用fileUpload完成文件上传

    掌握系统拦截器参数的注入

    实现stream完成文件下载

    文件上传的步骤

    u1.定义Action封装文件、名称、类型属性

    u2.定义表单、添加 enctype="multipart/form-data"

    代码分析定义Action

    public class UploadAction {

    private File file; //表示上传到服务器的文件

    private String fileFileName; //上传文件的文件名

    private String fileContentType; //上传文件的文件类型

    public String execute(){

    try{

    File target = new File("d:\doc\"+fileFileName);

    FileUtils.copyFile(file, target);

    }catch(Exception e){

    }

    return "

    success";

    注意以下 2点:

    1,定义文件属性名,必须与表单文件框的名称一致

    2,定义一个文件属性,必须带两个文件名和文件类型属性,且两个属性的

    命名格式必须xxxFileName,xxxContextType

    有如下上传文件action,定义文件上传属性img,其(1)和(2)正确的是

    private File img; //表示上传到服务器的文件

    private String (1); //上传文件的文件名

    private String (2); //上传文件的文件类型

    选项:

    A, fileFileName 和 fileContentType

    B, fileName 和 contentType

    C, imgfileName 和 imgcontentType

    D, imgFileName 和 imgContentType

    JSP表单分析

    enctype="multipart/form-data">

    注意以下2点:

    1,enctype,表单数据编码类型为二进制传输数据类型,

    2,文件input 的名字要与action中文件属性保持一直

    u建立一个struts251的项目

    u建立一个UpAction.java和up.jsp实现文件上传

    u 指定上传文件时的临时目录,默认使用javax.servlet.context.tempdir

    比如:value="d:\temp"

    u 指定Struts 2文件上传中整个请求内容允许的最大字节数

    文件上传的配置参数

    11 / 16

    上传文件拦截器FileUploadInterceptor

    u

    public class FileUploadInterceptor extends AbstractInterceptor {

    protected Long maximumSize;

    protected Set allowedTypesSet = Collections.emptySet();

    protected Set allowedExtensionsSet = Collections.emptySet();

    1,maximumSize ,允许上传的文件大小

    2,allowedTypes ,允许上传的文件类型比如:image/bmp,image/png,text/plain

    3,allowedExtensions允许上传的扩展名,比如:.jpg,.png

    4,action一定要实现ActionSuppor

    配置使用上传文件拦截器

    text/plain

    /pages/upload_control.jsp

    /pages/finish.jsp

    1, fileUpload 配置文件上传拦截器,加入参数

    2,defaultStack 配置默认拦截器栈,否则很多功能消失。

    3,配置input result ,文件上传拦截器发现非法上传,返回的result

    多文件上传Action

    private[] File file; //表示上传到服务器的文件

    private[] String fileFileName; //上传文件的文件名

    private[] String fileContentType; //上传文件的文件类型

    for(int i=0;i

    FileUtils.copyFile(file[i], target);

    文件下载Action

    public class DownloadAction {

    private InputStream inputStream; //被下载文件输入流

    //seter、geter 方法略

    String localFileName = "11.jpg";

    String localFile = "d:\doc\"+localFileName;

    inputStream = new FileInputStream(localFile );

    fileName = new String(localFileName.getBytes(), "ISO8859-1"

    文件下载配置

    inputStream

    application/octet-stream

    attachment;filename="${fileName} "

    1,result type 为stream

    2,param参数inputName,下载文件来源流,对应action中某个类型的

    inputStream的属性名,该属性必须有getInputStream()方法

    3,contentType 内容类型,和互联网中MIME表中一致

    4,contentDisposition 文件下载的处理方式,包括内联(inline)和

    (attachment),inline浏览器试图直接打开附件,attachment打开对话框。

    打开或保存对话框

    1,IE浏览器可用。其他浏览器不一定。

    2,测试时,打开新的浏览器

    uJSP中,如果是部署的项目某一可用路径下的图片,直接

    使用超链接即可。就像UI设计需要使用图片一样

    u如果不在部署工程路径下,在某一磁盘中,即可使用下载

    图片方式。

    JSP中,嵌入

    "down.action">

    JSP中使用下载图片

    u建立一个DownAction.java实现文件下载

    u增加一个welcome.jsp文件,直接显示下载的图

  • ?

    如何用Java制作一个简单数据库

    卢书竹

    展开

    笔者准备上大二,四月时加入了学院一个为期一年的Hadoop开发研究项目小组,暑假绝对是不可错过的学习时期。由于Hadoop 是由Java 编写的,调用API 最好也是用Java,Java的简单使用因此成为我们小组的必修。

    我们选择的教材是《Thinking in Java》(Bruce Eckel)和网课《Java4android》(Mars老师)。悄悄告诉你,我《Thinking in Java》截稿时才看了不到200页。

    制作一个简单数据库是 《Java4android》中Mars老师留下的作业。我花了三天半完成,700+行。(代码太长,就不一一贴出来了,文末有跳转查看和下载地址)

    学习是一个输入和输出的过程,这篇文章就当作我Java入门的奠基,同时可以帮助初学者理解Java这门语言的使用,也欢迎参照这个小项目练练手。

    ---------------------------------------------------

    笔者的这个数据库是基于文本文件的读写储存,原理比较简单。

    数据库命令: 首先,数据库有四大基本功能:增删改查(add/delete/update/query),我为了使用方便,在设定这四个命令的同时,增加了“列出全部(show)”和“退出(quit)”。

    数据库成员: 数据库每个成员有五个值:与

    命令格式:

    ADD

    DELETE

    UPDATE

    QUERY

    SHOW

    QUIT

    程序文件纵览:(已展开展示成员与方法)

    程序类文件图:(使用Eclipse的Modelgoon插件反向制作UML)

    程序关系图:

    (我知道挺乱●﹏●)

    程序文件各类的作用分析:

    Main:显示欢迎界面、调用MainLooper的loop()方法(程序主循环)。

    MainLooper:程序主循环、从Input的getInputLine()方法获得命令输入、把输入的字符串传给CheckCmd的check()方法、如果传去check()的值为”QUIT”则跳出循环。

    Input:bufferedReader.getInputLine()方法中,调用java.io.BufferedReader的readLine()方法读取整行字符串返回。

    Data.txt:存放数据库的文件。

    Eng.properties:存放用户交互界面(UI)提示

    IOProperty(截图里打错了):利用java.util.Properties的load(InputStreaminStream)方法,读取储存文件键值对。

    UserInterface:提供获取UI提示的方法。

    User:方便获得、暂存、修改、统一输出成员的值。

    UsefulMethod:(实用方法)专门在代码重构时新增的类,供使用的类继承,意在统一管理常用的6个方法。分别是:1、反馈命令成功执行 2、判断字符串是否为数字 3、判断成员的数值value是否符合要求 4、判断新增成员key是否重复 5、把数据库储存文件的内容按照id排序(选择排序法) 6、消除String[]中的null。

    CheckCmd:使用String的.split(“ ”)方法拆分命令,检查判断输入命令,若无语法问题即进行相应操作,否则报错。

    Action:根据CheckCmd的调用进行相应的操作实现数据库功能。

    WriteFile:根据调用的参数把字符串添加或覆盖写入文件。

    QueryFile:showAll()方法返回数据库所有的内容,query(inttypeIndex, int operIndex, String args) 根据参数进行相应的搜索,返回所有符合条件的成员。

    命令实现详析:

    ADD

    actAdd(String[] strs):可添加前提:命令长度为6、成员数值value和性别合规、key不重复。否则根据不符的要求相应显示提示。

    actAdd(String[] strs):new一个User类,放入成员值,用writeFile.write(user.toString(),true)添加到文件尾部,并执行一次sortData()(文件全内容按id排序)。

    DELETE

    checkDelete(String[] strs):前提:命令长度为2。判断命令参数是否为id(isNumberic(Stringstr)),并输入到actDELETE()。

    actDelete(String[] strs, boolean isId):调用queryFile.showAll()获得文件全部内容并存在String[]中。根据isId循环检索对应key,成立便跳出,把对应字符串赋为””空字符串,并复写在文件上。

    UPDATE(设计仅支持salary修改)

    checkUpdate(String[] strs):前提:命令长度为4、命令第2部分是salary。判断命令参数是否为id,并输入到actUPDATE()

    actUpdate(String[] strs, boolean isId):与DELETE类似,调用queryFile.showAll()获得文件全部内容并存在String[]中。根据isId循环检索对应key,成立便跳出,把对应成员值放在一个user成员内,并修改成员salary值,再复写在文件上。

    QUERY

    checkQuery(String[] strs):前提:命令长度为4。根据type index{0.

    actQuery(int typeIndex, int operIndex, Stringargs):调用queryFile.query(typeIndex, operIndex, args)获取结果并循环输出结果。

    query(int typeIndex, int operIndex, Stringargs) :把简化的情况分别检索。思想挺简单,逻辑容易乱,代码也多。

    SHOW

    checkShow(String[] strs):前提:命令长度为1。直接调用actShow(String[]strs)。

    actShow(String[] strs):调用queryFile.showAll()获取全部内容并循环输出。

    QUIT

    checkQuit():输出“谢谢使用”,并返回-1至MainLooper,跳出循环,程序终结。

    Data.txt截图:

    Eng.properties截图:

    运行效果:(注:亮绿色为键盘输入)

    ------------------------------------------------------

    至此,我把我数据库的结构与实现方式大概展现出来了。

    但正如我们的精神领袖Linus Torvalds所说的“Talk is cheap, show me the code.”说多无益,想要自己有大长进,就要多看优秀代码,同时自己多写代码。

    在此我放出链接:

    直接看代码链接:Java简单数据库 源码展示

    下载链接:http://pan.baidu/s/1dE82FJF 密码:jyq0

    (包含源码和可运行jar)

    欢迎找BUG。

    感谢Bruce Eckel 和 Mars老师。

    谢谢各位看看官。

  • ?

    如何把excel数据导入navicat

    吉青文

    展开

    在导出的Excel表中,手动的录入一些数据,然后将这个表导入到数据库中。

    步骤1:运行【导入向导】,选择导入数据的类型

    步骤2:选择文件数据源

    步骤3:跳过。

    步骤4:给源文件定义一些附加选项,前三个选项一定要填写正确,否则将不能完成正确的导入。

           [栏位名行]:数据表字段所在的行位置

           [第一个数据行]:导入的数据表中源数据是从第几行开始的

           [最后一个数据行]:导入的数据表中源数据是从第几行结束的

    步骤5:选择目标表,也可以新建一个表

    步骤6:定义源栏位和目标栏位的对应关系,如果目标栏位设置了主键,在这一步中一定要勾选,否则也将无法正常导入数据

    步骤7:选择导入模式,如果是新表,选择第一项。可以根据具体情况选择不同的选项。这里选择第三项。

    步骤8:点击【开始】执行导入命令

    执行完之后,去数据库验证一下:

    (本文内容由百度知道网友茗童贡献)

  • ?

    Java -- 大文件分片上传后台的处理

    安露

    展开

    关注我的人都成为了月薪5w以上的技术大牛

    问题:

    js上传文件时文件太大导致的上传失败,到底多大会上传失败没测试过(因为我测试上传了一个10G文件失败了)。原因猜测很多,可能和post之类的网络协议有关,可能和后台某些设置有关。

    思路:

    思路挺简单的,因为前台上传使用的 Web Uploader,一个百度的插件,文档里清清楚楚写着有一个multiple属性,设置成true开启分片上传,听名字就知道可以用来上传大文件,我想断点续传之类的应该都是用这个做的吧。嘛,我的需求没那么复杂,能上传就行。然后重点是后台。 分片上传后台的接收,网上很多帖子的做法是用RandomAccessFile获取到文件,然后把文件下标(不知道怎么形容好)移到文件最后,然后把分片上传的数据写入到后面。 然后我遇见的问题有两个,一个一个遇见的。。1.分片上传他是速度很快的发送数据,然后tomcat应该会为每个请求分配不同的线程,所以有多线程问题(比如第一个请求正在写数据还没写完第二个请求就把文件拿过去接着写了)。2.分片上传因为是请求,所以顺序是不能保证的,每次都在文件最后开始写入会出现文件损坏。(eg:一个文件叫做"123",现在把文件拆分成"1","2","3"。分三次请求发送给服务器,服务器的接收顺序可能是321,132。这样会造成文件损坏)。

    解决:

    问题1:一开始在网上找资料发现有个叫文件锁的东西可以用,可是报了一个错,网上管管这个错误是因为线程一获取了文件锁,在线程一没有释放的时候线程二去获取这个锁就会抛出异常。囧。我理解的锁难道不该是线程二没获取到锁应该就等着线程一释放再去获取嘛,直接抛出异常是什么鬼。嘛,不想这么多,直接给拼接方法那里加个 synchronized 关键字就好了。这样大小起码看起来是正常了(虽然这样做并没有什么卵用)。 问题2:这个是最蛋疼的,测试的时候发现压缩包文件在这样上传后会出现文件损坏,想了很久还是经过同事提醒才认识到这个问题。知道问题,思路就可以有很多了,位置不对放对位置就好了嘛。我的思路是多看了下uploader这个插件,分片上传时给把文件大小,分片总数,当前分片数都传给你。然后根据这个些参数在设置文件大小,根绝当前分片数移动到对应位置写入数据就好了。这样写上边问题1加上的 synchronized 关键字去掉也可以。

    好程序员特训营自2014年开班至今,一直立志培养高薪,高能,高 职的程序员人才,截至目前,好程序员学员就业均薪1万3以上,学员薪资最高达到2万9千元。现开设Html5、JavaEE、大数据、Android等高端精品课程,40人小班教学保证高品质,坚持100%全程面授。

    大数据1704期开班日期12月18日, 通过考试后享受5000元学费报名优惠 。

    好程序员,从平凡到卓越,为梦想而拼搏!

  • ?

    Java框架的配置文件如何导入约束?以MyBatis为例

    雪清爽

    展开

    首先你得有一个数据库,Mysql,Oracle,SqlServer其中任意一种都可以。这里以Mysql为例。

    在项目中搭建框架除了下载好框架之外,在写代码之前还需要完成框架的配置工作。MyBatis这个框架是基于JDBC的,所以你在学习之前最好了解JDBC是怎么回事。用法上基本相同。JDBC需要的配置这里都会用到。

    首先我们创建一个SqlMapConfig.xml ,这个xml包含了MyBatis所有的全局配置,在这里可以配置它的运行环境。说一下这个配置文件是固定的,大家可以去看一下源码,当框架运行第一步首先就会加载这个xml文件,如果找不到就会启动失败。

    新建xml文件,名字固定为SqlMapC

    OK理论上当你创建好之后是这个样子的,就是一个空的xml文件。如果你使用过其他框架应该知道,配置文件中需要加入框架的DTD约束,这个约束可以帮助我们在eclipse自动补全和提示框架的标签。

    创建好配置文件

    OK现在大家将下面到之尖括号中内容复制到XML中,如下图所示。

    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

    "http://mybatis.org/dtd/mybatis-3-config.dtd">

    加入框架约束

    加入之后我按Ctrl+/ ,会自动提示 configuration标签,它是框架的根标签,所以内容写在<里面。

    完成约束可自动补全标签

    刚刚发生了一件很讨厌的事情,我在configuration里面没有自动提示我里面的标签。是什么原因呢,我这种导入约束的方式 是需要联网的,可能刚才联的是国外的网,过了好一会才出来。就是说SqlMapConfig.xml需要去读 这个DTD 文件,除了填写它的网络位置外,还可以填写它在你机器上的物理位置。看到了吗在你的框架源码中的Builder.xml包里。如果你不能上网 下面教你引入它的物理路径,让SqlMapCinfig直接去读取本地的DTD文件。

    DTD约束文件路径

    在Eclipse找到这个位置,打开windows -> Preference -> XML -> XML Catalog -> 选择右边栏中的 Add 按钮,-> Key Type 选择 URI,Key 中粘贴 刚才DTD的一段URL路径

    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

    "http://mybatis.org/dtd/mybatis-3-config.dtd">

    -> 然后点击 File System

    点击A

    FileSystem选择你 框架里的DTD在Windows中的路径,说实话这个真挺麻烦的,因为你必须先找到这个jar包位置,然后进去找到DTD的位置。大家也看到我的,我用 maven下载的MyBatis框架,所以它在我的Maven仓库下。教你们个简单方法,DTD可以在网上下载的,或者你进Maven仓库把它复制出来到一个新建文件夹,这样路径会短一点。随便你们,这个事情不是重点,相信你们已经明白了 FileSystem要的就是这个DTD文件的位置。

    DTD文件在Windows下的绝对路径

    弄好之后你再configuration下按ctrl+/ 现在下图画面就表示成功了

    此图为约束导入成功

    OK各位试试看吧,SSM.SSH框架整合的时候也是需要导入约束的,有什么不明白的地方可以下方回复哦,都会一一解答的。

  • ?

    Java文件上传与下载【面试+工作】

    代云

    展开

    Java实现文件上传与下载【面试+工作】

    1.servlet 如何实现文件的上传和下载?

    1.1上传文件

    通过前台选择文件,然后将资源上传到(即新建一个文件)到发布的资源文件下面,下载就是url 到发布的资源文件,触发即可自动下载。服务器已经封装了如何下载的底层实现。(此处用的是tomcat)JSP上传文件方法: 关于在HTTP request 中通过Post方法提交文件的规范,该项目性能稳定快速,易于部署和使用.本次教程以前端jsp + 后端 servlet的方式,利用JSP上传文件,你也可以完全在jsp中实现而不用servlet.

    在开始JSP上传文件之前你要准备以下几个东西:

    1. commons-FileUpload 1.3 包

    下载地址:http://jakarta.apache.org/commons/fileupload/

    2. commons-IO 2.5 包

    下载地址:http://jakarta.apache.org/commons/io/

    有了上面这些东西我们就可以开始了

    1. 新建一个叫Servlet_UploadDownLoad的WEB项目

    2. 接着把这两个jar包放到WEB-INF/lib目录中:

    3.接下来我们要准备一份如下内容的upload.jsp文件,用来选择要上传的文件,

    上面文件中有几个需要注意的地方就是

    1. action="UploadServlet" 必须和后面的web.xml配置文件中对servlet映射必须保持一致.

    2. method="POST" 这里必须为"POST"方式提交不能是"GET".

    3. enctype="multipart/form-data" 这里是要提交的内容格式,表示你要提交的是数据流,而不是普通的表单文本.

    4. file1,file2,file3表示你要3个文件一起上传,你也可以一次只上传一个文件.

    接下来我们要写一个与上面这个upload.jsp配套的servlet程序,就叫做UploadServlet.java

    upload.jsp文件有了,配套的servlet也有了,现在最后剩下的就是怎么让它们配合工作了,接着我们把WEB-INF/web.xml文件请出来,并在该文件中加入以下内容:

    写好以后再点击"保存"

    把你的upload项目整个拷贝到tomcat的webapps目录下,启动tomcat.打开IE浏览器在地址栏中输入http://localhost:8080/Servlet_UploadDownLoad/upload.jsp怎么样看到JSP上传文件的输入框了吗? 什么,没有看到,出错了! 你仔细检查一下步骤有没有对.

    好了,现在我们点击页面上的"浏览"按钮,找到我们要上传的文件,最后点击"Submit",太激动了,还不看一下你的I:\\updir里面有没有你要的东西.

    1.2下载文件

    1)通过超链接实现下载

    在HTML网页中,通过超链接链接到要下载的文件的地址:downloadOne.jsp

    "/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip"是文件路径,程序结构如下图:

    程序运行后,可以通过单击需要下载文档实现下载

    但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。

    这是因为通过超链接下载文件时,如果浏览器可以识别该文件格式,浏览器就会直接打开。只有浏览器不能识别该文件格式的时候,才会实现下载。

    因此利用第二种方法实现下载功能。

    2)通过Servlet程序实现下载

    通过Servlet下载文件的原理是通过servlet读取目标程序,将资源返回客户端。

    downloadTwo.jsp

    其中,/Servlet_UploadDownLoad 是servlet程序的映射路径

    然后新建一个servlet,名称为ServletDownload,URL映射为/ServletDownload

    web.xml :

    ServletDownload.java :

    重启tomcat服务器,即可实现对压缩包和对图片的下载。

    2、struts如何实现文件的上传和下载?

    2.1struts上传文件

    先新建web project ,然后Add Struts Capabilties

    struts.xml 的配置:

    upload.jsp :

    表单中enctype="multipart/form-data"的意思,是设置表单的MIME 编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;

    只有使用了multipart /form-data,才能完整的传递文件数据,进行下面的操作. enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去。

    theme="simple"是struts2 的一个最简单的主题,这样你的标签就生成最简单的HTML元素 不会生成额外的内容

    【这里的name一定要与action类里面的name名字一致,set/get】

    success.jsp

    web.xml

    UploadAction.java

    Upload.java

    mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下:

    new File("/tmp/one/two/three").mkdirs();

    执行后, 会建立tmp/one/two/three四级目录

    new File("/tmp/one/two/three").mkdir();

    则不会建立任何目录, 因为找不到/tmp/one/two目录, 结果返回false

    例子的代码结构:2.2struts下载文件

    方法一:通过配置struts.xml文件

    DownloadAction.java

    struts.xml

    1.结果类型必须要写成 type="stream" ,与之对应的处理类是 org.apache.struts2.dispatcher.StreamResult

    2.涉及到的参数:

    1)attachment;fileName="${fileName}"

    contentDisposition默认是 inline(内联的), 比如说下载的文件是文本类型的,就直接在网页上打开,不能直接打开的才会打开下载框自己选择

    2) attachment :下载时会打开下载框

    3) fileName="${fileName}" :在这定义的名字是一个动态的,该名字是显示在下载框上的文件名字

    3.DownloadFile,这个DownloadFile名字要和DownloadAction.java类中的getDownloadFile()方法名去掉get 一致

    Struts2下载文件实现的说明

    contentType

    内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片

    inputName

    下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法

    contentDisposition

    文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:

    attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline;filename="struts2.txt"

    bufferSize

    下载缓冲区的大小

    downloadOne.jsp

    例子的代码结构:

    方法二:通过配置java文件来实现下载

    DownloadByJavaAction.java

    downloadByJava.jsp

    struts.xml

    3、批量下载

    使用多线程并发调用单个文件的下载方法即可。

    4、断点续传

    有待研究。。。。。。。。。。

    附件源码:

    链接: https:///s/1i6wo58L 密码: 3t3m

    springMVC文件上传

    文件上传是项目开发中最常见的功能。为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。 一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。 Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。而Spring MVC则提供了更简单的封装。 Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。 本项目作为测试案例,在此我就不创建Maven项目了,我直接创建的是一个Dynamic Web Project(动态的web项目),采用Tomcat 8作为web服务器,我们需要在项目中引入以下jar包,如下图:

    下面我们在WebContent/WEB-INF下创建一个content文件夹,用于放文件的上传、下载等jsp文件,下面我们创建uploadForm.jsp文件,演示Spring MVC的文件上传:

    负责上传文件的表单和一般表单有一些区别,负责上传文件的表单的编码类型必须是“multipart/form-data”。 我们再src下创建一个包“cn.edu.jseti.controller”,然后创建一个FileUploadController类,用于实现文件的上传和下载功能。以下是负责上传文件的表单功能代码:

    Spring MVC会将上传的文件绑定到MultipartFile对象中。MultipartFile提供了获取上传文件内容、文件名等方法。通过transferTo()方法还可以将文件存储到硬件中,MultipartFile对象中的常用方法如下:

    byte[] getBytes():获取文件数据String getContentType[]:获取文件MIME类型,如image/jpeg等InputStream getInputStream():获取文件流String getName():获取表单中文件组件的名字String getOriginalFilename():获取上传文件的原名Long getSize():获取文件的字节大小,单位为byteboolean isEmpty():是否有上传文件void transferTo(File dest):将上传文件保存到一个目录文件中SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver。在springmvc-config.xml进行配置文件如下:

    部署FileUpload这个Web应用,在浏览器中输入如下URL来测试应用: http://localhost:8088/FileUpload/uploadForm输入文件描述信息并选择上传文件,如下图:

    点上传按钮,这是已将上传的文件通过二进制保存到web服务器上去了,如下图:

    使用对象接收上传文件

    上面我们通过案例演示了Spring MVC上传文件,接下来,我们演示使用对象接收上传文件。 在实际项目的开发中,很多时候上传的文件会作为对象的属性被保存。SpringMVC的处理也非常的简单。 下面我们在content文件夹创建registerForm.jsp文件,演示接收文件上传:

    我们在src下面创建一个名叫“cn.edu.jseti.domain”包,然后再创建一个User类,必须要实现序列化接口,如下案例代码:

    我们在刚才创建的FileUploadController类继续写用于接收文件的上传和下载功能。以下是负责接收文件的表单功能代码:

    在content文件夹下创建userInfo.jsp文件,该页面主要是文件的下载页面,如下jsp代码:

    在浏览器中输入如下URL来测试应用: http://localhost:8088/FileUpload/registerForm输入用户名并上传刚才上传的文件。如下图:

    单击“注册”按钮上传文件,然后就会跳转到下载页面。如下图:

    文件下载

    上面我们通过案例演示了使用对象接收上传文件,接下来,我们演示Spring MVC的下载文件。 文件下载比较简单,直接在页面给出了一个超链接,该链接href的属性等于要下载文件的文件名,就可以实现文件下载了。但是如果该文件的文件名为中文文件名,在某些早起的浏览器上就会导致下载失败;如果使用最新的Firefox、Chrome、Opera、Safari则都可以正常下载文件名为中文的文件了。 SpringMVC提供了一个ResponseEntity类型,使用它可以很方便地定义返回的HttpHeaders和HttpStatus。以下代码演示文件的下载功能:

    download处理方法接收页面传递的文件名filename后,使用Apache Commons FileUpload组件的FileUtils读取项目的上传文件,并将其构建成ResponseEntity对象返回客户端下载。 使用ResponseEntity对象,可以很方便的定义返回的HttpHeaders和HttpStatus。上面代码中的MediaType,代表的是Internet Media Type,即互联网媒体类型,也叫做MIME类型。在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。HttpStatus类型代表的是Http协议中的状态。有关MediaType和HttpStatus类可以参考Spring MVC的API文档。 点击下载页面的超链接,显示文件正在下载,如下图所示:

    单击“浏览”按钮,可以选择下载文件的保存路径,然后单击“确定”按钮,文件就会顺利的下载并保存。

    本文中的一些功能案例代码和配置文件不是很完整,下面附上完整代码: FileUploadController类完整的代码如下:

    文件上传成功的jsp代码:

    文件上传失败的jsp代码:

    web.xml的配置文件:

    OK,以上就是完整的使用Spring MVC框架实现了文件的上传和下载。

  • ?

    FasfDFS整合Java实现文件上传下载

    凝丹

    展开

    在上一篇的文章中已经整合了Nginx和FastDFS : FastDFS安装和配置,整合Nginx-1.13.3

    今天使用Java代码实现文件的上传和下载。对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中。或者在Maven项目pom.xml文件中添加依赖

    当完成以上操作之后可以添加链接FastDFS服务器的配置文件 fastdfs-client.properties

    因为项目中只使用properties 格式文件,如果需要更多的配置信息,可以查看官方的配置信息

    注: 1. 其他的配置项为可选,fastdfs.tracker_servers 为必须选项

    2. 多个tracker_servers可以使用逗号“ , ”分隔

    当出现上面和配置文件一致的输出结果时候,说明加载配置文件已经成功。

    由于是使用Junit做测试,为了方便在开始执行之前,初始化配置文件和获取连接,同时没有捕获异常全部抛出

    注: 如果出现连接超时异常:java.SocketTimeoutException: connect timed out

    1 .查看服务器地址和端口是否正确

    2 .请查看服务器TrackerServer和StorageServer服务端口是否开启。默认为22122和23000

    下面是执行结果

    已经将图片上传到服务器,同时返回了图片地址。那么通过这个地址试试能否访问

    OK,在浏览器输入地址后,成功返回了图片信息

    这里通过storageClient下载文件,然后将数据存储到本地。如果通过浏览器下载,同理将数据写入文件即可

    下面是执行结果,不出意外是可以成功执行的

    以下是执行结果,获取到的数据和上传的数据一样

    输出结果

    当数据测试完整之后,试试能否删除吧

    删除之后输出结果为0,如果出现非0结果,那么返回的是错误代码

    以上是Java实现上传下载等功能的代码,如果需要可以封装成工具类使用。

    整篇博文到此为止,不足之处请多多指正。

  • ?

    整理关于java写入内容到excel的例子供大家参考

    占凝天

    展开

    1POI jar简介

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    2POI jar下载

    poi下载地址:https://apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.tar.gz

    下载之后把压缩包解压,然后在项目里面引用解压文件夹里面的jar

    3新建ReadExcelTest java project,引入poi相关jar

    4创建一个WriteExcel java类,编写代码,写入excel里面

    package test;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.OutputStream;

    import java.util.ArrayList;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import org.apache.poi.hssf.usermodel.HSSFWorkbook;

    import org.apache.poi.ss.usermodel.Cell;

    import org.apache.poi.ss.usermodel.Row;

    import org.apache.poi.ss.usermodel.Sheet;

    import org.apache.poi.ss.usermodel.Workbook;

    import org.apache.poi.xssf.usermodel.XSSFWorkbook;

    public class WriteExcel {

    private static final String EXCEL_XLS = "xls";

    private static final String EXCEL_XLSX = "xlsx";

    @SuppressWarnings("rawtypes")

    public static void writeExcel(List> dataList, int cloumnCount,

    String finalXlsxPath) {

    OutputStream out = null;

    try {

    // 获取总列数

    int columnNumCount = cloumnCount;

    // 读取Excel文档

    File finalXlsxFile = new File(finalXlsxPath);

    Workbook workBook = getWorkbok(finalXlsxFile);

    // sheet 对应一个工作页

    Sheet sheet = workBook.getSheetAt(0);

    /**

    * 删除原有数据,除了属性列

    */

    int rowNumber = sheet.getLastRowNum(); // 第一行从0开始算

    System.out.println("原始数据总行数,除属性列:" + rowNumber);

    for (int i = 1; i <= rowNumber; i++) {

    Row row = sheet.getRow(i);

    sheet.removeRow(row);

    }

    // 创建文件输出流,输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效

    out = new FileOutputStream(finalXlsxPath);

    workBook.write(out);

    * 往Excel中写新数据

    for (int j = 0; j < dataList.size(); j++) {

    // 创建一行:从第二行开始,跳过属性列

    Row row = sheet.createRow(j + 1);

    // 得到要插入的每一条记录

    Map dataMap = dataList.get(j);

    String name = dataMap.get("title_id").toString();

    String address = dataMap.get("title_name").toString();

    String phone = dataMap.get("title_name_en").toString();

    for (int k = 0; k <= columnNumCount; k++) {

    // 在一行内循环

    Cell first = row.createCell(0);

    first.setCellValue(name);

    Cell second = row.createCell(1);

    second.setCellValue(address);

    Cell third = row.createCell(2);

    third.setCellValue(phone);

    // 创建文件输出流,准备输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    if (out != null) {

    out.flush();

    out.close();

    } catch (IOException e) {

    System.out.println("数据汇入成功");

    * 判断Excel的版本,获取Workbook

    *

    * @param in

    * @param filename

    * @return

    * @throws IOException

    public static Workbook getWorkbok(File file) throws IOException {

    Workbook wb = null;

    FileInputStream in = new FileInputStream(file);

    if (file.getName().endsWith(EXCEL_XLS)) { // Excel 2003

    wb = new HSSFWorkbook(in);

    } else if (file.getName().endsWith(EXCEL_XLSX)) { // Excel 2007/2010

    wb = new XSSFWorkbook(in);

    return wb;

    * @param args

    public static void main(String[] args) {

    List> mapList = new ArrayList>();

    for(int k=0; k<100;k++){

    Map map = new HashMap();

    map.put("title_id", "title_id"+k);

    map.put("title_name", "title_name"+k);

    map.put("title_name_en", "title_name_en"+k);

    mapList.add(map);

    writeExcel(mapList, mapList.size(), "D:/360bizhi/readExcel.xlsx");

    5运行main进行测试,查看写入结果

    写入结果和预期是一样的,说明写入成功

    请大家多多关注我的头条号,谢谢大家

  • ?

    Java实现文件批量导入导出实例(兼容xls,xlsx)

    代芙

    展开

    1、介绍

    java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下。

    目前我所接触过的导入导出技术主要有POI和iReport,poi主要作为一些数据批量导入数据库,iReport做报表导出。另外还有jxl类似poi的方式,不过貌似很久没跟新了,2007之后的office好像也不支持,这里就不说了。

    2、POI使用详解

    2.1 什么是Apache POI?

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    2.2 POI的jar包导入

    本次讲解使用maven工程,jar包版本使用poi-3.14和poi-ooxml-3.14。目前最新的版本是3.16。因为3.15以后相关api有更新,部分操作可能不一样,大家注意下。

    2.3 POI的API讲解

    2.3.1 结构

    HSSF - 提供读写Microsoft Excel格式档案的功能。XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能。

    2.3.2 对象

    本文主要介绍HSSF和XSSF两种组件,简单的讲HSSF用来操作Office 2007版本前excel.xls文件,XSSF用来操作Office 2007版本后的excel.xlsx文件,注意二者的后缀是不一样的。

    HSSF在org.apache.poi.hssf.usermodel包中。它实现了Workbook 接口,用于Excel文件中的.xls格式

    常用组件:HSSFWorkbook excel的文档对象HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾(只有打印的时候才能看到效果)样式:HSSFCellStyle cell样式辅助操作包括:HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表

    XSSF在org.apache.xssf.usemodel包,并实现Workbook接口,用于Excel文件中的.xlsx格式

    常用组件:XSSFWorkbook excel的文档对象XSSFSheet excel的表单XSSFRow excel的行XSSFCell excel的格子单元XSSFFont excel字体XSSFDataFormat 日期格式和HSSF类似;

    2.3.3 两个组件共同的字段类型描述

    其实两个组件就是针对excel的两种格式,大部分的操作都是相同的。

    2.3.4 操作步骤

    以HSSF为例,XSSF操作相同。

    首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。

    3、代码操作

    3.1 效果图

    惯例,贴代码前先看效果图

    Excel文件两种格式各一个:

    代码结构:

    导入后:(我导入了两遍,没做校验)

    导出效果:

    3.2 代码详解

    这里我以Spring+SpringMVC+Mybatis为基础

    Controller:

    Service

    3.3 导出文件api补充

    大家可以看到上面service的代码只是最基本的导出。

    在实际应用中导出的Excel文件往往需要阅读和打印的,这就需要对输出的Excel文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。

    3.3.1 单元格合并

    使用HSSFSheet的addMergedRegion()方法

    参数CellRangeAddress 表示合并的区域,构造方法如下:依次表示起始行,截至行,起始列, 截至列

    3.3.2 设置单元格的行高和列宽

    3.3.3 设置单元格样式

    1、创建HSSFCellStyle

    2、设置样式

    3、将样式应用于单元格

    3.3.4设置字体样式

    1、创建HSSFFont对象(调用HSSFWorkbook 的createFont方法)

    2、设置字体各种样式

    3、将字体设置到单元格样式

    大家可以看出用poi导出文件还是比较麻烦的,等下次在为大家介绍下irport的方法。

    导出的api基本上就是这些,最后也希望上文对大家能有所帮助。

    学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群495273252,我们一起学Java!

java上传excel到数据库

所有视频需要登录后,才能观看

请先登录您的帐号,即可完整播放,如果您尚未注册帐号,请先点击注册。

img

在线咨询

建站在线咨询

img

微信咨询

扫一扫添加
动力姐姐微信

img
img

TOP