如题,我的表里有3个blob字段,需求用户同时上传这3张图片到数据库,但是上传之后,发现图片位置借位,第一张和最后一张图片会互换位置,我仔细查看代码没有发现问题,经过多次测试发现当上传>=2张图片的时候会发生这种问题,测试通过针对其中某一个字段单个保存可以正常保存,但是当>=2张时会出现上面问题。
下面是hibernate配置文件<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.jeecms.cms.entity.cep">
<class name="CepUserFleet" table="T_USER_FLEET">
<id name="id" type="java.lang.Integer" column="id">
<generator class="sequence"><param name="sequence">T_USER_FLEET_SEQ</param></generator>
</id>
<property name="userId" column="USER_ID" type="java.lang.Integer" not-null="true" />
<property name="loginName" column="LOGIN_NAME" type="string" not-null="true" />
<property name="userName" column="USER_NAME" type="string" not-null="true" />
<property name="cardNumber" column="CARD_NUMBER" type="string" />
<property name="cardNumberScann" column="CARD_NUMBER_SCANN" type="java.sql.Blob" />
<property name="carNum" column="CAR_NUM" type="java.math.BigDecimal" />
<property name="legalCardNum" column="LEGAL_CARD_NUM" type="string" />
<property name="legalName" column="LEGAL_NAME" type="string" />
<property name="legalCardCopy" column="LEGAL_CARD_COPY" type="java.sql.Blob" />
<property name="businessLicenseNum" column="BUSINESS_LICENSE_NUM" type="string" />
<property name="businessLicenseScann" column="BUSINESS_LICENSE_SCANN" type="java.sql.Blob" />
<property name="companyName" column="COMPANY_NAME" type="string" />
<property name="companyAddress" column="COMPANY_ADDRESS" type="string" />
<property name="companyZipCode" column="COMPANY_ZIPCODE" type="string" />
<property name="companyPhone" column="COMPANY_PHONE" type="string" />
<property name="companyFax" column="COMPANY_FAX" type="string" />
<property name="person" column="PERSON" type="string" />
<property name="phone" column="PHONE" type="string" />
<property name="email" column="EMAIL" type="string" />
<property name="mobile" column="MOBILE" type="string" />
<property name="createTime" column="CREATE_TIME" type="timestamp" length="19"/>
<property name="updateTime" column="UPDATE_TIME" type="timestamp" length="19"/>
</class>
</hibernate-mapping>
Entity类如下:package com.jeecms.cms.entity.cep.base;import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Blob;
import java.util.Date;public abstract class BaseCepUserFleet implements Serializable {
public BaseCepUserFleet() {
} public BaseCepUserFleet(Integer id) {
this.id = id;
}
private Integer id;
private Integer userId;
private String userName;
private String loginName;
private String cardNumber;
private Blob cardNumberScann;
private BigDecimal carNum;
private String legalCardNum;
private String legalName;
private Blob legalCardCopy;
private String businessLicenseNum;
private Blob businessLicenseScann;
private String companyName;
private String companyAddress;
private String companyZipCode;
private String companyPhone;
private String companyFax;
private String person;
private String phone;
private String mobile;
private String email;
private Date createTime;
private Date updateTime; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public Integer getUserId() {
return userId;
} public void setUserId(Integer userId) {
this.userId = userId;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getLoginName() {
return loginName;
} public void setLoginName(String loginName) {
this.loginName = loginName;
} public String getCardNumber() {
return cardNumber;
} public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
} public BigDecimal getCarNum() {
return carNum;
} public void setCarNum(BigDecimal carNum) {
this.carNum = carNum;
} public String getLegalCardNum() {
return legalCardNum;
} public void setLegalCardNum(String legalCardNum) {
this.legalCardNum = legalCardNum;
} public String getLegalName() {
return legalName;
} public void setLegalName(String legalName) {
this.legalName = legalName;
} public String getBusinessLicenseNum() {
return businessLicenseNum;
} public void setBusinessLicenseNum(String businessLicenseNum) {
this.businessLicenseNum = businessLicenseNum;
} public String getCompanyAddress() {
return companyAddress;
} public void setCompanyAddress(String companyAddress) {
this.companyAddress = companyAddress;
} public String getCompanyZipCode() {
return companyZipCode;
} public void setCompanyZipCode(String companyZipCode) {
this.companyZipCode = companyZipCode;
} public String getCompanyPhone() {
return companyPhone;
} public void setCompanyPhone(String companyPhone) {
this.companyPhone = companyPhone;
} public String getCompanyFax() {
return companyFax;
} public void setCompanyFax(String companyFax) {
this.companyFax = companyFax;
} public String getPerson() {
return person;
} public void setPerson(String person) {
this.person = person;
} public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
} public String getMobile() {
return mobile;
} public void setMobile(String mobile) {
this.mobile = mobile;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
} public Date getUpdateTime() {
return updateTime;
} public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
} public String getCompanyName() {
return companyName;
} public void setCompanyName(String companyName) {
this.companyName = companyName;
} public Blob getCardNumberScann() {
return cardNumberScann;
} public void setCardNumberScann(Blob cardNumberScann) {
this.cardNumberScann = cardNumberScann;
} public Blob getLegalCardCopy() {
return legalCardCopy;
} public void setLegalCardCopy(Blob legalCardCopy) {
this.legalCardCopy = legalCardCopy;
} public Blob getBusinessLicenseScann() {
return businessLicenseScann;
} public void setBusinessLicenseScann(Blob businessLicenseScann) {
this.businessLicenseScann = businessLicenseScann;
}}
package com.jeecms.cms.entity.cep;import java.math.BigDecimal;
import java.sql.Blob;
import java.util.Date;import com.jeecms.cms.entity.cep.base.BaseCepUserFleet;public class CepUserFleet extends BaseCepUserFleet {
private static final long serialVersionUID = 1L;

public CepUserFleet() {
super();
}
}
测试不上传文件直接从磁盘上读取特定文件代码保存到数据库,位置错乱。CepUserFleet fleet=cepUserFleetMng.findByUserIdOrUserName(vo.getUserFleet().getUserId(), null);
if(fleet!=null){
fleet.setCardNumber(vo.getUserFleet().getCardNumber());
fleet.setLegalName(vo.getUserFleet().getLegalName());
fleet.setLegalCardNum(vo.getUserFleet().getLegalCardNum());
fleet.setBusinessLicenseNum(vo.getUserFleet().getBusinessLicenseNum());
fleet.setCompanyName(vo.getUserFleet().getCompanyName());
fleet.setCompanyPhone(vo.getUserFleet().getCompanyPhone());
fleet.setCompanyZipCode(vo.getUserFleet().getCompanyZipCode());
fleet.setCompanyFax(vo.getUserFleet().getCompanyFax());
fleet.setCompanyAddress(vo.getUserFleet().getCompanyAddress());
fleet.setPerson(vo.getUserFleet().getPerson());
fleet.setMobile(vo.getUserFleet().getMobile());
fleet.setPhone(vo.getUserFleet().getPhone());
fleet.setEmail(vo.getUserFleet().getEmail());
fleet.setUpdateTime(vo.getUserFleet().getUpdateTime());
fleet.setCarNum(vo.getUserFleet().getCarNum());
/*
//upload
if(vo.getUserFleet().getCardNumberScann()!=null){
fleet.setCardNumberScann(vo.getUserFleet().getCardNumberScann());
}
if(vo.getUserFleet().getLegalCardCopy()!=null){
fleet.setLegalCardCopy(vo.getUserFleet().getLegalCardCopy());
}
if(vo.getUserFleet().getBusinessLicenseScann()!=null){
fleet.setBusinessLicenseScann(vo.getUserFleet().getBusinessLicenseScann());
}*/
//test
try {
fleet.setCardNumberScann(Hibernate.createBlob(new FileInputStream("F:/test3/08103204ugzb.jpg")));
fleet.setLegalCardCopy(Hibernate.createBlob(new FileInputStream("F:/test3/08103157nxg0.jpg")));
fleet.setBusinessLicenseScann(Hibernate.createBlob(new FileInputStream("F:/test3/08103202iido.jpg")));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}else{
fleet=vo.getUserFleet();
}
cepUserFleetMng.saveOrUpdate(fleet);
下面是数据库表结构
CARD_NUMBER_SCANN       BLOB
LEGAL_CARD_COPY         BLOB
BUSINESS_LICENSE_SCANN  BLOB

解决方案 »

  1.   

    看不出来 是不是你jsp页面错了
      

  2.   

    上传的图片没问题,我后面为了测试改成了保存固定3张图片,分别按顺序对应数据库的那3个blob字段,看我上面的代码,我把它贴在下面,这样同样会出现我说的互换的问题。
     /*
                        //upload
                        if(vo.getUserFleet().getCardNumberScann()!=null){
                            fleet.setCardNumberScann(vo.getUserFleet().getCardNumberScann());
                        }
                        if(vo.getUserFleet().getLegalCardCopy()!=null){
                            fleet.setLegalCardCopy(vo.getUserFleet().getLegalCardCopy());
                        }
                        if(vo.getUserFleet().getBusinessLicenseScann()!=null){
                            fleet.setBusinessLicenseScann(vo.getUserFleet().getBusinessLicenseScann());
                        }*/
                        //test
                        try {
                            fleet.setCardNumberScann(Hibernate.createBlob(new FileInputStream("F:/test3/08103204ugzb.jpg")));
                            fleet.setLegalCardCopy(Hibernate.createBlob(new FileInputStream("F:/test3/08103157nxg0.jpg")));
                            fleet.setBusinessLicenseScann(Hibernate.createBlob(new FileInputStream("F:/test3/08103202iido.jpg")));
                        } catch (Exception e) {
                            // TODO: handle exception
                            e.printStackTrace();
                        }还有关于图片保存的问题我以前做项目都是存路径的,现在我的那个2b老大非要存数据库,问他怎么解决老是左顾而言他,BS这种鸟人,啥都不懂都老在说要这样要那样,B一样的.
      

  3.   

    fleet.setCardNumberScann(Hibernate.createBlob(new FileInputStream("F:/test3/08103204ugzb.jpg")));
                            fleet.setLegalCardCopy(Hibernate.createBlob(new FileInputStream("F:/test3/08103157nxg0.jpg")));
                            fleet.setBusinessLicenseScann(Hibernate.createBlob(new FileInputStream("F:/test3/08103202iido.jpg")));
    我记得好象要先建立个空的吧 然后再转进去..
      

  4.   

    晕,这位仁兄没看我上面的代码啊,
    cepUserFleetMng.saveOrUpdate(fleet);
    这个是services层的代码,下面是调的daopublic CepUserFleet saveOrUpdate(CepUserFleet bean) {
    // TODO Auto-generated method stub
    CepUserFleet resultFleet=null;
    if(bean!=null){
    if(bean.getId()!=null && bean.getId().intValue()>-1){
    // resultFleet=updateByUpdater(bean);
    resultFleet=cepUserFleetDao.update(bean);
    }else{
    resultFleet=save(bean);
    }
    }
    return resultFleet;
    }
      

  5.   

    页面显示没有问题,而且就算不看显示,直接在oracle中查看这个字段,显示的图片也是不对的
      

  6.   


    fleet.setCardNumberScann(EMPTY_BLOB());
    fleet.setCardNumberScann(Hibernate.createBlob(new FileInputStream("F:/test3/08103204ugzb.jpg")));试下
      

  7.   

    你的代码中new了3个文件流对象,流写入图片的速度肯定没有代码执行的速度快,也就是说上面流还没写入结束下面的流又开始执行, 电脑在处理的时候就会出问题.
      

  8.   

    现在的问题是3张图片都能保存成功,只是保存的位置不对,如果说流没有结束这种说法,我不是很明白你的意思。
    fleet.setCardNumberScann(Hibernate.createBlob(new FileInputStream("F:/test3/08103204ugzb.jpg")));
    上面这段代码写在了一起,如果分开来写就是这样。
    InputSteam ins=new FileInputStream("F:/test3/08103204ugzb.jpg");
    Blob bb=Hibernate.createBlob(ins);
    fleet.setCardNumberScann(bb);
    这个按顺序执行,如果没有结束,我不明白图片为什么会保存成功。况且这个我是用来做测试用的。正常的代码读取上盘到服务器MultipartHttpServletRequest multipartRequest  =  null;
    try {
    multipartRequest  =  (MultipartHttpServletRequest) request;
    } catch (Exception e) {
    // TODO: handle exception
    }
    if(multipartRequest!=null){
    //用户身份证号码扫描件
    MultipartFile imgFile1=  multipartRequest.getFile("userIdentityCardScan_"+suffix);
    System.out.println("===用户身份证号码:start");
    System.out.println("file1:"+imgFile1.getOriginalFilename());
    List<String> fileTypes1=new ArrayList<String>();
    // Object[] obj1=CepStringJudgeUtils.uploadFileByFieldName(fileTypes1, imgFile1);
    Object[] obj1=uploadFileByFieldName(fileTypes1, imgFile1);
    if(obj1!=null){
    if(obj1[0]==null){
    errors.addErrorCode("error.cep.register.required","用户身份证号码扫描件");
    return;
    }
    if("uploadFileByFieldName.filetype.error".equals(obj1[2])){
    String allowFileType=CepStringJudgeUtils.addJoinString(fileTypes1, ",");
    errors.addErrorCode("error.cep.register.filetype","用户身份证号码扫描件",allowFileType);
    return;
    }
    Blob contentFile=(Blob) obj1[0];
    vo.setUserIdentityCardScan(contentFile);
    System.out.println("####blob1:"+contentFile);
    System.out.println("####blob3:"+vo.getUserIdentityCardScan());
    }
    System.out.println("===用户身份证号码:end");
    }
    public Object[] uploadFileByFieldName(List<String> fileTypes,MultipartFile uploadFile){
    if(uploadFile!=null){
    MultipartFile imgFile  =  uploadFile;

    String fileName = imgFile.getOriginalFilename();
    // 获取上传文件类型的扩展名,先得到.的位置,再截取从.的下一个位置到文件的最后,最后得到扩展名
    String ext = fileName.substring(fileName.lastIndexOf(".") + 1, fileName
    .length());
    // 对扩展名进行小写转换
    ext = ext.toLowerCase();
    //判断是否有上传联盟图片
    if(CepStringJudgeUtils.StrisNull(fileName)) return null;
    boolean flag=true;
    if(fileTypes!=null && fileTypes.size()>0){
    if (fileTypes.contains(ext)) {
    }else{
    flag=false;
    }
    }
    Blob allImages=null;
    String errors="";
    if (flag) { // 如果扩展名属于允许上传的类型,则创建文件
    try {
    if(imgFile!=null){
    allImages = Hibernate.createBlob(imgFile.getBytes());

    }

    } catch (IllegalStateException e) {
    errors="uploadFileByFieldName"+e.getMessage();
    } catch (IOException e) {
    errors="uploadFileByFieldName"+e.getMessage();
    }
    } else {
    errors="uploadFileByFieldName.filetype.error";
    return null;
    }
    System.out.println("####blob2:"+allImages);
    System.out.println("####imgFile:"+imgFile.getOriginalFilename());
    Object[] obj={allImages,ext,errors};
    return obj;
    }
    return null;
    }上面的代码是调用的spring的上传控件获得的blob对象,
    对于你的这种说法我是不能认同的.