现在在学习JFinal,学到了文件上传的功能, 在API中是这样说的:
文件上传:
Controller 提供了 getFile 系列方法支持文件上传。特别注意:如果客户端请求为 multipart request(form 表单使用了 enctype="multipart/form-data"),那么必须先调用 getFile 系列方法才 能使 getPara 系列方法正常工作,因为 multipart request 需要通过 getFile 系列方法解析请求体中 的数据,包括参数。
文件默认上传至项目根路径下的 upload 子路径之下,该路径称为文件上传基础路径。可以 在 JFinalConfig.configConstant(Constants me)方法中通过 me.setBaseUploadPath(baseUploadPath) 设置文件上传基础路径,该路径参数接受以”/”打头或者以 windows 磁盘盘符打头的绝对路径, 即可将基础路径指向项目根径之外,方便单机多实例部署。当该路径参数设置为相对路径时, 则是以项目根为基础的相对路径。
也就是说:如果不设置上传路径的话;默认的是在webapp的目录下建一个upload文件夹就可以了,但是这样一来,如果项目需要重新部署等操作的话上传的文件就没有了, 所以我们还是自己新建一个上传的路径
我是在userController里进行上传的, 先给大家看下我的项目结构:
我是在idea里搭建的项目,用的是maven仓库,首先看下maven仓库里的配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>boKeDemo</groupId>
<artifactId>BoKeDemo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>BoKeDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 配置jetty运行环境 -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jetty-server</artifactId>
<version>8.1.8</version>
</dependency>
<dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-jsp</artifactId><version>9.2.15.v20160210</version></dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>cos</artifactId>
<version>26Dec2008</version>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 阿里巴巴数据连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<!-- c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
</dependencies>
<build>
<finalName>BoKeDemo</finalName>
</build>
</project>
接下来是Service实现层的代码:
package com.demo.service;
import java.io.*;
import java.nio.channels.FileChannel;
/**
* 上传文件
* Created by T430 on 2017/5/15.
*/
public class FileService {
/**
* 上传文件
* @param s 上传的文件
* @param t 需要保存的文件路径地址
*/
public void fileChannelCopy(File s, File t){
FileInputStream fis=null;
FileOutputStream fos=null;
FileChannel in =null;
FileChannel out = null;
try {
fis=new FileInputStream(s);//输入流
fos = new FileOutputStream(t);//输出流
in = fis.getChannel();//得到对应文件通道
out =fos.getChannel();//得到输出对应的文件通道
in.transferTo(0,in.size(),out);//链接两个通道,并且从in通道读取,然后写入out通道。
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (null != fis) fis.close();
if (null != fos) fos.close();;
if (null != in) in.close();
if (null != out) out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这些写完后,就可以在UserController里写上传的方法了:
/**
* 上传文件
*/
public void upLoad(){
UploadFile uploadFile = this.getFile();//获取文件
String fileName = uploadFile.getOriginalFileName();//获取文件名
String type= fileName.substring(fileName.lastIndexOf("."));//获取文件的类型格式:JPG、png等类型
File file = uploadFile.getFile();
FileService fs= new FileService();
File t = new File("E:\\"+ UUID.randomUUID().toString()+type);
try {
t.createNewFile();//创建新的文件夹
} catch (IOException e) {
e.printStackTrace();
}
fs.fileChannelCopy(file,t);//上传的文件,和要保存的文件路径
file.delete();//上传过后,删除缓存文件
this.renderHtml("success,<a href=\"admin-index.jsp\">back</a>");
}
最后看下jsp里的代码:需要注意的是 上传文件的话 一定要写上: enctype="multipart/form-data" , 不然会报错哦
<form action="/user/upLoad" enctype="multipart/form-data" method="post">
<input type="file" name="file"></br>
<input type="submit" value="提交">
</form>
到此为止,JFinal的上传文件就结束了,大家可以去试下了。