文件上传与文件下载在应用系统中很实用,在JSPGenSDF架构下,很轻松就可以实现此功能,详见下面示例。
这里不对JSPGenSDF的基础配置做详细说明,可参考这里:http://blog.csdn.net/jspgen/article/details/30825879
技术交流QQ群:12349848
一、基础介绍
在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="images" 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("表单项名称"); 方法获取!