文档章节

JFinal 文件上传下载

lewjun072
 lewjun072
发布于 2014/06/06 18:55
字数 881
阅读 650
收藏 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极速开发实战教程新鲜出炉~

JFinal极速开发实战教程新鲜出炉~ [持续更新中...] JFinal框架让 IT 工程师发挥更大的潜能,实现更大价值,同时也希望 JFinal 工具力量能帮助正在创业的朋友们提升效率、降低成本从而实现创业...

山东-小木
2015/01/07
0
13
JFinal处理文件上传应该注意的问题

JFinal处理文件上传的时候,保存文件什么的都没有问题。需要注意的地方就是你保存好了文件,打算返回Json格式的数据的时候注意了: setAttr("xxx", xxx);setAttr("xxx", xxx);renderJson();或...

无聊的人们啊
2012/04/17
0
6
分享JFinal中renderFile方法中文文件名乱码问题的解决办法

最近在一直在使用JFinal进行web项目的开发工作,使用起来感觉非常之方便效率,不愧是名为急速WEB开发框架,呵呵! 废话不说,进入正题。项目开发过程中经常遇到文件的上传于下载,JFinal中提...

htoman
2013/02/01
0
3
jfinal框架增加微信jsapi支持

部分手机在图片上传的时候,调取不到sd卡相册或其他图片,为了解决这个兼容性问题,同一个页面使用了两种图片上传方案。 html5 :图片编码成base64 ,发送到后台,解码存储。这种方法用于解决...

YangTao
2015/05/29
0
0
OSC上关于Jfinal的提问整理(一)

看见Jfinal很火,就手痒痒了,想学一下,无奈入门较慢,没有找到比较全的文档。于是就经常看讨论区大家的提问与解答。后来就忽然萌生了整理下来的想法。其中的问题如果是@Jfinal 回答的,那我...

木川瓦兹
2013/04/23
0
21

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之声明合并(二)

转发 TypeScript基础入门之声明合并(二) 声明合并 合并命名空间 与接口类似,同名的命名空间也将合并其成员。 由于名称空间同时创建了名称空间和值,因此我们需要了解它们是如何合并的。 要合...

durban
22分钟前
0
0
centos7系统安装sersync+rsync实现服务器同步功能

centos7系统安装sersync+rsync实现服务器同步功能 MQ_douer0人评论21708人阅读2017-04-08 15:49:03 一、为什么要用sersync+rsync架构? 1、sersync是基于inotify开发的,类似于inotify-tools...

linjin200
23分钟前
1
0
Windows下安装phpRedis扩展

Windows下安装phpRedis扩展 通常在做PHP程序测试时,会用到Redis。而一般测试都是在Windows下进行的,所以需要在Windows环境下安装phpRedis扩展,用以支持php对Redis的访问。 工具/原料 php调...

梦梦阁
28分钟前
1
0
HTTPConnectionPool(host:XX)Max retries exceeded with url 解决方法

HTTPConnectionPool(host:XX)Max retries exceeded with url 解决方法 在做双十一压测时,高并发调用requests时报错.问题解决方法 问题原因 是因为在每次数据传输前客户端要和服务器建立TCP...

_Change_
32分钟前
0
0
iosdfgh

复制 IO流 (***** 了解 *****) 1.1 概述 之前我们学习了 File 类,这个类中有很多操作文件本身的方法, File类它只能操作文件或文件夹,并不能去访问文件中的数据。真正保存数据的是文件,数据...

码农屌丝
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部