文档章节

JFinal 文件上传下载

lewjun072
 lewjun072
发布于 2014/06/06 18:55
字数 881
阅读 620
收藏 3
点赞 1
评论 3

自备忘一个

1、加入 JAR 包

以 JFinal 官方提供的 jfinal_demo 实例为基础。

首先在 lib 目录下加入 cos-26Dec2008.jar 包,和文件操作辅助包 commons-io-2.4.jar(这里要

用到 byte[] org.apache.commons.io.IOUtils.toByteArray(InputStream input) throws IOException

和 void org.apache.commons.io.IOUtils.write(byte[] data, OutputStream output) throws

IOException)。

2、加入前端页面

添加文件“WebRoot\wenjian\_form.html、

WebRoot\wenjian\add.html、WebRoot\wenjian\wenjian.html”。

_form.html

<fieldset class="solid">
<legend>上传文件</legend>
<div>
<label>保存位置</label>
<label><input type="radio" name="wenjian.bcwz"
value="DB" checked="checked" />DB</label>
<label><input type="radio" name="wenjian.bcwz"
value="FILE" />FILE</label>
</div>
<div>
<label>文件</label>
<input type="file" name="wenjian.file" />
</div>
<div>
<label>&nbsp;</label>
<input value="提交" type="submit">
</div>
</fieldset>

add.html

<#include "/common/_layout.html" />
<@layout>
<h1>文件管理 ---&gt; 上传文件
</h1>
<div class="form_box">
<form action="/wenjian/save" method="post"
enctype="multipart/form-data">
<#include "_form.html" />
</form>
</div>
</@layout>

wenjian.html

<#include "/common/_layout.html"/>
<@layout>
<h1>文件管理&nbsp;&nbsp;
<a href="/wenjian/add">创建文件</a>
</h1>
<div class="table_box">
<table class="list">
<tbody>
<tr>
<th width="4%">id</th>
<th width="35%">标题</th>
<th width="12%">操作</th>
</tr>
<#list wenjianPage.getList() as x>
<tr>
<td style="text-align:left;">${x.id}</td>
<td style="text-align:left;">${x.title}</td>
<td style="text-align:left;">
&nbsp;&nbsp;<a
href="/wenjian/delete/${x.id}">删除</a>
&nbsp;&nbsp;<a
href="/wenjian/download/${x.id}">下载</a>
</td>
</tr>
</#list>
</tbody>
</table>
<#include "/common/_paginate.html" />
<@paginate currentPage=wenjianPage.pageNumber
totalPage=wenjianPage.totalPage actionUrl="/wenjian/" />
</div>
</@layout>

3、添加后台文件

Wenjian.java

package com.demo.wenjian;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
/*
mysql> desc wenjian;
+-------+--------------+------+-----+---------+----------
------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------
------+
| id | int(11) | NO | PRI | NULL | auto_increment
|
| title | varchar(255) | NO | | NULL | |
| size | varchar(255) | NO | | NULL | |
| file | longblob | YES | | NULL | |
| bcwz | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------
------+
5 rows in set
mysql>
*/
public class Wenjian extends Model<Wenjian> {
private static final long serialVersionUID = -745596151448052489L;
public static final Wenjian dao = new Wenjian();
public Page<Wenjian> paginate(int pageNumber, int pageSize) {
return paginate(pageNumber, pageSize, "select id, title ", "from wenjian order by id asc");
}
}

WenjianController.java

package com.demo.wenjian;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
import org.apache.commons.io.IOUtils;
import com.jfinal.core.Controller;
import com.jfinal.upload.UploadFile;
public class WenjianController extends Controller {
public void index() {
setAttr("wenjianPage",
Wenjian.dao.paginate(getParaToInt(0, 1), 10));
render("wenjian.html");
}
public void add() {
}
/**
* 文件上传
*/
public void save() {
//
UploadFile uf = getFile();// 注意在有文件上传时,getFile一定要放在第一行处理,至少要放在getPara系列方法之前。否则出现的问题可能检查不出来。
UploadFile uf = getFile("wenjian.file", "f");// 将会在指定的文件夹下创建f文件夹,然后创建文件
String title = uf.getFileName();
Long length = uf.getFile().length();
System.out.println(uf.getSaveDirectory() +File.separator + uf.getFileName());
System.out.println( uf.getOriginalFileName() );//getOriginalFileName 和 getFileName的区别是,前者获得的是文件原本的文件名,后者获取的是处理过的文件名
//System.out.println( PathKit.getWebRootPath() );//
String bcwz = getPara("wenjian.bcwz");
System.out.println(bcwz);
if("DB".equals(bcwz)) {
try {
new Wenjian().set("title", title).set("size",length).set("file", IOUtils.toByteArray(newFileInputStream(uf.getFile()))).save();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
new Wenjian().set("title", title).set("size", length).set("file", null).set("bcwz",uf.getSaveDirectory() + File.separator + uf.getFileName()).save();
}
redirect("/wenjian");
}
public void delete() {
Wenjian.dao.deleteById(getParaToInt());
redirect("/wenjian");
}
/**
* 文件下载
*/
public void download() {
Wenjian wenjian =
Wenjian.dao.findById(getParaToInt());
String bcwz = wenjian.get("bcwz");
if(bcwz == null || bcwz.trim().length() == 0) {// 来自数据库
byte[] bfile = wenjian.getBytes("file");
String title = wenjian.get("title");
File file = null;
OutputStream output = null;
try {
file = File.createTempFile(UUID.randomUUID().toString(), title);
} catch (IOException e) {
e.printStackTrace();
}
try {
output = new FileOutputStream(file);
IOUtils.write(bfile, output);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
renderFile(file);
return;
} else {// 来自文件
renderFile(new File(bcwz));
return;
}
}
}

4、配置 DemoConfig.java

/**
* 配置常量
*/
public void configConstant(Constants me) {
// 加载少量必要配置,随后可用getProperty(...)获取值
loadPropertyFile("a_little_config.txt");
me.setDevMode(getPropertyToBoolean("devMode", false));
me.setUploadedFileSaveDirectory(File.separator +
"uploadFiles" + File.separator);// 设定文件保存 位置。默认是项目下的upload,因为项目是部署在D盘下的一个目录下的,所以这将在D盘下。保存在固定文件夹下-> me.setUploadedFileSaveDirectory("C:" + File.separator+ "uploadFiles" + File.separator);
}
/**
* 配置路由
*/
public void configRoute(Routes me) {
me.add("/wenjian", WenjianController.class);
}
/**
* 配置插件
*/
public void configPlugin(Plugins me) {
arp.addMapping("wenjian", Wenjian.class); // 映射wenjian 表到 Wenjian模型
}

5、添加表

CREATE TABLE `wenjian` (
&igrave;d&igrave;nt(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`size` varchar(255) NOT NULL,
`file` longblob,
`bcwz` varchar(255) DEFAULT NULL,
PRIMARY KEY (&igrave;d`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;




© 著作权归作者所有

共有 人打赏支持
lewjun072
粉丝 0
博文 2
码字总数 926
作品 0
成都
加载中

评论(3)

ordinance
ordinance
请问代码中的两个uf是什么意思?
lewjun072
lewjun072

引用来自“JFinal”的评论

感谢分享,顶一个 79
JFinal
JFinal
感谢分享,顶一个 79
JFinal 3.4 发布,将极速贯彻到 UI 层

jfinal 的终极目标是全面实现软件开发整个过程的极速开发,极大提升开发效率,极大降低学习成本,极大提升开发体验 jfinal 诞生头五年,已实现 WEB + ORM + AOP 层面的极速开发,赢得了大量开...

JFinal ⋅ 04/28 ⋅ 129

JAVA 极速WEB+ORM框架 - JFinal

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、p...

JFinal ⋅ 2012/03/18 ⋅ 496

基于注释自动生成 API 文档 - Regan API

Regan API 前言 Regan API 项目是基于注释自动生成api文档,很大缩短了开始与后期维护API接口文档的时间。 Regan API 利用jdk提供的Doclet 类读取文档注释,可手动配置需要读取的文件,同时增...

Jeff_Regan ⋅ 06/15 ⋅ 0

JFinal(1.6)在Validator里执行过getFile,在Controller里取不到文件

JFinal在Validator里执行过getFile之后Validator中是可以取到文件及有关信息,但是在Controller里取不到文件,是不是我的姿势不正确?@JFinal

车开源 ⋅ 05/15 ⋅ 0

kiplinglee/jfinal-ioc-plugin

jfinal-ioc-plugin JFinal 依赖注入插件 1.在JFinalConfig文件中配置IOC插件 @Overridepublic void configConstant(Constants me) { // 创建controller实现依赖注入me.setControllerFactory......

kiplinglee ⋅ 04/13 ⋅ 0

JFinal 1.6可以无缝升级到最高哪个版本?

大约在JFinal 1.6的时候做了一个项目,一直运行至今。中途没升级也没做功能扩展,时至今日,需要做功能升级了,但是时隔太久远,基本不记得JFinal这个框架一路过来的升级过程了。所以想请求帮...

车开源 ⋅ 05/11 ⋅ 0

JFinal如何使用JNDI连接数据库

想用JNDI的方式连接数据库,但是JFinal中用的是DruidPlugin和ActiveRecordPlugin,没有看到用DataSource的地方?请问JFinal支持JNDI连接方式吗?怎么具体实现?...

zqq3436 ⋅ 06/11 ⋅ 0

Jboot v1.4.9 发布,核心 JFinal 升级到 3.4 最新版本

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 05/03 ⋅ 0

jfinal兼容oracle integer字段

为什么oracle integer字段用了number(3,0),jfinal生成的字段还是BigDecimal @jfinal

tianxia007 ⋅ 05/02 ⋅ 0

jfinal-admin 3.2 发布,beetl 模板升级到 2.7.14

jfinal-admin 3.2 版本正式发布啦。 基于JFinal的后台管理系统,采用了简洁强大的JFinal作为web框架,模板引擎用的是beetl,数据库用mysql,前端bootstrap框架。 演示地址 http://jad.yxyun...

IT小香猪 ⋅ 04/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

骰子游戏代码开源地址

因为阿里云现在服务器已经停用了,所以上面的配置已经失效。 服务端开源地址:https://gitee.com/goalya/chat4.git 客户端开源地址:https://gitee.com/goalya/client4.git 具体运行界面请参考...

算法之名 ⋅ 37分钟前 ⋅ 0

设计模式--装饰者模式

装饰者模式 定义 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 通用类图 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比...

gaob2001 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部