博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【学习笔记16】文件上传
阅读量:6626 次
发布时间:2019-06-25

本文共 3564 字,大约阅读时间需要 11 分钟。

hot3.png

1. 添加Struts2文件上传所需要的jar包:
    commons-fileupload-*.jar
    commons-io-*.jar
2. 文件上传页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ page language="java" contentType="text/html; charset=UTF-8"%>  <%@ taglib prefix="s" uri="/struts-tags" %>      	Struts2文件上传          
3. FileUploadAction
package com.commons;import java.io.File;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Random;import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext;public class FileUploadAction {	private File image;	private String imageContentType;	private String imageFileName;    //get、set方法略	private String generateFileName(String fileName) {		DateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");		String formatDate = format.format(new Date());		int random = new Random().nextInt(10000);  //[0,10000)		int position = fileName.lastIndexOf(".");		String extension = fileName.substring(position);		return formatDate + random + extension;	}	public String execute() throws Exception {		String targetDirectory = ServletActionContext.getServletContext().getRealPath("/upload/image");		File directory = new File(targetDirectory);		if(!directory.exists()){        		directory.mkdirs();        }		String targetFileName = generateFileName(imageFileName);		File target = new File(targetDirectory, targetFileName);		FileUtils.copyFile(image, target);		return "success";	}}
  在FileUploadAction中我分别写了setImage、setImageContentType和setImageFileName三个Setter方法,第一个很容易明白,对应fileupload.jsp中的<s:file/>标签。但是后两者并没有显式地与任何的页面标签绑定,那么它们的值又是从何而来的呢?其实,<s:file/>标签不仅仅是绑定到image,还绑定imageContentType(上传文件的MIME类型)和imageFileName(上传文件的文件名,不包括文件的路径)。因此,<s:file name="xxx" />对应Action类里面的xxx、xxxContentType和xxxFileName三个属性。

4. struts.xml

    
        
            
/showupload.jsp
        
    
5. 创建完结果页面showupload.jsp就可以运行本示例了。
    在运行上述例子,如果您留心一点的话,应该会发现服务器控制台有如下输出:
四月 23, 2013 10:50:18 下午 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
四月 23, 2013 10:50:18 下午 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
WARNING: Content-Type not allowed: image "张超的简历03.doc" "upload__4e70a7f8_13e375fb1ec__8000_00000000.tmp" application/octet-stream
四月 23, 2013 10:50:18 下午 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Removing file image E:\ide\apache-tomcat-7.0.32\work\Catalina\localhost\struts2_1\upload__4e70a7f8_13e375fb1ec__8000_00000000.tmp
    上述信息告诉我们,struts.multipart.saveDir没有配置。struts.multipart.saveDir用于指定存放临时文件的文件夹,该配置写在struts.properties文件(在scr目录下)中。例如,在struts.properties文件加入如下代码:struts.multipart.saveDir=/tmp
6.  阻止用户上传非图片类型的文件:
在Struts 2中如何实现这点呢?其实这也很简单,对上述例子作如下修改即可。
首先修改fileupload.jsp,在<body>与<s:form>之间加入“<s:fielderror />”,用于在页面上输出错误信息。
然后让 FileUploadAction继承ActionSupport类。
再修改struts.xml文件,将FileUploadAction的定义改为如下所示:
image/bmp,image/png,image/gif,image/jpeg
/fileupload.jsp
/showupload.jsp
    显而易见,起作用的就是fileUpload拦截器的allowTypes参数。另外,配置还引入defaultStack,它会帮我们添加验证等功能,所以在出错之后会跳转到名称为“input”的结果,也即是fileupload.jsp。
    上面的出错提示是Struts 2默认的,大多数情况下,我们都需要自定义和国际化这些信息。通过在全局的国际资源文件中加入“struts.messages.error.content.type.not.allowed=The file you uploaded is not a image”,可以实现以上提及的需求。

转载于:https://my.oschina.net/zc741520/blog/124798

你可能感兴趣的文章
测试妹子的呐喊:为什么总是收不到推送?
查看>>
linux NFS
查看>>
Jquery DataTable基本使用
查看>>
leetcode 674. Longest Continuous Increasing Subsequence
查看>>
Extensions in UWP Community Toolkit - SurfaceDialTextbox
查看>>
Golang 语言的单元测试和性能测试(也叫 压力测试)
查看>>
Java中CAS详解
查看>>
Java Spring MVC 错误 及 常见问题 总结
查看>>
Linux系统实战项目——sudo日志审计
查看>>
Android Application Task Activities的关系
查看>>
浅谈CSS盒子模型
查看>>
实现iFrame自适应高度,原来很简单!
查看>>
get app id
查看>>
poj 3624 0/1背包暨0/1背包的学习
查看>>
[俗一下]世界500强公司的面试问题与答案提示 [转]
查看>>
使用 Excel Services ,结合 Analysis Services 在 SharePoint 中发布报表
查看>>
SQL Server数据导入导出技术概述与比较
查看>>
format的用法
查看>>
DHCPv6 server port and DHCPv6 client port
查看>>
10个最佳的触控手式的JavaScript框架(转)
查看>>