java存储图片到数据库

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,?/0 JFIF/0   /0H/0H/0/0?? Exif/0/0MM/0*/0/0/0 /0 /0 /0/0/0 /0 /0/0 /0 /0/0/0 /0/0/0b /0 /0/0/0 /0/0/0j (/0 /0/0/0 /0 /0/0 1/0 /0/0/0 /0/0/0r 2/0 /0/0/0 /0/0/0?i/0 /0/0/0 /0/0/0/0/0/0/0/0/0H/0/0/0 /0/0/0H/0/0/0 Adobe Photoshop CS Windows/02007:03:18 23:08:15/0/0/0/0/0 ?/0 /0/0/0 ??/0/0?/0 /0/0/0 /0/0/0? /0 ........等等
其实就是将文件先转换成了二进制的流,然后插入到了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.*"%> 
< html>     
< body>     
< %   
   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(); 
%>     
< /body>     
< /html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java水果商店系统是一个用Java语言开发的应用程序,用于帮助水果商店管理其商品、订单和用户信息等。该系统具有以下功能: 1. 商品管理:水果商店可以在系统中添加、编辑和删除商品信息。每个商品包括名称、价格、描述和图片等属性。管理员可以随时更新商品信息,以保持与实际存货一致。 2. 订单管理:用户可以在系统中浏览并选择购买商品。用户可以将商品添加到购物车中,然后生成订单。管理员可以查看和管理所有订单,包括订单的状态(待支付、已支付、已发货、已完成等)和付款情况等。 3. 用户管理:系统中可以注册和登录用户。注册用户可以保存个人信息和收货地址,并可以随时编辑和更新。登录用户可以查看自己的订单历史记录并重新购买以前的商品。 4. 库存管理:系统根据订单的生成和处理,自动更新商品的库存数量。当库存数量低于设定的阈值时,管理员可以收到提醒,并及时补充库存。 5. 促销活动:管理员可以设置促销活动,如打折、满减等。在促销期间,商品的价格会自动显示折扣,并可吸引更多用户购买。 6. 数据分析:系统可以生成销售报告和用户统计数据,以帮助水果商店了解商品的热销情况和用户购买行为,从而优化商品和促销策略。 Java水果商店系统的实施可以提高水果商店的运营效率,提供更好的用户体验,并帮助商店更好地管理和分析业务数据。通过互联网的应用,商店可以扩展到更广泛的市场,并与用户建立更紧密的联系和合作关系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值