CREATE TABLE`abc`.`images` (
`name` varchar(10) NOT NULL,
`changdu` int(10) unsigned NOT NULL,
`content` longblob NOT NULL,
PRIMARY KEY (`name`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8
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/htmlcharset=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 * fromimgt 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>
插入图片到数据库代码片段private Connection conn = null
private PreparedStatement pstmt = null
private static final String sql = "INSERT INTO images_info(image_id,image_name,image_size,image_date,image_type,image_description,author,image_data)VALUES(null,?,?,now(),?,?,?,?)"
public boolean addPhoto(ImageVo imageVo) {
boolean flag = false
try{
//将文件转换为流文件
InputStream photoStream = new FileInputStream(imageVo.getImageData())
//获取数据库连接
conn = ConnectionFactory.getConnection()
pstmt = conn.prepareStatement(sql)
pstmt.setString(1, imageVo.getImageName())
pstmt.setInt(2, imageVo.getImageSize())
pstmt.setString(3 , "jpg")//图片类型
pstmt.setString(4, imageVo.getDescription())
pstmt.setString(5, imageVo.getAuthor())
pstmt.setBinaryStream(6, photoStream, (int)imageVo.getImageData().length())
int row = pstmt.executeUpdate()
if(row == 1){
flag = true
}
}catch(FileNotFoundException fe){
fe.printStackTrace()
}catch(SQLException e){
e.printStackTrace()
}finally{
if(null != pstmt){
try{pstmt.close()}
catch(SQLException e){
e.printStackTrace()
}
}
if(null != conn){
try{conn.close()}
catch(SQLException e){
e.printStackTrace()
}
}
}
return flag
}
jsp上传图片到数据,在数据库中有一种类型就是blob存储类型,就是用于储存二进制的。在java.sql里面的PreparedStatment有个setBlob()方法存入数据库,还有ResultSet里的getBlob()就是读取,详情你可以看JDBC Blob如何使用。在jsp里上传图片很少用上述方式存储到数据库中,一般是将图片上传到服务器项目目录文件夹中,然后数据库中保存该图片文件的地址,如/item/upload/images/我上传的图片.jpg
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)