您的位置:首页 > 其它

S2SH整合以及图片上传(6)之图片上传

2018-03-06 15:50 375 查看
    从本篇文章开始,我们讲一下图片上传。
    由于前面的S2SH搭建很成功,这里我们可以把前面的项目备份一份,以供以后相似的项目调用。

    这些都是题外话,我们现在开始讲如何进行图片上传。

    这里的图片上传主要用到的是struts2中的文件上传功能,具体的jar包,前面再导入struts2的jar包的时候,已经全部导入了,所以现在不需要额外的导入jar包。

    第一步,我们现在add.jsp页面中添加一些输入组件:
    


    add.jsp具体内容如下:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>Person Operate Page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>

<body>
<h2>S2SH整合以及图片上传</h2>
<h2>添加人员</h2>
<s:form action="person!add" namespace="/person" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>图片</td>
<td><input type="file" name="personDto.image" /></td>
</tr>
<tr>
<td>人员姓名</td>
<td><input type="text" name="personDto.name" /></td>
</tr>
<tr>
<td><input type="submit" value="添加" /></td>
</tr>
</table>
</s:form>

</body>
</html>
    第二步,我们需要创建一个DTO,即数据传输对象,用来接收前台传来的参数:
    PersonDto内容如下:
package com.ssh.dto;

import java.io.File;

public class PersonDto {

    //上传文件
    private File image;
//上传文件名
private String imageFileName;
//人员名称
private String name;

public File getImage() {
return image;
}
public void setImage(File image) {
this.image = image;
}
public String getImageFileName() {
return imageFileName;
}
public void setImageFileName(String imageFileName) {
this.imageFileName = imageFileName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
    第三步,我们在PersonAction中进行参数接受,以及将图片上传至服务器中:
    这里,我们采用UUID来对文件命名,以防出现重名文件:

    PersonAction代码具体如下:
package com.ssh.action;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

import javax.annotation.Resource;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;
import com.ssh.dto.PersonDto;
import com.ssh.po.Person;
import com.ssh.service.PersonService;

public class PersonAction extends ActionSupport{

private static final long serialVersionUID = 1L;

@Resource
private PersonService personService;

//定义dto对象,接受前台传来的参数
private PersonDto personDto;

public PersonDto getPersonDto() {
return personDto;
}

public void setPersonDto(PersonDto personDto) {
this.personDto = personDto;
}

//定义实体对象
Person person = new Person();

public String add(){
//接受实际文件名,不能为中文
String realName = personDto.getImageFileName();

//此处使用UUID,防止一个目录下面出现太多文件,以及重名覆盖问题
String uuidName = UUID.randomUUID().toString()+"_"+realName;

//得到文件名的hashCode的值,得到的就是uuidName这个字符串对象在内存中的地址
String hash = Integer.toHexString(uuidName.hashCode());
//获得要存放图片的绝对路径
String realpath = ServletActionContext.getServletContext().getRealPath("images");

//让IMGURL路径随realpath路径一起变化
String imgurl = "images";

for(char c : hash.toCharArray()){
realpath +="/"+c;
imgurl +="/"+c;
}

//获取图片存放路径名
imgurl +="/"+uuidName;

System.out.println("imgurl ="+imgurl);
System.out.println("realpath ="+realpath);
//在路径下创建上传的文件
File savefile = new File(new File(realpath),uuidName);
if(uuidName!=null){
if(!savefile.getParentFile().exists()){
//如果路径不存在,则创建一个
savefile.getParentFile().mkdirs();
//把上传的文件保存在路径中
try {
FileUtils.copyFile(personDto.getImage(), savefile);
} catch (IOException e) {
e.printStackTrace();
}
}
}

person.setName(personDto.getName());
person.setImgurl(imgurl);

try {
personService.save(person);
} catch (Exception e) {
//e.printStackTrace();
return "addError";
}
return SUCCESS;
}
}    第四步,由于在实际应用中,我们出现异常时,不返回异常打印,而是回到添加页面,所以,我们在异常打印中配置了一个return “addError”,此处用来返回添加页面。因此,我们需要在struts2的配置文件中在添加一个result,如下:

    


    具体代码如下:<result name="addError">/add.jsp</result>    第五步,由于我们此时采用的是UUID文件命名,所以文件名会比较长,这个时候,原来的imgurl的长度就会显得不足,如果出现不足的情况,程序是会报异常的。
    这个时候,我们就需要将原来的imgurl长度改一下,让它长度能够容纳下UUID的文件名。

    我们需要改PErson.hbm.xml中的imgurl的length参数,将其从原来的20改为200:



    这个时候去运行,发现,程序并没用将数据库的imgurl的长度调为200,还是原来的20,那么我们只好再进数据库中,自己手动调一下imgurl的长度了:

    打开Navicat for MySQL,在其中找到我们的数据库bbs,然后打开该数据库,选中t_person这张表,选择设计表:

    


    接着将imgurl的长度该为200即可:

    


    第六步,我们需要在项目的WebRoot中新建一个名为images的文件夹:
    

    第七步,测试程序运行结果:

    


    


    


    进入到tomcat服务器中可以发现,该图片已经上传成功了:

    


    在控制台也会打印出如下输出结果:

    


    打开数据库,发现里面也会存一个S2SH的数据: 
   


    至此,图片上传功能已实现!

    S2SH整合以及图片上传(7)之解决懒加载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ssh整合 图片上传