JSPGen系列课程三:文件上传与文件下载
文件上传与文件下载在应用系统中很实用,在JSPGenSDF架构下,很轻松就可以实现此功能,详见下面示例。
这里不对JSPGenSDF的基础配置做详细说明,可参考这里:http://blog.****.net/jspgen/article/details/30825879
一、基础介绍
在JSPGenSDF第四版中,上传流程为:提交表单 —>保存为临时文件—> Action处理结束 —> 销毁临时文件;
Action对上传文件处理分两种:
A、原始上传处理,需要手动处理上传文件,比如对上传文件进行大小判断、格式判断,遇到图片文件,需要加水印等操作需要程序员自个处理(这种方式JSPGenSDF仅对上传文件做一个收集过程,未对文件进行任何加工处理);
B、配置式上传处理,文件保存路径、文件大小及格式限制均可在配置文件中进行配置处理,程序员在程序中只需要获取上传文件最终处理结果即可。
注意:不管哪种方式,都需要我们在JSPGenSDF基本信息配置文件中启用上传功能,并设定好大小控制,建议此处数值调至够大,否则将阻止文件收集(此处配置为全局性配置,若不启用,则整个平台将不可上传文件)。
二、上传示例
1、jspgen-config.xml
在框架基础配置文件中,找到upload节点及download节点,按如下配置:
<?xml version="1.0" encoding="UTF-8"?> <jspgen version="4.0"> <!-- 上传文件 --> <upload status="true"> <!-- 访问地址(若上传配置中有发布点的,以发布点访问地址为准) --> <url></url> <!-- 临时存储地址:相对于项目根目录下 --> <uri>temp/upload/</uri> <!-- 允许大小:默认值1M --> <size>2M</size> </upload> <!-- 下载文件 --> <download status="true"> <!-- 存储地址:相对于项目根目录下 --> <uri>temp/download/</uri> </download>
2、jspgen-upload.xml
<?xml version="1.0" encoding="UTF-8"?> <jspgen version="4.0"> <upload name="image" title="图片上传"> <!-- 发布点(为空框架根目录下) --> <psn></psn> <!-- 保存目录规则(为空则不操作),可用规则: [${userId}] ${dateline}(${yyyy} ${MM} ${dd} ${HH} ${mm} ${ss}) ${original} ${filename} ${name} ${exte} --> <rule>upload/image/${filename}</rule> <!-- 允许大小 --> <size>1M</size> <!-- 允许格式(*为允许所有文件) --> <pattern>.jpg.jpeg.gif.png</pattern> <!-- 图片特性 --> <!-- 压缩文件[质量(默认85)、大小、放大处理(小于指定宽高则进行放大)、成正比缩放、缩放基数(auto:自动,width、height:以宽度还是高度为准成正比缩放)](宽高不可都为0) --> <compress quality="85" width="588" high="300" amp="true" ratio="true" datum="width">true</compress> <!-- 生成缩略图[名称、质量(默认85)、大小、放大处理(小于指定宽高则进行放大)、成正比缩放、缩放基数](宽高不可都为0) --> <thumb name="thumb" title="缩略图" quality="85" width="288" height="200" amp="true" ratio="true" datum="width"> <!-- 发布点(为空框架根目录下) --> <psn></psn> <!-- 保存目录规则(为空则按上传路径处理),可用规则: [${userId} ${width} ${height}] ${dateline}(${yyyy} ${MM} ${dd} ${HH} ${mm} ${ss}) ${original} ${filename} ${name} ${exte} --> <rule>upload/image/${name}_thumb.${exte}</rule> </thumb> <!-- 添加水印[类型(type:font文字水印logo图片水印)、大小限制、 质量(默认85)、坐标、边距、透明度],其中GIF图片只能添加文字水印 --> <water name="water" title="水印" type="logo" minwidth="288" minheight="200" quality="85" position="9" space="10" alpha="50"> <!-- 发布点(为空框架根目录下) --> <psn></psn> <!-- 保存目录规则(为空则按上传路径处理),可用规则: [${userId} ${width} ${height} ${position} ${type} ${alpha}] ${dateline}(${yyyy} ${MM} ${dd} ${HH} ${mm} ${ss}) ${original} ${filename} ${name} ${exte} --> <rule>upload/image/${filename}</rule> <!-- 水印文件:从平台根目录起始--> <logo>static/images/water.png</logo> <font color="DDDDDD" name="verdana.ttf" style="bold" size="14">www.JSPGen.com</font> </water> </upload> // 可循环定义,名称不重复即可 </jspgen>
上传配置文件中,upload子节点可包含如下节点:
compress:原图压缩节点,整个upload节点内应保存唯一;
thumb:生成缩略图节点,可允许多个(名称不要重复),支持copy子节点;
water:添加水印图节点,可允许多个(名称不可重复),支持copy子节点;
copy:文件复制节点,可允许多个(名称不可重复),用此节点即可实现,一次上传多处存放上传文件功能。
详细完整配置可见框架上传配置文件注释说明!
3、UploadAction.java
文件上传处理:
package jspgen.action; import grapes.Dates; import grapes.Files; import grapes.Grapes; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Action类:文件上传演示 * * @author JSPGen * @copyright (c) JSPGen.com * @created 2014年06月 * @email jspgen@163.com * @address www.jspgen.com */ public class UploadAction extends Action { /** * 默认方法 */ public String execute () { return "upload"; } /** * 上传提交(第一种方式) */ public String upload1 () { List<String> files = new ArrayList<String>(); // 判断是否存在文件上传 if(isUpload()){ String realPath = getRealPath(); // 项目根目录 List<Map<String, Object>> list = getUploadFiles(); // 提取上传文件 if(Grapes.isNotEmpty(list)){ boolean isflag = false; long dateline, srcLength; String srcPath, srcName, srcExte, outPath, outRealPath; File file; for(Map<String, Object> map : list){ if(Grapes.isEmpty(map)) continue; srcName = (String) map.get("originalname"); // 文件原名 file = (File) map.get("file"); // 临时文件对象 srcPath = Files.format(file.getPath()); // 临时文件地址(格式化文件路径,必须要保持格式统一) srcExte = Files.getExte(file.getName()); // 临时文件扩展名(无圆点) srcLength = file.length(); // 临时文件大小 dateline = Dates.getTimeMillis(); // 上传时间戳 // 是否符合允许大小 if(srcLength > Files.getFileSizeByte("2m")) { logger.error("The file upload size limit[originalname:"+srcName+" limitSize:2M]"); continue; } // 是否符合允许类型 if(".txt.jpg.gif".indexOf("."+srcExte) == -1) { logger.error("The file upload type error[originalname:"+srcName+" alloweType: .txt.jpg.gif]"); continue; } // 复制文件 outPath = "/upload/" + dateline + "." + srcExte; outRealPath = realPath + outPath; isflag = Files.copyFile(srcPath, outRealPath); if(!isflag) { // 上传失败: 目标路径不可写 logger.error(getMessageValue("global.upload_error") + " File:" + outRealPath); continue; } // 上传成功 logger.info(getMessageValue("global.upload_success") + " File:" + outPath); files.add(outPath); // 收集上传资料 } } } // 输出(给页面模板传值) setAttribute("files", files); return LIST; } /** * 上传提交(第二种方式) */ public String upload2() { List<String> files = new ArrayList<String>(); // 判断是否存在文件上传 if(isUpload()){ String realPath = getRealPath(); // 项目根目录 List<Map<String, Object>> list = getUploadFiles(); // 提取上传文件 // 路径规则属性定义 Map<String, Object> ruleAtt = new HashMap<String, Object>(); ruleAtt.put("userId", getLoginUser().getId()); // 获取上传文件 List<Upload> listUp = getUploadRule("images", ruleAtt, list, null, null, true); if(Grapes.isNotEmpty(listUp)){ long dateline, srcLength; String srcPath, srcName; for(Upload up : listUp){ if(up == null || !up.getStatus()) continue; srcName = up.getOriginal(); // 文件原名 srcPath = up.getPath(); // 文件保存地址 srcLength = up.getLength(); // 文件大小 dateline = up.getDateline(); // 上传时间戳 } } } // 输出(给页面模板传值) setAttribute("listUp", listUp); return LIST; } /** * 文件下载 */ public String download() { logger.info("开始下载…"); File file = new File("D: /file/0223.pdf"); // 创建文件对象 return file(file, "说明.pdf"); // return file(“字符串内容下载”,”text.txt”); } }
4、testUpload.html
<form action="/jspgensdf/upload!upload1.gen" method="POST" enctype="multipart/form-data"> 文件1: <input type="file" name="myfiles1"/><br/> 文件2: <input type="file" name="myfiles2"/><br/> 文件3: <input type="file" name="myfiles3"/><br/> <input type="submit" value="上传"/> </form>
注意:表单中文件域名称不可重复,否则只能上传最后一个文件。
三、测试
浏览器中直接输入:http://localhost:8080/jspgensdf/upload.gen
便可进入测试页面,分别选取上传文件,再点击“上传”按钮,浏览器会向服务器提交文件流。
在上传表单中,文本内容获取与普通表单项获取一致:getParameter("表单项名称");
本文由 JSPGener 提供,作者:西雅