您的位置:首页 > 编程语言 > Java开发

基于struts2的文件上传

2015-11-29 19:32 393 查看
一,如果要使用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来异步请求用户头像的路径名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: