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)之解决懒加载
由于前面的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)之解决懒加载
相关文章推荐
- S2SH整合以及图片上传(3)之hibernate搭建(2)
- S2SH整合以及图片上传(1)之spring搭建
- S2SH整合以及图片上传(5)之struts2的搭建
- S2SH整合以及图片上传(10)之修改信息(1)
- S2SH整合以及图片上传(12)之分页显示
- S2SH整合以及图片上传(7)之解决懒加载
- S2SH整合以及图片上传(9)之删除图片
- S2SH整合以及图片上传(11)之修改信息(2)
- S2SH整合以及图片上传(8)之显示图片
- Spring中文件上传,图片上传以及回显
- Java实现图片的上传以及下载 Tomcat服务器
- thinkphp5 整合plupload实现图片批量上传
- java 上传文件以及各种视频图片!
- Word图片上传控件整合文档(CKEditor3.x)-Xproer.WordPaster
- ASP.NET2.0文件上传以及图片处理
- 于鹏:input实现上传图片的预览以及获取图片的真实尺寸
- java 上传文件以及各种视频图片!
- 使用Ajax以及Jquery.form异步上传图片
- 【SpringMVC整合MyBatis】springmvc上传图片
- Word图片上传控件-eWebEditor9x整合教程-Xproer.WordPaster