[转帖]如何通过java或jsp向数据库存取二进制图片_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2684 | 回复: 0   主题: [转帖]如何通过java或jsp向数据库存取二进制图片        下一篇 
    本主题由 koei 于 2014-5-2 16:21:45 移动
happy
注册用户
等级:上尉
经验:681
发帖:38
精华:0
注册:2013-4-22
状态:离线
发送短消息息给happy 加好友    发送短消息息给happy 发消息
发表于: IP:您无权察看 2013-4-26 14:41:18 | [全部帖] [楼主帖] 楼主

要存储二进制文件在数据库中要搞清楚下面几个内容:

1 mysql存储大容量的二进制文件的格式是blob,其实除了图片还可以存别的

2 要向数据库存储二进制的文件一定要把要存储的数据转换成二进制流

废话就不多说了,大家看看代码很容易明白,先来看一个app程序,当然首先您要在数据库中先建立一个用于保存图片的表和相应的列,数据格式为blob

package 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&characterEncoding=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:\blog.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` VALUES (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); // 传入要取的图片的ID
            rs = 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 stub
            FormFile 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&characterEncoding=gb2312;
                  Connection conn = DriverManager.getConnection(url);
                  Statement stmt = conn.createStatement();
                  //stmt.execute(insert into img (id) values (5));
                  stmt.close();
                  PreparedStatement pstmt = null;
                  String sql = ;
                  //File file = new File(c:\blog.jpg);
                  //InputStream photoStream = new FileInputStream(file);
                  //sql = UPDATE 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.*%>
<%@ page import=java.awt.*%>
<%
Class.forName(org.gjt.mm.mysql.Driver).newInstance();
String url=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();
%>


该贴由koei转至本版2014-5-2 16:21:45



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论