因为项目需要做了一个简单的使用struts2的图片上传,使用ajax来进行后台提交,进而判断图片的格式,大小,是否符合要求,在存入数据库。当上传新的图片以后,会对旧文件进行删除,同时将删除数据库中相应的数据,在重新插入一条新数据。
具体的代码如下:
java代码
public class UploadAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private File image;//上传的文件
private String imageFileName;//文额件名称
private String imageContentType;//文件类型
private String message;//文件上传提示
private String car_pers_id ;//页面传参驾驶员或者车辆的ID
private String carOrDeiver;//页面传参区分是驾驶员还是车辆
//可上传的图片类型
private String[] imageTypes = {"image/png","image/gif","image/jpeg","image/jpg"};
//可上传文件的大小
private long maxSize= 1024*1024*3;
//修改文件名以后存入数据库的地址
private String pathName;
getter() and setter()-------
private String imgId = getIDByUUID();
public String execute() throws Exception{
if(image != null){
String path = "";
if((message=createFile(carOrDeiver)).equals("picSuccess")){
path = delFilePath(car_pers_id, carOrDeiver);
delTab(car_pers_id, carOrDeiver);
istTab(car_pers_id, carOrDeiver,pathName);
delFile(path);
}
}else{
message = "picNull";
}
System.out.println(message);
return message;
}
//图片上传
public String createFile (String carOrDriver) throws Exception{
String msg = null;
String tempPath = "/images";
if("car".equals(carOrDriver)){
tempPath = "/images/car/";
}else if("driver".equals(carOrDriver)){
tempPath = "/images/pers/";
}
String path = ServletActionContext.getServletContext().getRealPath(tempPath);
String isNull = judegImageNull(image);
if(!"picNull".equals(isNull)){
String isFormate = judegImgFormate(imageContentType);
if(!"picModel".equals(isFormate)){
String isMaxSize = judegImageSize(image);
if(!"picBeyond".equals(isMaxSize)){
String monthPath = createPath();
path += "\\"+monthPath;
System.out.println("path:"+path);
String imageNewName = imgId + imageFileName.substring(imageFileName.lastIndexOf("."));
pathName = monthPath+"\\"+imageNewName;
System.out.println("imageNewName:"+imageNewName);
System.out.println("pathName:"+pathName);
File saveFile = new File(new File(path),imageNewName);
if(!saveFile.getParentFile().exists()){
saveFile.getParentFile().mkdirs();
}
FileUtils.copyFile(image, saveFile);
msg = "picSuccess";
}else{
msg = isMaxSize;
}
}else{
msg = isFormate;
}
}else{
msg = isNull;
}
return msg;
}
//判断上传文件是否是规定的文件格式
private String judegImgFormate(String imageContentType){
String msg = null;
int count=0;
for (int i = 0; i < imageTypes.length; i++) {
if(!imageContentType.equals(imageTypes[i])){
count++;
}
}
if(count==4){
msg = "picModel";
System.out.println(msg);
return msg;
}else{
msg="pic";
System.out.println(msg);
return msg;
}
}
//判断文件上传的大小是否符合要求最大为3M
private String judegImageSize(File image){
String msg = null;
if(image.length()>maxSize){
msg = "picBeyond";
}
return msg;
}
//判断文件是否为空
private String judegImageNull(File image){
String msg = null;
if(image ==null){
msg = "picNull";
}
return msg;
}
//或得UUID组装新的文件名
private String getIDByUUID(){
return UUID.randomUUID().toString().toUpperCase();
}
//按照年月创建文件夹
private String createPath(){
int year = Calendar.getInstance().get(Calendar.YEAR);
int month = Calendar.getInstance().get(Calendar.MONTH)+1;
return year +"\\" + month;
}
//删除数据表中的数据
public boolean delTab(String id,String carOrDriver){
String sql = "";
if("car".equals(carOrDriver)){
sql = "delete from cl_images where cl_id = '"+id+"'";
}else if("driver".equals(carOrDriver)){
sql = "delete from cl_jsyimage where jsyid = '"+id+"'";
}
return DBHelper.delete(sql);
}
//增加数据表中数据
public boolean istTab(String id,String carOrDriver,String tmpPath){
String sql = "";
String picId = imgId;
if("car".equals(carOrDriver)){
sql = new StringBuffer("insert into carimages(image_id,cid,cimage) values ('")
.append(picId)
.append("','")
.append(id)
.append("','")
.append(tmpPath)
.append("')").toString();
}else if("driver".equals(carOrDriver)){
sql = new StringBuffer("insert into deiverimage(image_id,did,dimage) values ('")
.append(picId)
.append("','")
.append(id)
.append("','")
.append(tmpPath)
.append("')").toString();
}
return DBHelper.insert(sql);
}
//删除硬盘上的数据
public void delFile(String path){
File f = new File(path);
if(f.exists()){
if(!f.isDirectory()){
f.delete();
}
}
}
//如果数据库存在数据则获取图片名称
public String delFilePath(String id,String carOrDeiver){
String sql = "";
List <Map<String,Object>> list = null;
String fileName = "";
if("car".equals(carOrDeiver)){
sql = new StringBuffer("select * from carimages t where t.cid = '")
.append(id)
.append("'").toString();
}else if("deiver".equals(carOrDeiver)){
sql = new StringBuffer("select * from deiverimage t where t.did = '")
.append(id)
.append("'").toString();
}
list = DBHelper.query(sql);
if(list.size()==1){
//表中有记录
Map<String,Object> map = list.get(0);
if("0".equals(carOrDeiver)){
fileName = map.get("PICTURE").toString();
}else if("1".equals(carOrDeiver)){
fileName = map.get("JSY_IMAGE").toString();
}
}
String path = "";
if("car".equals(carOrDeiver)){
path = ServletActionContext.getServletContext().getRealPath("/upload/car");
}else if("deiver".equals(carOrDeiver)){
path = ServletActionContext.getServletContext().getRealPath("/upload/pers");
}
path += fileName;
System.out.println(path);
return path;
}
}
struts.xml 代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />
<!--<constant name="struts.objectFactory" value="spring" />-->
<!--解决乱码 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
<constant name="struts.multipart.maxSize" value="10701096"/>
<!-- -->
<package name="upload" extends="struts-default">
<action name="load" class="com.upload.UploadAction">
<result name="picSuccess">/imgResult/success.html</result>
<result name="picNull">/imgResult/picNull.html</result>
<result name="picModel">/imgResult/picModel.html</result>
<result name="picBeyond">/imgResult/picBeyond.html</result>
</action>
</package>
<package name ="show" extends="json-default">
<action name="show" class="com.upload.ShowImgAction" >
<result name="showImg" type="json"></result>
</action>
</package>
</struts>
html页面 代码
<!DOCTYPE html>
<html>
<head>
<title>图片上传</title>
<script type="text/javascript" src="jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="jquery.form.js"></script>
<script type="text/javascript">
$(function(){
ajaxImg();
});
function ajaxImg(){
$("#btn_carInfo_uploadFile").click(function(){
var options = {
url: "load.action",
type: "post",
success: function(data){
if (data.trim() == "picSuccess") {
alert("上传成功!!");
$.post("show!showImg.action?id=0000",function(data){
var url = "..\\images\\car\\"+data.picUrl;
$("#pic").attr("src",url);
});
}else if (data.trim() == "picNull") {
alert("请选择文件!");
}else if (data.trim() == "picModel") {
alert("请上传指定的图片格式!");
}else if (data.trim() == "picBeyond") {
alert("上传文件太大了!");
}else {
alert("上传失败!!");
}
}
};
$("#pic_upload").ajaxForm(options);
});
}
</script>
</head>
<body>
<h2>图片上传</h2><br>
<form id="pic_upload" action="#"
enctype="multipart/form-data" method="post">
文件:<input type="file" name="image">
<input type="submit" id="btn_carInfo_uploadFile" value="上传" />
<input type="text" id ="carOrDeiver" name="carOrDeiver" value="car" />
<input type ="text" id="clid" value="0000" name="car_pers_id" hidden="true"/>
</form>
<br/>
<div>
<img id="pic" style="height: 110px; width: 156px; cursor: pointer" src=""/>
</div>
</body>
</html>