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>
java存储图片到数据库相关推荐
- java 存储png文件_vue图片上传及java存储图片(亲测可用)
1.前言 在使用elementui的upload组件时,我一直无法做到上传的图片和其他数据一起提交.单纯的上传文件,java的存储图片的方式也有局限性. 我知道的后端保存图片有两种方式:一种是直接存储 ...
- redis java 存储图片_Redis 存储图片 [base64/url/path]vs[object]
一.base64图片编解码 基本流程:从网络获取下载一张图片.然后base64编码,再base64解码,存到本地E盘根文件夹下. import java.awt.image.BufferedImage ...
- java 二进制图片上传_Spring MVC上传图片,Java二进制图片写入数据库,生成略缩图...
背景描述:最近做到一个项目,有个商品登记功能.登记的信息包括:基本信息若干(文字信息):图片信息,要求将图片保存到数据表中的image字段(sql server 数据库) 步骤:1.将图片上传到服务器 ...
- 存储图片到数据库中的一个异常信息
项目中,需要保存上传的图片到数据库中.项目使用的框架是spring+webwork+velocity+hibernate.上传图片后,需要将图片文件File类型转换成Blob类型. 代码写完后,在测试 ...
- SpringBoot 存储图片 tomcat服务器存图片 数据库图片路径
前言:SpringBoot 图片存储存放 域名+图片路径访问 https://xxx.xxx.cn/uploadimage/202206165dc6fd50-3432-4a50-a5c4-14a55 ...
- 如何简单地利用Bitmap为中介储存图片到数据库中
这是我的第一篇博文,请大家多多指教! 大概一个月之前,在跟朋友合作开发一个APP的过程中,我们发现到一个问题:图片的存储.因为数据库没有图片这种数据类型,当用户上传的图片需要存储的时候,我们无 ...
- 用Java或Jsp向数据库存取二进制图片
2019独角兽企业重金招聘Python工程师标准>>> 前几天突然看到学校音乐站上的图片原来是存储在数据库上的,是二进制而不是使用路径保存的,在网上招了找发现大多介绍的都是hph方式 ...
- java将图片保存进mysql_Java存储图片到Mysql
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [1]视图层 action="${ctx}/web/UserInforServlet?method=userInforServlet" ...
- java用mysql存储图片_Java存储图片到Mysql
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [1]视图层 action="${ctx}/web/UserInforServlet?method=userInforServlet" ...
最新文章
- 网络摄像头+net_今日 Paper | 神经网络结构搜索;视觉目标;人物识别;视频3D人体姿态估计等...
- 普通平键的主要尺寸有_快来收下这份家装尺寸表,衣柜不再鸡肋
- mysql base64 乱码_PHP base64编码后解码乱码的解决办法
- php date 毫秒_swoole+PHP自动取消订单he还原库存
- 如何用控制台启动一个wcf服务
- Linux两个网卡mac地址重复,ARP响应Linux服务器上的单个MAC地址,同一网络上有多个接口...
- 《Python算法教程简及PDF电子版下载
- 借助WinPE进行Windows系统安装
- FZU 2122 又见LKity
- 搜索引擎优化主要对网站哪些方面做优化
- 1049: 平方和与立方和 Python
- 【教育教学资源】教育资讯、教学功能、当老师、或者补习班给学生的资料
- JRUL数字交流三相电流继电器
- 微信文件撤回时间多长_微信中文件撤回时间延长至多久?
- 如何高效地做设计评审
- 设计模式 - 漫谈软件编程背后的系统化思维
- 【不收藏一定后悔】超智能三子棋——和电脑比一把
- 使用vite安装vue3.0(不是脚手架)
- 通信原理 | FFT/STFT 你真的学会了吗?
- 程序员新人面临最尴尬的事:需要工作积累经验,需要有经验才能找到工作!到底怎么办?...
热门文章
- 1恢复 群晖raid_群晖raid5数据恢复(一看就会的恢复软件)
- Python导出当前环境依赖包及项目依赖包
- 图书馆管理系统 13-架构设计
- linux中time命令详解、脚本监控记录系统硬盘io值、定位linux系统中await值过高占用的盘、定位占用硬盘IO高的程序、iotop命令说明、lsof使用说明【可定位端口所占用程序等】
- php5.4支持反代,用免费的香港php虚拟主机反代美国鸡建站,真香~~
- Revit二次开发:获取所有工作集、活动工作集、指定工作集下的 所有构件
- 推荐算法_02_协同过滤算法(ItemCF和UserCF)
- easyexcel 遇到的问题 org.terracotta.statistics.StatisticsManager.tags([Ljava/lang/String;)Ljava/util/Set;
- osg 三维gis开发_GIS+BIM跨界融合应用:智能管理道路“健康”,精准定位路桥病害...
- 构建之法10,11,12章的读后感