当前位置:文档之家› 通过java或jsp想数据库存取二进制图片(精)

通过java或jsp想数据库存取二进制图片(精)

1 MySQL存储大容量的二进制文件的格式是 blob ,其实除了图片还可以存别的2 要向数据库存储二进制的文件一定要把要存储的数据转换成二进制流废话就不多说了, 大家看看代码很容易明白, 先来看一个 app 程序, 当然首先您要在数据库中先建立一个用于保存图片的表和相应的列,数据格式为 blobpackage com.lizhe;import Java.io.*;import java.sql.*;public class PutImg {public void putimg( {try {Class.forName("org.gjt.mm.mysql.Driver".newInstance(;String url ="JDBC:mysql://localhost/img?user=root&password=root&useUnicode=true&characterE ncoding= gbk";Connection conn = DriverManager.getConnection(url;Statement stmt = conn.createStatement(;//stmt.execute("insert into imgt (id values (5";stmt.close(;PreparedStatement pstmt = null;String sql = "";File file = new File("c: log.jpg";InputStream photoStream = new FileInputStream(file; //sql = " UPDATE imgt SET img = ? ";sql = "INSERT INTO imgtable (img VALUES (?"; pstmt = conn.prepareStatement(sql;pstmt.setBinaryStream(1, photoStream, (int file.length(; pstmt.executeUpdate(;pstmt.close(;conn.close(;} catch (Exception e {e.printStackTrace(;}}public static void main(String args[]{PutImg pi=new PutImg(;pi.putimg(;}}InputStream photoStream = new FileInputStream(file;可以很清楚的看到我们首先把一个图片文件 (当然也可以是别的什么文件转换成了一个二进制输入流pstmt.setBinaryStream(1, photoStream, (int file.length(;这个方法建议大家去查一下 API 文档 , 第一个参数是通配符位置没的说 , 第二个参数是流 , 这和以往的 string 类型的参数不太一样 , 我刚看到的时候也觉得豁然开朗了 , 但是到这里还没完 , 不同于以往的字符串参数 , 这里我们还需要第三个参数来设置这个流的长度 , 这里也就是这个文件的长度 , 导出数据库中的 sql, 一切都清楚了INSERT INTO `m_diy` V ALUES (2,? JFIF HH?? ExifMM* b j ( 1 r 2 ?i H H Adobe Photoshop CS Windows2007:03:18 23:08:15 ? ??? ? ........等等其实就是将文件先转换成了二进制的流 , 然后插入到了 sql 语言中 , 向数据库写入了很长很长的一段 sql 语句然后我们再来写一个 app 程序将这个文件读出来 , 存储成一个图片文件package com.lizhe;import Java.io.*;import java.sql.*;class GetImg {private static final String URL ="JDBC:MySQL://localhost/img?user=root&password=root&useUnicode=true&characterEncoding=gbk";private Connection conn = null;private PreparedStatement pstmt = null;private ResultSet rs = null;private File file = null;public void blobRead(String outfile, int picID throws Exception { FileOutputStream fos = null;InputStream is = null;byte[] Buffer = new byte[4096];try {Class.forName("org.gjt.mm.mysql.Driver".newInstance(;conn = DriverManager.getConnection(URL;pstmt = conn.prepareStatement("select img from imgt where id=?"; pstmt.setInt(1, picID; // 传入要取的图片的 IDrs = pstmt.executeQuery(;rs.next(;file = new File(outfile;if (!file.exists( {file.createNewFile(; // 如果文件不存在,则创建}fos = new FileOutputStream(file;is = rs.getBinaryStream("img";int size = 0;while ((size = is.read(Buffer != -1 { // System.out.println(size;fos.write(Buffer, 0, size;}} catch (Exception e {System.out.println( e.getMessage(;} finally {// 关闭用到的资源fos.close(;rs.close(;pstmt.close(;conn.close(;}}public static void main(String[] args { try {GetImg gi=new GetImg(;gi.blobRead("c:/getimgs/1.jpg", 5;} catch (Exception e {System.out.println("[Main func error: ]" + e.getMessage(;}}}这里需要注意的是is = rs.getBinaryStream("img";img 是数据库中相应的列名 , 其实和 rs.getString(方法差不多 , 只不过这个方法是读取二进制流的最后在帖两个 bs 系统上用的文件给大家参考通过 Struts 的 action 向数据库写入二进制图片/** Generated by MyEclipse Struts* Template path: templates/Java/JavaClass.vtl*/package com.lizhe.struts.action;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.Statement;import javax.Servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.upload.FormFile; import com.lizhe.struts.form.UpimgForm;/*** MyEclipse Struts* Creation date: 05-18-2007** XDoclet definition:* @struts.action path="/upimg" name="upimgForm" input="/userhomepage.JSP"* @struts.action-forward name="userhome" path="/userhomepage.jsp"redirect="true" contextRelative="true"*/public class UpimgAction extends Action {/** Generated Methods*//*** Method execute* @param mapping* @param form* @param request* @param response* @return ActionForward* @throws IOException* @throws FileNotFoundException*/public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response throws FileNotFoundException, IOException {UpimgForm upimgForm = (UpimgForm form;// TODO Auto-generated method stubFormFile file=upimgForm.getFile(;InputStream is=file.getInputStream(;try {Class.forName("org.gjt.mm.MySQL.Driver".newInstance(;String url ="JDBC:mysql://localhost/blog?user=root&password=root&useUnicode=true&characterE ncoding= gb2312";Connection conn = DriverManager.getConnection(url;Statement stmt = conn.createStatement(;//stmt.execute("insertinto img (idvalues (5";stmt.close(;PreparedStatement pstmt = null;String sql = "";//File file = new File("c: log.jpg";//InputStream photoStream = new FileInputStream(file;//sql = "UPDA TE imgt SET img =? ";sql = "INSERT INTO img (img VALUES (?";pstmt = conn.prepareStatement(sql;pstmt.setBinaryStream(1, is, (int file.getFileSize(;pstmt.executeUpdate(;pstmt.close(;conn.close(;} catch (Exception e {e.printStackTrace(;}return mapping.findForward("userhomepage";}}和 app 的方式几乎是一样的第二个文件是通过 jsp 将数据库中的图片显示在页面上这个有些不同< %@ page contentType="text/html;charset=gb2312"%> < %@ page import="java.sql.*" %> < %@ page import="java.util.*"%> < %@ page import="java.text.*"%> < %@ page import="java.io.*"%> < %@ pageimport="java.awt.*"%> < html> < body> <%Class.forName("org.gjt.mm.mysql.Driver".newInstance(; Stringurl="jdbc:mysql://localhost/img?user=root&password=root"; Connection con = DriverManager.getConnection(url; String sql = "select * from imgt where id=5";Statement stmt = con.createStatement(; ResultSet rs = stmt.executeQuery(sql;if(rs.next( { InputStream in = rs.getBinaryStream("img"; ServletOutputStream op = response.getOutputStream(; int len; byte[] buf=new byte[1024]; while((len=in.read(buf!=-1 { op.write(buf, 0, len; } op.close(; in.close(; } rs.close(; stmt.close(; con.close(; %> < /body> < /html>。

相关主题