跟阿根一起学Java Web开发三:文件上传与文件下载

文件上传与文件下载在应用系统中很实用,在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("表单项名称");  方法获取!

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值