JSP在做上传图片时,如何将图片保存到数据库?
是不是要先将图片转化格式?
在控制过程中如何来获取上传的图片信息?文本时是request.getParatemer("..");来获取的,图片又是怎么样的呢?

解决方案 »

  1.   

    这是JSP应用开发技术(柳永坡等编)中的一个例子,希望对你有所帮助package ch14.binaryFile;import java.sql.*;
    import java.io.*;
    import java.nio.*;/**
     * 针对数据库字段的image和varbinary的存取
     */
    public class UploadPicture {
    // 定义数据库连接
    private Connection conn; /**
    * 使用指定的连接构造
    * @param conn 数据库连接
    */
    public UploadPicture(Connection conn) {
    this.conn = conn;
    if (this.conn == null) //如果没有初始化连接,默认初始化
    initConn();
    } /**
    * 默认的数据库连接
    * 当构造函数的conn为null时调用,做演示用
    */
    private void initConn() {
    String user = "root";
    String password = "root";
    String driverstr = "org.gjt.mm.mysql.Driver";
    String url = "jdbc:mysql://localhost/sql_test";
    try {
    Class.forName(driverstr).newInstance();
    conn = DriverManager.getConnection(url, user, password);
    } catch (Exception e) {
    e.printStackTrace();
    }
    } /**
    * 保存图像文件到数据库指定的位置
    * @param sqlstr 指定位置的sql语句
    * @param file 指定图像文件
    * @return 保存成功返回true,否则返回false
    */
    public boolean storeImage(String sqlstr, File file) {
    try {
    //打开文件
    FileInputStream fin = new FileInputStream(file);
    //建一个缓冲保存数据
    ByteBuffer nbf = ByteBuffer.allocate((int) file.length());
    byte[] array = new byte[1024];
    int offset = 0, length = 0;
    //读存数据
    while ((length = fin.read(array)) > 0) {
    //nbf.put(array, offset, length);
    if (length != 1024)
    nbf.put(array, 0, length);
    else
    nbf.put(array);
    offset += length;
    }
    //关闭文件
    fin.close();
    //新建一个数组保存要写的内容
    byte[] content = nbf.array();
    //保存数据
    return setImage(sqlstr, content);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    //如果发生文件读写错误都会返回false
    return false;
    } /**
    * 保存字节数组到数据库指定位置
    * @param sqlstr 描述位置的sql语句
    * @param in  要保存的字节数组
    * @return 返回是否成功保存
    */
    private boolean setImage(String sqlstr, byte[] in) {
    boolean flag = false;
    if (sqlstr == null)
    sqlstr = "select * from picture_table";
    try {
    Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_UPDATABLE);
    ResultSet rs = stmt.executeQuery(sqlstr);
    if (rs.next()) {
    //rs.updateString(1, "01");
    rs.updateBytes(2, in);
    rs.updateRow();
    }
    else {
    rs.moveToInsertRow();
    rs.updateString(1, "01");
    rs.updateBytes(2, in);
    rs.insertRow();
    }
    rs.close();
    flag = true;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return flag;
    } /**
    * 从数据库指定位置获取图像文件
    * @param sqlstr 描述数据库位置的sql语句
    * @param file  图像文件保存路径
    * @return 是否正确返回文件
    */
    public boolean retrieveImage(String sqlstr, File file) {
    boolean flag = false;
    if (sqlstr == null)
    sqlstr = "select content from picture_table";
    try {
    Statement stat = conn.createStatement();
    ResultSet rs = stat.executeQuery(sqlstr);
    while (rs.next()) {
    byte[] content = rs.getBytes(1);
    if (!rs.wasNull()) //找到数据
    {
    flag = true;
    //保存到指定文件
    FileOutputStream fout = new FileOutputStream(file);
    fout.write(content);
    ;
    fout.flush();
    fout.close();
    }
    //保存第一条纪录,跳出
    break;
    }
    //关闭连接
    rs.close();
    stat.close();
    } catch (SQLException sqle) {
    sqle.printStackTrace();
    } catch (Exception e) {
    e.printStackTrace();
    flag = false; //如果有io错误则不成功
    }
    return flag;
    } //测试
    public static void main(String[] args) {
    String filePath = "";
    UploadPicture iop = new UploadPicture(null);
    try { //使用一个图片作为测试文件
    filePath = FilePath.getFilePath("\\01.jpg");
    File file = new File(filePath);
    if (iop.storeImage(null, file))
    System.out.println("true");
    else
    System.out.println("false");
    filePath = FilePath.getFilePath("\\001.jpg");
    file = new File(filePath);
    if (iop.retrieveImage(null, file))
    System.out.println("true");
    else
    System.out.println("false");
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  2.   

    利用二进制去存取图片信息:
    FileInputStream fis=null; 
    File file = new File("z.jpg"); 
    try{ 
    fis = new FileInputStream(file); 

    catch(FileNotFoundException e) {} 
    PreparedStatement ps = con.prepareStatement("insert into binary_data values (?,?,?,?,?,?)"); ps.setBinaryStream(3,fis,3098);