急,请问大家谁有servlet上传图片的例子代码,贴出来,谢谢!

解决方案 »

  1.   

    BLOB字段,二进制LOB,主要存储二进制数据,最长为4G,在J2EE程序中,一般类似于图片和文件的保存。当然也有另一种方法,就把图片和文件保存在硬盘上,数据库中只保存图片的链接地址和文件在服务器上的路径。如果遇到文件和图片比较重要的还是需要保存到数据库中(例如:我们做国土资源项目的时候,好多图片、文件就很重要,需要保存到数据库中),下面我写一个保存文件到数据库的Blob字段和从数据库的Blob字段中获取文件的方法(当然完全应用还要做其他工作,这里就不多说了,如果你不清楚的可以问我):/**
    * 把上传的文件保存到数据库的Blob字段中
    * @param strTableName 对应的表名称
    * @param strColumnName 表中保存文件的Blob字段名称
    * @param inputStream 输入的文件流
    * @param sbSQLWhere where条件
    * @throws java.lang.Exception
    */
    public static void fileUpload(String strTableName,
    String strColumnName,
    InputStream inputStream,
    StringBuffer sbSQLWhere)
    throws Exception {
    Connection con = null;
    ResultSet resultset = null;
    Statement stmt = null;
    try {
    //得到数据库连接
    con = DBConnector.getConnection();
    //构建查询语句
    StringBuffer sbSQL = new StringBuffer();
    sbSQL.append(" UPDATE ");
    sbSQL.append(strTableName);
    sbSQL.append(" SET ");
    sbSQL.append(strColumnName);
    sbSQL.append("=EMPTY_BLOB() ");
    sbSQL.append(sbSQLWhere);
    System.out.println(" update sql value is*******"+sbSQL.toString());
    //获取数据库操作语句
    stmt=con.createStatement();
    //插入空的blob对象
    stmt.executeUpdate(sbSQL.toString());
    con.setAutoCommit(false);
    StringBuffer sbSQLBlob = new StringBuffer();
    sbSQLBlob.append(" SELECT ");
    sbSQLBlob.append(strColumnName);
    sbSQLBlob.append(" FROM ");
    sbSQLBlob.append(strTableName);
    sbSQLBlob.append(sbSQLWhere);
    sbSQLBlob.append(" FOR UPDATE");
    System.out.println(" select sql value is*********"+sbSQL.toString());
    resultset =stmt.executeQuery(sbSQLBlob.toString());
    while (resultset.next()) {
    /* 取出此BLOB对象 */
    oracle.sql.BLOB blob = (oracle.sql.BLOB)resultset.getBlob("BODY");
    /* 向BLOB对象中写入数据 */
    BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
    BufferedInputStream in = new BufferedInputStream(inputStream);
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    in.close();
    out.close();
    }
    con.setAutoCommit(false);
    con.commit();
    } catch (Exception ex) {
    ex.printStackTrace();
    throw ex;
    } finally {
    if (stmt != null) {
    stmt.close();
    }
    If (resultset != null) {
    resultset.close();
    }
    if (con!=null) {
    con.close();
    }
    }
    }
    下面的方法是从数据库中得到上传的文件的输入流,把输入流写到servlet流中,再从页面中获取,servlet就不写了。
    /**
    * 方法描述:得到数据库上传的文件数据
    * 输入参数: 
    * 1:表名(String)
    * 2:字段名(String)
    * 3: Where条件(StringBuffer)
    * 4: 输出流(ServletOutputStream)
    * 输出参数:void
    * 编写人: */
    public static void getdownFile(String strTableName,
    String strColumnName,
    StringBuffer sbSQLWhere,
    ServletOutputStream sos) throws Exception {
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet resultset = null;
    try {
    //得到数据库连接
    con = DBConnector.getConnection();
    StringBuffer sbSQL = new StringBuffer();
    //构建查询语句
    sbSQL.append(" SELECT " + strColumnName + " FROM " + strTableName);
    sbSQL.append(sbSQLWhere);System.out.println(" sql value is:"+sbSQLWhere.toString());
    ps = con.prepareStatement(sbSQL.toString());
    //执行查询
    resultset = ps.executeQuery();
    while (resultset.next()) {
    //读取数据流
    InputStream is = resultset.getBinaryStream(strColumnName);byte[] buf = new byte[2048];
    while(is.read(buf)!=-1) {
    //把数据流按块写到servlet的输出流中
    sos.write(buf);
    }
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    throw ex;
    } finally {
    if (ps != null) {
    ps.close();
    }
    if (resultset != null) {
    resultset.close();
    }
    if (con!=null) {
    con.close();
    }
    }