- 浏览: 736361 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
18335864773:
看了楼主写的用jxl生成excel。有地方用到了流,还特别强调 ...
jxl导出excel文件简单示例 -
shaoshou111:
查看Apache的并发请求数及其TCP连接状态netstat ...
Linux查看连接数,并发数 -
gengjunshi:
非常感谢哈,刚好在学webservice编程,很有用呢。
JAX-WS开发webservice示例详解 -
zcgewu:
encrypt2()和encrypt()有什么区别
JAVA实现AES加密 -
java爱好者92:
ireport的操作还是相对比较复杂的,帆软报表会相对简单一点 ...
iReport报表开发中常见的问题
一、上传单个文件
上传文件是很多Web程序都具有的功能。在Struts1.x中已经提供了用于上传文件的组件。而在Struts2中提供了一个更为容易操作的上传文件组 件。所不同的是,Struts1.x的上传组件需要一个ActionForm来传递文件,而Struts2的上传组件是一个拦截器(这个拦截器不用配置, 是自动装载的)。在本文中先介绍一下如何用struts2上传单个文件,最后介绍一下用struts2上传任意多个文件。
要用Struts2实现上传单个文件的功能非常容易实现,只要使用普通的Action即可。但为了获得一些上传文件的信息,如上传文件名、上传文件类型以 及上传文件的Stream对象,就需要按着一定规则来为Action类增加一些getter和setter方法。
在Struts2中,用于获得和设置java.io.File对象(Struts2将文件上传到临时路径,并使用java.io.File打开这个临时文 件)的方法是getUpload和setUpload。获得和设置文件名的方法是getUploadFileName和 setUploadFileName,获得和设置上传文件内容类型的方法是getUploadContentType和 setUploadContentType。下面是用于上传的动作类的完整代码:
在execute方法中的实现代码就很简单了,只是从临时文件复制到指定的路径(在这里是d:\upload)中。上传文件的临时目录的默认值是 javax.servlet.context.tempdir的值,但可以通过struts.properties(和struts.xml在同一个目录 下)的struts.multipart.saveDir属性设置。Struts2上传文件的默认大小限制是2M(2097152字节),也可以通过 struts.properties文件中的struts.multipart.maxSize修改,如 struts.multipart.maxSize=2048 表示一次上传文件的总大小不能超过2K字节。
下面的代码是上传文件的JSP页面代码:
也可以在success.jsp页中通过<s:property>获得文件的属性(文件名和文件内容类型),代码如下:
二、上传任意多个文件
在Struts2中,上传任意多个文件也非常容易实现。首先,要想上传任意多个文件,需要在客户端使用DOM技术生成任意多个<input type=”file” />标签。name属性值都相同。代码如下:
上面的javascript代码可以生成任意多个<input type=’file’>标签,name的值都为file(要注意的是,上面的javascript代码只适合于IE浏览器,firefox等其他 浏览器需要使用他的代码)。至于Action类,和上传单个文件的Action类基本一至,只需要将三个属性的类型改为List即可。代码如下:
package action;
common.properties
FileUtil.java
在execute方法中,只是对List对象进行枚举,在循环中的代码和上传单个文件时的代码基本相同。如果读者使用过struts1.x的上传组件,是 不是感觉Struts2的上传功能更容易实现呢?在Struts1.x中上传多个文件时,可是需要建立带索引的属性的。而在Struts2中,就是这么简 单就搞定了。图1是上传任意多个文件的界面。
在struts.xml中可以控制上传的大小
上传文件是很多Web程序都具有的功能。在Struts1.x中已经提供了用于上传文件的组件。而在Struts2中提供了一个更为容易操作的上传文件组 件。所不同的是,Struts1.x的上传组件需要一个ActionForm来传递文件,而Struts2的上传组件是一个拦截器(这个拦截器不用配置, 是自动装载的)。在本文中先介绍一下如何用struts2上传单个文件,最后介绍一下用struts2上传任意多个文件。
要用Struts2实现上传单个文件的功能非常容易实现,只要使用普通的Action即可。但为了获得一些上传文件的信息,如上传文件名、上传文件类型以 及上传文件的Stream对象,就需要按着一定规则来为Action类增加一些getter和setter方法。
在Struts2中,用于获得和设置java.io.File对象(Struts2将文件上传到临时路径,并使用java.io.File打开这个临时文 件)的方法是getUpload和setUpload。获得和设置文件名的方法是getUploadFileName和 setUploadFileName,获得和设置上传文件内容类型的方法是getUploadContentType和 setUploadContentType。下面是用于上传的动作类的完整代码:
package action; import java.io.*; import com.opensymphony.xwork2.ActionSupport; public class UploadAction extends ActionSupport { private File upload; private String fileName; private String uploadContentType; public String getUploadFileName() { return fileName; } public void setUploadFileName(String fileName) { this.fileName = fileName; } public File getUpload() { return upload; } public void setUpload(File upload) { this.upload = upload; } public void setUploadContentType(String contentType) { this.uploadContentType=contentType; } public String getUploadContentType() { return this.uploadContentType; } public String execute() throws Exception { java.io.InputStream is = new java.io.FileInputStream(upload); java.io.OutputStream os = new java.io.FileOutputStream("d:\\upload\\" + fileName); byte buffer[] = new byte[8192]; int count = 0; while((count = is.read(buffer)) > 0){ os.write(buffer, 0, count); } os.close(); is.close(); return SUCCESS; } }
在execute方法中的实现代码就很简单了,只是从临时文件复制到指定的路径(在这里是d:\upload)中。上传文件的临时目录的默认值是 javax.servlet.context.tempdir的值,但可以通过struts.properties(和struts.xml在同一个目录 下)的struts.multipart.saveDir属性设置。Struts2上传文件的默认大小限制是2M(2097152字节),也可以通过 struts.properties文件中的struts.multipart.maxSize修改,如 struts.multipart.maxSize=2048 表示一次上传文件的总大小不能超过2K字节。
下面的代码是上传文件的JSP页面代码:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>上传单个文件</title> </head> <body> <s:form action="upload" namespace="/test" enctype="multipart/form-data"> <s:file name="upload" label="输入要上传的文件名" /> <s:submit value="上传" /> </s:form> </body> </html>
也可以在success.jsp页中通过<s:property>获得文件的属性(文件名和文件内容类型),代码如下:
<s:property value="uploadFileName"/>
二、上传任意多个文件
在Struts2中,上传任意多个文件也非常容易实现。首先,要想上传任意多个文件,需要在客户端使用DOM技术生成任意多个<input type=”file” />标签。name属性值都相同。代码如下:
<html> <head> <script language="javascript"> var id = 0; function addComponent() { id = id+1; if(id >= 5){ alert("最多五个附件!"); return; } var uploadHTML = document.createElement( "<input type='file' id='file' name='uploadFile' style='width:50%;'/>"); document.getElementById("files").appendChild(uploadHTML); uploadHTML = document.createElement( "<p/>"); document.getElementById("files").appendChild(uploadHTML); } function clearFile() { var file = document.getElementsByName("uploadFile"); for(var i=0;i<file.length;i++) { file[i].outerHTML=file[i].outerHTML.replace(/(value=\").+\"/i,"$1\""); } } </script> </head> <body> <input type="button" onclick="addComponent();" value="添加文件" /> <br /> <form onsubmit="return true;" action="/struts2/test/upload.action" method="post" enctype="multipart/form-data"> <table width="100%"> <tr> <td style="text-align:center"> <font style="color: red; font-size: 14px;">上传附件(文件大小请控制在20M以内)</font> </td> </tr> <tr> <td><a href="###" class="easyui-linkbutton" onclick="addComponent();" iconCls="icon-add">添加文件(最多五个附件)</a> <br /> <span id="files"> <input type='file' name='uploadFile' style='width:50%;'/><p/> </span> <input type='button' value='重置' stytle='btng' onclick='clearFile();'/> </td> </tr> </table> </form> </body> </html>
上面的javascript代码可以生成任意多个<input type=’file’>标签,name的值都为file(要注意的是,上面的javascript代码只适合于IE浏览器,firefox等其他 浏览器需要使用他的代码)。至于Action类,和上传单个文件的Action类基本一至,只需要将三个属性的类型改为List即可。代码如下:
package action;
import java.io.*; import com.opensymphony.xwork2.ActionSupport; public class UploadMoreAction extends ActionSupport { private List<File> uploadFile; private List<String> uploadFileFileName; private List<String> uploadFileContentType; public List<File> getUploadFile() { return uploadFile; } public void setUploadFile(List<File> uploadFile) { this.uploadFile = uploadFile; } public List<String> getUploadFileFileName() { return uploadFileFileName; } public void setUploadFileFileName(List<String> uploadFileFileName) { this.uploadFileFileName = uploadFileFileName; } public List<String> getUploadFileContentType() { return uploadFileContentType; } public void setUploadFileContentType(List<String> uploadFileContentType) { this.uploadFileContentType = uploadFileContentType; } public String execute() throws Exception { if(uploadFile != null){ Map<String, Object> paraMap = new HashMap<String, Object>(); paraMap.put("deptCode", this.getLoginUserDepartment().getDeptCode()); paraMap.put("workId", lawVersion.getId()); ProjectComm pc = new ProjectComm(); pc.saveFile(paraMap,CommCode.apkPath, this.getLoginUser(), uploadFile, uploadFileFileName, ".jpg"); } return SUCCESS; } }
common.properties
UPLOAD_PATH=/virtualdir/upload/ #photo upload PHOTO_PATH=/data/photo/
public static String getPorjectPath(String classesPath){ String tempdir; String classPath[] = classesPath.split("webapps"); tempdir=classPath[0]; if(!"/".equals(tempdir.substring(tempdir.length()))){ tempdir += File.separator; } return tempdir; }
File.separator//可以不用
FileUtil.java
import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import com.jshx.ictjs.httptransfer.utils.DateTools; import com.jsict.core.PropertiesManager; import com.jsict.core.exception.IctException; import com.jsict.ictmap.web.UserSession; import com.jsict.util.IctUtil; import com.jsict.util.StringUtil;
private static final Logger logger = Logger.getLogger(FileUtil.class); /** * 保存多文件 * @param paraMap 参数 * @param userSession 登录用户 * @param uploadFile 文件列表 * @param uploadFileFileName 文件表列表 * @param fileType 文件类型 * @throws IOException * @throws IctException */ public void saveFileList(Map<String,Object> paraMap,UserSession userSession,List<File> uploadFile,List<String> uploadFileFileName,String fileType) throws IOException, IctException{ String dateNowStr=DateTools.parseDate2Str(new Date(), "yyyyMM"); String savePath = PropertiesManager.getProperty("common.properties", "PHOTO_PATH") + dateNowStr; String loginName = CommonFunc.getMapByValue(paraMap, "loginName"); if(!StringUtil.isEmpty(loginName)){ savePath = savePath + "/" + loginName; } String classesPath = this.getClass().getClassLoader().getResource("").getPath(); logger.debug("=============Constant.getPorjectPath()=" + classesPath); String photoPath = Constant.getPorjectPath(classesPath) + PropertiesManager.getProperty("common.properties", "UPLOAD_PATH")+savePath; FileUtil fileUtil = new FileUtil(); ServiceFunc sf = new ServiceFunc(); if (uploadFile != null){ for (int i = 0; i < uploadFile.size(); i++){ String endSavePath = fileUtil.saveFile(photoPath, savePath,uploadFile.get(i),uploadFileFileName.get(i),fileType); if(!StringUtil.isEmpty(endSavePath)){ sf.savePhoto(paraMap, userSession, endSavePath); } } } } /** * 保存文件 * @param photoPath 文件真实保存路径 * @param savePath DB中保存的路径 * @param file 文件流 * @param filename 文件名称 * @param fileType 文件类型 * @return * @throws IOException */ public String saveFile(String photoPath,String savePath,File file,String fileName,String fileType) throws IOException{ createFolder(photoPath); java.io.InputStream is = null; java.io.OutputStream os = null; try { String newName = getDatedFName(fileName,fileType); String endPath = photoPath + "/"+ newName; String endSavePath = savePath + "/"+ newName; endPath = endPath.replace(" ", ""); endSavePath = endSavePath.replace(" ", ""); createFile(endPath.toString().trim()); os = new java.io.FileOutputStream(endPath); is = new java.io.FileInputStream(file); byte buffer[] = new byte[8192]; int count = 0; while ((count = is.read(buffer)) > 0){ os.write(buffer, 0, count); } return endSavePath; } catch (IOException e) { }finally { if (null != is) is.close(); if (null != os) os.close(); } return null; } /** * 保存文件 * @param request 获得二进制流 * @param savePath 保存相对路径 * @param filename 文件名称 * @param fileType 文件类型 * @return * @throws IOException */ public String saveFile(HttpServletRequest request,String savePath,String fileName,String fileType) throws IOException{ String classesPath = this.getClass().getClassLoader().getResource("").getPath(); logger.debug("=============Constant.getPorjectPath()=" + classesPath); String photoPath = Constant.getPorjectPath(classesPath) + PropertiesManager.getProperty("common.properties", "UPLOAD_PATH")+savePath; createFolder(photoPath); FileOutputStream fos = null; BufferedInputStream bis = null; try { String newName = getDatedFName(fileName,fileType); String endPath = photoPath + "/"+ newName; String endSavePath = savePath + "/"+ newName; endPath = endPath.replace(" ", ""); endSavePath = endSavePath.replace(" ", ""); createFile(endPath.toString().trim()); fos = new java.io.FileOutputStream(endPath); bis = new BufferedInputStream(request.getInputStream()); byte buffer[] = new byte[8192]; int count = 0; while ((count = bis.read(buffer)) > 0){ fos.write(buffer, 0, count); } return endSavePath; } catch (IOException e) { }finally { if (null != bis) bis.close(); if (null != fos) fos.close(); } return null; } /** * 新建文件夹 * @param photoPath */ private void createFolder(String photoPath){ File outdir = new File(photoPath.toString().trim()); if (!outdir.exists()){ outdir.mkdirs(); } } /** * 新建文本 * @param endPath 文件真实保存路径 * @throws IOException */ private void createFile(String endPath) throws IOException{ File outfile = new File(endPath.toString().trim()); if (logger.isDebugEnabled()){ logger.debug("outfile:" + outfile.getPath()); } if (!outfile.exists()){ outfile.createNewFile(); } } /** * <照片名前加上日期> * @param filename 文件名称 * @param fileType 文件类型 * @return */ public String getDatedFName(String filename,String fileType) { String fnameSplit[] = filename.split("\\."); StringBuffer result = new StringBuffer(); int ronNum = (int)(Math.random()*1000); String dateSfx = IctUtil.getCurrTime() + "_" +ronNum; if(!StringUtil.isEmpty(fnameSplit[0])){ result.append(fnameSplit[0]+"_"); } result.append(dateSfx); result.append(fileType); return result.toString(); } /** * 删除某个文件夹下的所有文件夹和文件 * * @param delpath * String * @throws FileNotFoundException * @throws IOException * @return boolean */ public static boolean deletefile(String delpath) throws Exception { try { File file = new File(delpath); // 当且仅当此抽象路径名表示的文件存在且 是一个目录时,返回 true if (!file.isDirectory()) { file.delete(); } else if (file.isDirectory()) { String[] filelist = file.list(); for (int i = 0; i < filelist.length; i++) { File delfile = new File(delpath + "\\" + filelist[i]); if (!delfile.isDirectory()) { delfile.delete(); System.out .println(delfile.getAbsolutePath() + "删除文件成功"); } else if (delfile.isDirectory()) { deletefile(delpath + "\\" + filelist[i]); } } System.out.println(file.getAbsolutePath()+"删除成功"); file.delete(); } } catch (FileNotFoundException e) { System.out.println("deletefile() Exception:" + e.getMessage()); } return true; }
在execute方法中,只是对List对象进行枚举,在循环中的代码和上传单个文件时的代码基本相同。如果读者使用过struts1.x的上传组件,是 不是感觉Struts2的上传功能更容易实现呢?在Struts1.x中上传多个文件时,可是需要建立带索引的属性的。而在Struts2中,就是这么简 单就搞定了。图1是上传任意多个文件的界面。
在struts.xml中可以控制上传的大小
<constant name="struts.multipart.maxSize" value="20485760" />
发表评论
-
父页面与子页面的相互调用
2017-12-14 14:51 2602一、在页面里用 open ... -
(转)Java jacob调用打印机打印word文档
2017-12-01 17:33 3807折腾了好久,最终决定由用一个第三方的,找到了jacob,还不 ... -
gson的使用分享
2016-01-15 13:48 1860一、 最基本的对象与JSON相互转换 1、 定义java对象 ... -
(转)FindBugs规则整理
2015-12-18 10:40 6648FindBugs是基于Bug Patterns ... -
Gson注解和GsonBuilder
2015-04-07 11:49 1711//注意这里的Gson的构建方式为GsonBuilder, ... -
Spring AOP 的@Aspect (转)
2015-03-03 15:50 909从Spring 2.0开始,可以使用基于schema及@As ... -
Hibernate一对多和多对一关系详解 (转载)
2014-07-10 17:00 1847双向一对多关系,一是关系维护端(owner side),多是关 ... -
Struts2的Action如何交给spring来管理
2014-07-10 11:35 859我的Action是 <package name=&qu ... -
javax.xml.ws.soap.SOAPFaultException: Cannot create a secure XMLInputFactory
2014-06-04 20:26 1856javax.xml.ws.soap.SOAPFaultExce ... -
照片打包下载
2014-05-22 09:32 1244设计思路: 通过业务表中照片编号获得需要下载的照片列表 ... -
获得请求IP
2013-12-06 14:18 1114在AbstractInterceptor中 Action ... -
jxl导入excel
2013-09-17 16:56 950jxl读取excel和写excel基本类似,只是Writab ... -
Apache与Nginx的优缺点比较(转)
2013-08-26 11:13 11751、nginx相对于apache的优点: 轻量级,同样起we ... -
findbugs清理总结
2013-08-19 14:45 3029findbugs警告26个。主要有以下9类问题。 1、B ... -
Spring 2.0 的AOP
2013-05-22 16:36 939我使用的是Spring 2.0 的AOP, 它引入了一种更加简 ... -
APK下载配置
2013-04-15 17:44 1097tomcat-6.0\conf\web.xml <mi ... -
My97DatePicker在Frame中无法打开站点
2013-04-09 17:17 1179大部分日期控件都具备功能如:带时间显示,支持周显示,自定义格式 ... -
jxl导出excel文件简单示例
2013-02-19 11:04 8885package util; import java. ... -
(转)在java中通过JDBC连接Oracle,ResultSet返回总为空,这个问题是怎么解决呢
2013-01-08 10:38 16445数据库基本访问格式 Class.forName(“JDBC驱动 ... -
转:spring多个定时任务quartz配置
2012-11-22 09:07 1545applicationContext.xml <im ...
相关推荐
找到一个网络磁盘,可以上传4G呢,链接如下: http://www.namipan.com/d/ec3e547272955230e43596936011dc901548683bb5e7d316 因为是完整版,文档有225M,不含源码,源码有380M,有需源码的童鞋可联系我邮箱lzp...
本项目实战大全聚焦于这一主题,使用Struts2.0框架进行实现,同时也涉及到文件处理的相关技术。以下是关于这个主题的详细知识点: 1. **Struts2.0框架**:Struts2是一个基于MVC(Model-View-Controller)设计模式的...
采用了FCKeditor在线文本编辑器,用FCKeditor上传文件时还存在有问题,不知道是不是配置存在问题,但是图片文件利用Struts2的action上传到服务器,因为有其他附件文件要上传,并且要保存文件信息,在删除文章时要把...
采用了FCKeditor在线文本编辑器,用FCKeditor上传文件时还存在有问题,不知道是不是配置存在问题,但是图片文件利用Struts2的action上传到服务器,因为有其他附件文件要上传,并且要保存文件信息,在删除文章时要把...
1. `struts2-core-2.0.11.1.jar`:这是Struts2的核心库,包含了框架的主要组件,如Action、Result、Interceptor等。它提供了一整套机制来处理HTTP请求,执行业务逻辑,并将结果返回给用户。 2. `freemarker-2.3.8....
如果项目使用了Struts框架,可以利用Struts提供的`FormFile`类来处理文件上传。这种方式更简洁且符合MVC设计模式。 ##### 1. 创建ActionForm ```java package com.example.struts.form; import org.apache.struts...
15.4. Struts 15.4.1. ContextLoaderPlugin 15.4.2. ActionSupport 类 15.5. Tapestry 15.5.1. 注入 Spring 托管的 beans 15.6. WebWork 15.7. 更多资源 16. Portlet MVC框架 16.1. 介绍 16.1.1. 控制器 - ...
写的比较简陋,,基于struts1.2+spring2.0+hibernate3.1框架 基本功能: 注册,登陆,validate框架验证,文件上传,下载,简单过滤器,权限限制,下载列表查看,下载历史记录查看 未处理中文,所有jar包...
8. **commons-fileupload.jar**: 实现了文件上传功能,常用于Web应用中接收用户上传的文件。 9. **commons-lang.jar**: 提供了一系列增强Java基础类的工具类,如字符串操作、日期时间处理等,是对java.lang.*包的...
15.4. Struts 15.4.1. ContextLoaderPlugin 15.4.2. ActionSupport 类 15.5. Tapestry 15.5.1. 注入 Spring 托管的 beans 15.6. WebWork 15.7. 更多资源 16. Portlet MVC框架 16.1. 介绍 16.1.1. 控制器 - ...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...
apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...