自备忘一个
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> </label> <input value="提交" type="submit"> </div> </fieldset>
add.html
<#include "/common/_layout.html" /> <@layout> <h1>文件管理 ---> 上传文件 </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>文件管理 <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;"> <a href="/wenjian/delete/${x.id}">删除</a> <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` ( ìdì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 (ìd`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;