一,如果要使用struts2来上传文件要遵循一定格式才能成功上传文件
假如我们想要上传一张图片,就要定义一个VO类
private File myFile; //上传的文件
private String myFileContentType; //上传的文件类型
private String myFileFileName; //上传的文件名称
其中上面的myFile对应的是页面的这个标签的name的名称,当然这个是可以任意改的,但是java代码中的两个String类型的变量是根据这个来定义的。其模板是
private File xxx;
private String xxxContentType;
private String xxxFileName;
要使用struts2来上传文件还需要在struts.xml配置文件定义一个文件上传大小的配置。
<!-- 上传文件大小的限制 -->
<constant name="struts.multipart.maxSize" value="2073741824"/>
这一行的配置就是限制文件上传的大小。
记得在form标签的属性要添加 enctype=”multipart/form-data”来确保匿名上载文件的正确编码。
表单中enctype=”multipart/form-data”的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
接下来就是最为重要的代码片段,也就是实现文件上传到服务器端的代码
public String execute(){
HttpSession session = request.getSession();
System.out.println("execute photo upload!");
//获得username
User user = (User)session.getAttribute("globle_user");
String username = user.getUserName();
//设置文件保存目录
String photoPath =
ServletActionContext.getServletContext().getRealPath("/user/photo/" + username);
File filePhotoPath = new File(photoPath);
//创建文件夹
if(!filePhotoPath.isDirectory()) {
filePhotoPath.mkdirs();
}
//解决中文文件名问题
String extension = FilenameUtils.getExtension(this.valueObject.getMyFileFileName());
String filename = UUID.randomUUID().toString() + "."+ extension;
//设置目标文件
File tofile = new File(photoPath,filename);
//获取上传的头像图片的存放的完整路径
String imageUrl = photoPath+File.separator+filename;
String relateImageUrl= "user"+File.separator+"photo"+File.separator+username+File.separator+filename;
System.out.println("图片的相对的路径:"+relateImageUrl);
//替换斜杠,从而符合服务器的规范
imageUrl = imageUrl.replace('\\', '/');
relateImageUrl = relateImageUrl.replace('\\', '/');
//将头像图片的路径保存到user用户表中
/*userService.addHeadImageUrl(relateImageUrl,user.getId());*/
user.setHeadImage(relateImageUrl);
userService.addHeadImageUrl(relateImageUrl, user.getId());
//定义输出流和输入流
InputStream is = null;
OutputStream os = null;
try {
//创建一个输入流
is = new BufferedInputStream( new FileInputStream(this.valueObject.getMyFile()));
//使用输出流来包装目标文件
os = new BufferedOutputStream(new FileOutputStream(tofile));
byte[] buffer = new byte[1024];
int length = 0;
while((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
//当图片上传到本地文件夹之后,将用户头像图片添加到session中
session.setAttribute("imageUrl", relateImageUrl);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(os!=null){
try {
//关闭输出流
os.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(is != null){
try {
//关闭输入流
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}//关闭流的操作
}
return null;
}
其实上面的代码实现的步骤可以总结一下几点
1,创建文件上传的路径,对文件的名称进行转换,使用UUID算法,使得文件名在服务器端不会重复,不导致文件名重复覆盖文件。其中有一个需要注意的地方就是斜杠,这个要符合服务器端的规范,所以要进行格式的转换。
2,获取客户端上传的二进制数据,然后输出到服务器端保存到文件系统。
3,将文件的路径名字保存到数据库中,最后再将路径名字保存到session中,这是可选的,根据业务需求来选择。
如果是要上传用户的头像到服务器端,然后在立即回显到页面中来,就需要将路径名字保存到session中,通过ajax来异步请求用户头像的路径名。