用到的包:一个是commons-fileupload-1.3.2.jar,另一个是commons-io-2.2.jar,没有的话去struts-2.3.31\apps\WEB-INF\lib里面拷。
第一步:做界面
1.在webcontent里面建一个包,这里叫Upload,然后新建两个jsp,input是界面,upload是成功跳转的界面
在input.jsp中的form表单,除了写action和method,还需要加上enctype="multipart/form-data"
在选择文件的<input>标签中的type要写file
在upload中写一句话就可以了,仅仅作为一个页面的标记,不写也可以。这里写个“上传成功”
第二步:做action
package com.itnba.maya.controller; import java.io.File; import java.io.IOException; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Random; import org.apache.commons.io.FileUtils; import com.opensymphony.xwork2.ActionSupport; public class UploadAction extends ActionSupport{ private String titile; private File file; private String fileFileName;//文件名 private String fileContentType;//文件类型 public String getFileFileName() { return fileFileName; } public void setFileFileName(String fileFileName) { this.fileFileName = fileFileName; } public String getTitile() { return titile; } public void setTitile(String titile) { this.titile = titile; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String input(){ return SUCCESS; } public String upload() throws IOException{ //随机数 Random rand = new Random(); //给随机数一个范围 int n = rand.nextInt(9999); //格式化一下,不够位补0 DecimalFormat df = new DecimalFormat("0000"); //把n放到format中格式化 String s = df.format(n); //日期格式化 SimpleDateFormat sim = new SimpleDateFormat("yyyyMMddhhmmss"); //获取当前时间 Date now = Calendar.getInstance().getTime(); //把当前时间格式化 String prefix = sim.format(now); //把随机数、时间和文件名拼接作为复制后的文件名 String newname = prefix+"_"+s+"_"+fileFileName; //复制的地址 File destFile = new File("d://"+newname); //执行 FileUtils.copyFile(file, destFile); return SUCCESS; } }
插入的代码是我们的action的内容,执行一下看下结果。
上传一个叫新建文本文档.txt,上传成功后我们去D盘找一下
D盘有了一个加了时间和随机数的新建文本文档
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------
三个成员:1.File类型 2.String fileFileName属性名 3.String fileContentType属性名
org.apache.commons.io.FileUtils.copyFile很简单。否则用IO流也可以操作。
用IO流操作
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(new File(root, fileFileName));
byte[] buffer = new byte[500];
int length = 0;
while(-1 != (length = is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
os.close();
is.close();
-------------------------------------------------------------------------------------------------
1.如何解决文件重名的问题?
加时间,随机数,用户名,序列号
2.如何解决大文件上传的问题?
在struts.xml 中添加常量。这个常量在struts.properties中(/org/apache/struts2/default.properties)。
<constant name="struts.multipart.maxSize" value="20971520"></constant>