Struts2之文件上传
2016-02-01 20:37
495 查看
由于Struts2已经对文件上传进行了封装,所以较为简单,导入Struts2相应的java包,commons-fileupload.jar、commons-io.jar是其依赖的jar包。
使用Struts2的文件上传主要有一下步骤:
(1)定义文件上传的表单,包含文件上传表单项<input type="file" name="file">。
(2)在form上将enctype属性设置为"multipart/form-data",设置提交方式为post,设置提交的action地址
(3)定义一个Struts2的Action类,在struts.xml上配置好。
(4)在Action类中添加File属性的属性,生成get和set方法。
以下为JSP部分代码:其中文件上传标签的name属性为file
以下为Action部分代码:
第6行,定义了一个名为file,类型为File的action属性。用于存放上传的文件。只要保证属性名称和页面中文件上传标签的name属性一致,并有set方法,Struts2就会自动将上传的文件的文件保存到临时目录下,并将临时目录下的文件设置到属性中。第7行,定义一个String类型的属性,用于存放上传的文件名,也是有Struts2自动设置,属性名的命名规则为:页面文件标签的name属性值后面跟上FileName。第8行,定义一个String类型的属性,用于存放上传文件的MIME类型,命名规则为也是跟上ContentType后缀。
第45-50行,为了解决有些上传的文件名中带有绝对路径,所以需要对文件名进行判断,如果带有绝对路径,需要进行字符串切割。第53行,为了防止上传同名文件可能会覆盖原有的文件,所以为文件名加上UUID的前缀,并用_分割,方便之后可以切割获得真是的文件名。第59-66行,根据文件名的Hash值,转换成16进制,去前两个字符与根目录一起构造文件保存的路径。如果直接把文件放在同一个目录下,那么日积月累,该目录下的文件数量过大,访问速度就会变慢,所以把文件保存的目录打散,防止同个目录文件数目过大。
如果要上传多个文件,只要把action中的File属性改为File[] 数组形式,将保存文件名和文件MIME类型的属性也改成数组形式,或者使用List形式即可。之后保存的时候,只要遍历文件数组,做相应的操作。注意,如果上传的文件过大,Struts2会报错,因为Struts2默认的上传文件大小只有2M多,如果要上传大文件,可以在struts.xml下面配置常量
在这里没有连接数据库,只是单纯的将文件保存到磁盘上,然后跳转到成功界面。在实际开发中,可以将文件保存到磁盘上,然后将保存文件的目录,保存到数据库中,之后根据数据库中保存的目录,即可做文件下载的功能。
使用Struts2的文件上传主要有一下步骤:
(1)定义文件上传的表单,包含文件上传表单项<input type="file" name="file">。
(2)在form上将enctype属性设置为"multipart/form-data",设置提交方式为post,设置提交的action地址
(3)定义一个Struts2的Action类,在struts.xml上配置好。
(4)在Action类中添加File属性的属性,生成get和set方法。
以下为JSP部分代码:其中文件上传标签的name属性为file
<form action="upload/upload" enctype="multipart/form-data" method="post"> 文件:<input type="file" name="file"> </br> <input type="submit" value="上传"> </form>
以下为Action部分代码:
第6行,定义了一个名为file,类型为File的action属性。用于存放上传的文件。只要保证属性名称和页面中文件上传标签的name属性一致,并有set方法,Struts2就会自动将上传的文件的文件保存到临时目录下,并将临时目录下的文件设置到属性中。第7行,定义一个String类型的属性,用于存放上传的文件名,也是有Struts2自动设置,属性名的命名规则为:页面文件标签的name属性值后面跟上FileName。第8行,定义一个String类型的属性,用于存放上传文件的MIME类型,命名规则为也是跟上ContentType后缀。
/** * 文件上传 * @author lzx */ public class FileUpload extends ActionSupport { private File file; private String fileFileName; private String fileContentType; public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileFileName() { return fileFileName; } public void setFileFileName(String fileFileName) { this.fileFileName = fileFileName; } public String getFileContentType() { return fileContentType; } public void setFileContentType(String fileContentType) { this.fileContentType = fileContentType; } /** * 处理文件上传,将上传的文件保存到指定路径下。 * 防止文件名重复需加上UUID前缀 * 防止同一个目录下文件过多,需将文件目录打散 * @return 上传成功返回success * @throws Exception */ public String Upload() throws Exception { //得到文件保存的路径 String rootPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/files"); //处理文件名中包含绝对路径的问题 String fileName = fileFileName; int index = fileName.lastIndexOf("\\"); if (index != -1) { fileName = fileName.substring(index + 1); } //给文件名称添加UUID前缀,处理文件同名问题 String saveName = UUID.randomUUID().toString() + "_" + fileName; //得到HashCode,转换成16进制 int code = fileName.hashCode(); String hex = Integer.toHexString(code); //获取hex的前两个字母,和root目录连接变成文件保存的目录 String savePath = rootPath + "\\" + hex.charAt(0) + "\\" + hex.charAt(1); File dirFile = new File(savePath); //如果不存在则创建目录 if (!dirFile.exists()) { dirFile.mkdirs(); } //创建目标文件,指定其所在路径 File destFile = new File(dirFile, saveName); //保存文件到指定目录下 FileUtils.copyFile(file, destFile); return SUCCESS; } }
第45-50行,为了解决有些上传的文件名中带有绝对路径,所以需要对文件名进行判断,如果带有绝对路径,需要进行字符串切割。第53行,为了防止上传同名文件可能会覆盖原有的文件,所以为文件名加上UUID的前缀,并用_分割,方便之后可以切割获得真是的文件名。第59-66行,根据文件名的Hash值,转换成16进制,去前两个字符与根目录一起构造文件保存的路径。如果直接把文件放在同一个目录下,那么日积月累,该目录下的文件数量过大,访问速度就会变慢,所以把文件保存的目录打散,防止同个目录文件数目过大。
如果要上传多个文件,只要把action中的File属性改为File[] 数组形式,将保存文件名和文件MIME类型的属性也改成数组形式,或者使用List形式即可。之后保存的时候,只要遍历文件数组,做相应的操作。注意,如果上传的文件过大,Struts2会报错,因为Struts2默认的上传文件大小只有2M多,如果要上传大文件,可以在struts.xml下面配置常量
<!-- 指定Struts2文件上传中整个请求内容允许的最大字节量 --> <constant name="struts.multipart.maxSize" value="15728640"></constant>
在这里没有连接数据库,只是单纯的将文件保存到磁盘上,然后跳转到成功界面。在实际开发中,可以将文件保存到磁盘上,然后将保存文件的目录,保存到数据库中,之后根据数据库中保存的目录,即可做文件下载的功能。
相关文章推荐
- ASP实现文件上传的方法
- PHP文件上传问题汇总(文件大小检测、大文件上传处理)
- .net文件上传时实现通过文件头确认文件类型的方法
- asp.net 文件上传与刷新与asp.net页面与iframe之间的数据传输
- ASP的chr(0)文件上传漏洞原理和解决方法介绍
- asp.net上传文件到数据库的解决方案
- javascript实现校验文件上传控件实例
- ajax 异步上传带进度条视频并提取缩略图
- jQuery实现文件上传进度条特效
- 分享20多个很棒的jQuery 文件上传插件或教程
- jquery插件ajaxupload实现文件上传操作
- jquery插件uploadify实现带进度条的文件批量上传
- MVC中基于Ajax和HTML5实现文件上传功能
- js jquery分别实现动态的文件上传操作按钮的添加和删除
- asp.net HTML文件上传标签
- PHP中文件上传的一个问题
- 与文件上传有关的php配置参数总结
- Serv-U中禁止某类文件上传的设置方法
- PHP 文件编程综合案例-文件上传的实现
- 在服务端进行目录建立、删除,文件上传、删除的过程的php代码