基于struts的文件上传的核心还是java文件输出输出处理。文件通过表单提交,struts中的action对上传的文件进行处理,其实跟一般表单数据的处理是一样的。
一、form表单控件设置
<form action="/FileUpandDown/register.do" enctype="multipart/form-data" method="post">
文件:<input type="file" name="myphoto"/>
<input type="submit" value="注册"/>
</form>
这里要主要form的属性enctype的值不是默认的application/x-www-form-urlencoded而是 enctype="multipart/form-data"
二、struts中表单的配置
public class UserForm extends ActionForm {
private String username;//用户名称
private FormFile myphoto;//上传文件
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public FormFile getMyphoto() {
return myphoto;
}
public void setMyphoto(FormFile myphoto) {
this.myphoto = myphoto;
}
}
注意import org.apache.struts.upload.FormFile类,struts中有响应的文件上传类型
三、action请求处理
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;
// TODO Auto-generated method stub
String name=userForm.getUsername();
FormFile formFile=userForm.getMyphoto();
//获取上传文件名
String filename=formFile.getFileName();
//获取上传文件的大小
int filesize=formFile.getFileSize();
//定义输入流
InputStream is=null;
//定义输出流
OutputStream os=null;
try {
//获取输入流
is=formFile.getInputStream();
//得到upload文件夹服务器端的绝对路径
String uploadPath=this.getServlet().getServletContext().getRealPath("/upload");
//写入相应文件夹并重命名文件
os=new FileOutputStream(uploadPath+"\\"+MyTools.getNewFileName(filename));
//读取文件并写出到服务器的upload文件夹中
int len=0;
//缓存,防止上传文件过大
byte[] bytes=new byte[1024];
//循环处理
while((len=is.read(bytes))>0){
//读一点,写一点
os.write(bytes,0,len);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
//关闭流
is.close();
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
这里对于上传文件进行了如下操作:
1、获取上传文件的基本信息。struts表单的formfile类提供了相关的方法。如获取文件名,文件大小等
2、通过输入流读取文件,通过输出流写入文件。
3、获取本地文件夹的绝对路径,重命名上传文件,防止因文件名重复而导致覆盖源文件。
4、解决中文文件名的乱码问题(通过过滤器可以解决)。
5、java中UUID通用唯一识别码的使用
文件上传要注意的问题:
1、上传文件类型控制
2、上传文件大小控制
3、上传文件目录控制