文件下载:
先在后端准备好action,可以是一个通用的文件下载action,也可以是为每一个或每一类文件下载准备一个action,并在此 action 中使用一下 renderFile(...),此方法中的参数一般由页面传过来的参数决定,也可能是通过传过来的参数去数据库中去查询要下载的文件名。代码可能是这样的:
public void download() {
renderFile(Db.queryStr("select file_name from downloads where id=?", getPara()));
}
然后在页面,直接用url指向该action即可,如 <a href="/download/123">JFinal手册下载</a>
追问:
<a href="/download/123">如果条件有多个,后面怎么写,有可能为空的,比如关键字搜索,另外用ajax能实现这功能吗?
如果有参数就直接在后天添加参数,比如::<a href="/download/123?name=${user.name}&age=${user.age}">,至于空值,在后台判断哈
----------------------------------------Hello World 的分割线--------------------------------------
文件上传:JFinal Controller中提供了 getFile(...)与getFiles(...)系列方法,其中参数最全的两个方法如下:
public UploadFile getFile(String parameterName, String saveDirectory, Integer maxPostSize, String encoding)
public List<UploadFile> getFiles(String saveDirectory, Integer maxPostSize, String encoding)
除了以上两个方法以外,其它方法全是使用默认参数对这两个方法的转调,所以会用这两个方法足以。
parameterName是指在表单中file表单域的名称,saveDirectory是指文件保有存路径,maxPostSize是指文件最大长度,encoding是指文件编码。
getFile(...)系列方法获取单个文件上传,getFiles(...)获取多文件上传。
如果需要使用getPara(..)系列方法,则需要先调用getFile或getFiles系列方法之一,因为multipart request的解析是在调用本系列方法时解析的。
文件上传支持需要cos-26Dec2008.jar这个包,此包在JFinal发行包中有提供。另外还需要在上传表单中设置enctype="multipart/form-data"。
JFinal文件上传与struts有不同之处,struts是将上传的文件先缓存到临时目录中,然后让开发者处理,通常是将文件移动或copy,而JFinal采用更加高效的方式,可以在上传后直接保存到目标目录下。
总结JFinal处理文件上传,只需两件事:一是将cos-26Dec2008.jar包引入,二是在Controller中调用getFile或getFiles方法.
------------------关于文件名的讨论:上传上去的文件名在html 页面中的 <input type="file" name="这里定义"。 JFinal 在后台能获取到,并能能改名 :)
UploadFile file = getFile(); 得到文件的时候吗, 文件已经在服务器的硬盘上了。
暂时没实现这功能,如果要实现,我打算也是给 UploadFile 加一个方法叫 renameTo(...),这样灵活性更高 :)
---------------------------个例:
/**
* FileUploadController 接收上传的文件
*/
public class FileUploadController extends Controller {
private final int MAXSize = 50 * 1024 * 1024; // 50M
private String filedir=PathKit.getWebRootPath() + "\\upload\\uservideo\\";//指定用户训练视频文件上传路径
/**
* 接收上传的文件
* 注意:前提是lib中引入cos-26Dec2008.jar包
*/
public void upload() {
// TODO Auto-generated method stub
try {
// UploadFile upFile = getFile();//单个上传文件一句搞定 默认路径是 upload
// UploadFile upFile = getFile("FILE", filedir, maxSize, "utf-8");//只用于表单提交方式, 单个上传文件
List<UploadFile> upFiles = getFiles(filedir, MAXSize, "utf-8");//批量上传文件
for (UploadFile fileItem : upFiles) {
String fPath=filedir+fileItem.getOriginalFileName();
System.out.println("上传fPath"+fPath);
String newPath=filedir+fileItem.getOriginalFileName().replace(".", "1.");//例如:交叉接触动作1.3gp
File oldFile=new File(fPath);
File newFile=new File(newPath);
if(newFile.exists()){
System.out.println("-------------删除"+fileItem.getOriginalFileName());
//删除旧的
oldFile.delete();
//新的重命名
boolean updateName=newFile.renameTo(oldFile);
System.out.println("-------------updateName:"+updateName);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
renderJson("status", "0");//失败
}
renderJson("status", "1");//成功
}
}
需要在 renderJson("status", "0");//失败 行下加return返回,否则失败了最终还是返回 1 成功。