【阅读本文前提】
您了解Nutz框架(刚刚接触Nutz,对此还不熟悉),想要使用Nutz的文件池和上传功能;
想实现一个上传文件或者图片的功能。
【正文】
1.怎么在项目中使用Nutz框架,这里就不说了,具体可查看:
http://code.google.com/p/nutz/wiki/nutz_preface?tm=6
2.前台
上传图片(我这里是实现的上传图片的功能)的前台页面代码:
注意:
上传页面的表单,action="addPhoto.action",这里的 addPhoto.action 的后缀是什么无所谓(原因查看Nutz框架的文档),addPhoto 是上传图片的入口函数。
enctype="multipart/form-data" ,这个必须要写的,不解释。
3.配置文件
为了实现上传图片的功能,我使用了Nutz自带的上传适配器:UploadAdaptor,使用了ioc的方式(怎么配置ioc,这里就不说了),具体配置文件如下:
ioc文件夹下,添加一个名称为 myUpload.js 的文件(名称无所谓,随便起),里面的内容如下:
var myUploadIoc = { utils : { type : 'com.mm.util.MyUtils', fields : { sc : {app:'$servlet'} // 将 ServletContext 对象注入 MyUtils } }, tmpFilePool : { type : 'org.nutz.filepool.NutFilePool', // 临时文件最大个数为 1000 个 args : [ {java:'$utils.getPath("/tmp")'}, 1000 ] }, uploadPicFileContext : { type : 'org.nutz.mvc.upload.UploadingContext', singleton : false, args : [ { refer : 'tmpFilePool' } ], fields : { // 是否忽略空文件, 默认为 false ignoreNull : true, // 单个文件最大尺寸(大约的值,单位为字节,即 1048576 为 1M) maxFileSize : 1048576, // 正则表达式匹配可以支持的文件名 nameFilter : '^(.+[.])(gif|jpg|png)$' } }, myPicUpload : { type : 'org.nutz.mvc.upload.UploadAdaptor', singleton : false, args : [ { refer : 'uploadPicFileContext' } ] } };
注意:
com.mm.util.MyUtils 是自己定义的一个工具类,为了得到上传地址,内容如下:
package com.mm.util;
import javax.servlet.ServletContext;
/**
* 用于上传ioc : myUpload.js
*
*/
public class MyUtils {
private ServletContext sc;
public String getPath(String path) {
return sc.getRealPath(path);
}
}
tmpFilePool 是Nutz的文件池;
java:'$utils.getPath("/tmp")' 这个是指明了上传的图片的地址是:项目根目录下的tmp目录下;
gif|jpg|png 限制了上传文件的格式。
4.后台代码
其实就是上传模块的入口函数代码:
/**
* 添加照片
* @param albumId 相册ID
* @param req
*/
@At("/photo/pho/addPhoto")
@Ok("fm:/common/execute_result.ftl")
@AdaptBy(type = UploadAdaptor.class, args = { "ioc:myPicUpload" })
public void addPhoto(@Param("..")NutMap nm,HttpServletRequest req){
//log.info("NutMap:"+nm);
TempFile tf = (TempFile)nm.get("photoFile");
File f = tf.getFile();
//FieldMeta meta = tf.getMeta();
//String oldName = meta.getFileLocalName();
//log.info("文件绝对路径:"+f.getAbsolutePath()+",原来的名称:"+oldName);
String str = f.getPath();
int one = str.indexOf(Constants.UPLOAD_FILE_DIRECTORY_NAME);
str = str.substring(one);
//log.info("文件的相对路径:"+str);
long albumId = (long)nm.getInt("albumId");
String photoName = (String)nm.get("photoName");
String description = (String)nm.get("description");
Photo photo = new Photo();
photo.setAlbumId(albumId);
photo.setPhotoName(photoName);
photo.setDescription(description);
photo.setCreateDate(TimeUtil.getNowTime("yyyy-MM-dd"));
// photo.setPhotoUrl(f.getAbsolutePath());
photo.setPhotoUrl(str);
getServiceManager().getPhotoService().insert(photo);
setExecuteResult(null);
addMessage("添加照片成功!");
addRedirURL("返回", "@back");
addRedirURL("照片列表", "photoList.html?albumId="+String.valueOf(albumId));
req.setAttribute(EXECUTE_RESULT, getExecuteResult());
}
注意:
上传表单的内容全部用 NutMap 来接收了;
@AdaptBy(type = UploadAdaptor.class, args = { "ioc:myPicUpload" }) ,这句是关键配置,注意myPicUpload要和ioc里面的相对应;
注意使用相对路径,否则会出现意想不到的问题(就是在使用本地路径访问项目的时候,上传的照片可以显示,使用实际路径访问项目的时候就不能显示上传的照片了)。
Constants.UPLOAD_FILE_DIRECTORY_NAME ,这个是一个字符串 tmp ,这个一定要和ioc里面配置的路径一致,原因不解释。
解释到这里,我想大家应该明白了吧(有什么写的不好的地方,欢迎指教)。