文件上传在我们的生活中非常常见,今天我们就来看看如何利用struts2框架,来实现文件的上传。要实现文件上传的方法实际上已经有很多的例子,但我们在了解了如何实现文件上传功能后,必须去深入了解文件上传的机制。
首先来看一下如何实现文件上传:
一、引入jar包,必须协调commons-fileupload.jar和commons-io.jar的版本
二、新建jsp上传界面
在WebRoot中创建jsp界面(我的是fileUpload.jsp)
<pre name="code" class="html"><body>
<!-- 表单提交方式一定为post,因为文件上传上传可能会很大,enctype属性,一定要设置为multipart/form-data,不然就会以二进制文本上传到服务器 -->
<form action="fileUpload2.action" method="post" enctype="multipart/form-data">
username: <input type="text" name="username"><br>
file: <input type="file" name="file"><br>
file2: <input type="file" name="file"><br>
file3: <input type="file" name="file"><br>
<input type="submit" value="submit">
</form>
</body>
同时在WebRoot下建立upload文件夹,用于存储上传文件
三、创建Action,如(UploadAction)
package com.shengsiyuan.struts2;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction2 extends ActionSupport
{
private String username;
private List<File> file; //不是从jsp传过来的文件本身,而是文件上传时临时文件夹下的文件
private List<String> fileFileName;//文件的名字
private List<String> fileContentType;//文件的类型
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public List<File> getFile()
{
return file;
}
public void setFile(List<File> file)
{
this.file = file;
}
public List<String> getFileFileName()
{
return fileFileName;
}
public void setFileFileName(List<String> fileFileName)
{
this.fileFileName = fileFileName;
}
public List<String> getFileContentType()
{
return fileContentType;
}
public void setFileContentType(List<String> fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
{
for(int i = 0; i < file.size(); i++)
{
InputStream is = new FileInputStream(file.get(i));
String root = ServletActionContext.getRequest().getRealPath("/upload");
File destFile = new File(root, fileFileName.get(i));
OutputStream os = new FileOutputStream(destFile);
byte[] buffer = new byte[400];
int length = 0;
while(-1 != (length = is.read(buffer)))
{
os.write(buffer, 0, length);
}
is.close();
os.close();
}
return SUCCESS;
}
}
四、struts.xml文件配置
<package name="struts2" extends="struts-default">
<!-- 最大上传量限制 -->
<!-- <constant name="struts.multipart.maxSize" value="104857600000"></constant> -->
<action name="fileUpload" class="com.shengsiyuan.struts2.UploadAction">
<result name="success">/fileUploadResult.jsp</result>
</action>
</package>
五、配置struts.properties,该项设置也可以直接配置在struts.xml中,这是同等效果。
struts.action.extension=action
struts.multipart.saveDir=D:/sisi
struts.multipart.maxSize=104857600000
经过一番配置,终于将可以将文件实现,我们来看一下成果:
上传界面:
上传成功后:
上传原理:
struts2框架实现文件上传,实际上是分为两个步骤:
1)先将客户端上传的文件保存到struts.multipart.saveDir所指定的目录中(我用的目录是D:/sisi),如果该键对应的目录不存在,就会保存到javax.servlet.context.tempdir环境变量所指定的目录中
2)Action中定义的File类型的成员变量实际指向临时目录中的临时文件,然后服务器通过IO方式将临时文件写入到指定的服务器目录中,我用的服务器是Tomcat,写到了Tomcat的目录中。
总结:
上述是原理,理解之后更容易实现功能,但我在做上传文件时遇到一个小问题,当上传的文件时空的时候,由于写入时为null值,故不能写入临时文件,查看发现struts不支持上传空文件,暂时是在文件中输入内容,从网上搜索的方案是可以在读入是判断是否为空文件,如果为空,自动在文件中输入空格,以实现功能,现在正在尝试中。。。