图片上传到服务器

本文介绍了一种改进的文件上传方案,避免了直接将文件作为Blob存储到Oracle数据库中导致的死锁问题。通过将文件保存在服务器上,并将文件路径存入数据库的方式,提高了系统的稳定性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用控件上传文件
起初方法:直接把文件写入数据库(Oracle)。由于Oracle字段Blob的特殊性,查阅了很多资料。Dao层的代码如下:

	public void saveByBlob (Banyan banyan,FormFile fileName) throws SQLException, IOException{
		banyan.setImage(Hibernate.createBlob(new byte [1]));
		getHibernateTemplate().save(banyan);
		getHibernateTemplate().flush();
		getHibernateTemplate().update(banyan);
		getHibernateTemplate().refresh(banyan, LockMode.UPGRADE);
 
		SerializableBlob serializableBlob = (SerializableBlob) banyan.getImage();
        java.sql.Blob javablob = serializableBlob.getWrappedBlob() ;
        oracle.sql.BLOB blob = (oracle.sql.BLOB) javablob ;
        BufferedInputStream in = new BufferedInputStream(
        		fileName.getInputStream());
        BufferedOutputStream out = new BufferedOutputStream(blob
                .getBinaryOutputStream());
        
        byte [] buffer =new byte[102400];
		int len;
		buffer =new byte[102400];
		while((len=in.read(buffer))!=-1){
			out.write(buffer,0,len);
		}
		in.close();
		out.flush();
		out.close();
	}


这样的做法是,经常会碰到死锁现象,卡在那。。。不懂是什么情况。。。

成功使用方法:把文件传到服务器,然后把该文件在服务器上的地址存到数据库。又由于利用控件来操作。SmartUpload.initialize(config, request, response);涉及到config的,试了很多办法还是不懂得怎么在action或dao层进行,所以改用在servlet。其中jsp页面里要注意的是:form标签里要增加enctype="multipart/form-data"  。

public class ServletBanyanAdd extends HttpServlet {
	private ServletConfig config;

	final public void init(ServletConfig config) throws ServletException {
		this.config = config;
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub

				
		//设置图片存储命名为:urlPattern+文件名,避免重复的名字。
		String urlPattern = banyan.getBanyanId().toString()+"-";
		SmartUpload mySmartUpload = new SmartUpload();
		String fileName=null;
		try {
			mySmartUpload.initialize(config, request, response);
			mySmartUpload.upload();
			for (int i = 0; i < mySmartUpload.getFiles().getCount(); i++) {
				com.jspsmart.upload.File myfile = mySmartUpload.getFiles()
						.getFile(i);
                                                                if (StringUtil.isNotNull(myfile.getFileName())) {
					fileName = urlPattern + myfile.getFileName().toLowerCase();
					myfile.saveAs("/upload/" + fileName);
					banyan.setPicture("/bms/upload/" + fileName);
				}			}
		} catch (Exception e) {
		}
		
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

 

 判断图片格式和大小的js,页面使用方法:<html:file property="picture" onchange="return checkType('picture');"></html:file>

function checkType(fieldName)//检查图片格式以及大小的函数
{
        var string = document.all[fieldName].value;
        if(string==null||string=="")
        return true;
        else{
          string=string.toLowerCase();
          var len=string.length;
          var  suffix=string.substring(string.lastIndexOf('.'));
          //var suffix=string.substring(len-4,len);          
          if(!(suffix==".jpg"||suffix==".gif"||suffix==".png"||suffix==".bmp"))
            {
                alert("上传图片格式不对");
                //obj.focus();
                document.all[fieldName].select();
                document.execCommand('Delete');//清空上传文件空间内容
                document.all[fieldName].focus();
                return false;
            }
           var   img=new   Image();
           img.src = document.all[fieldName].value;
           if(img.fileSize/1024>1024)
            {
                alert("上传的图片超过1M");
                document.all[fieldName].select();
                document.execCommand('Delete');//清空上传文件空间内容
                document.all[fieldName].focus();
                return false;
            }

           return true;
         }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值