前几天突然看到学校音乐站上的图片原来是存储在数据库上的,是二进制而不是使用路径保存的,在网上招了找发现大多介绍的都是hph方式,在这里做个总结,首先要存储二进制文件
在数据库中要搞清楚下面几个内容:
1 mysql存储大容量的二进制文件的格式是blob,其实除了图片还可以存别的
2 要向数据库存储二进制的文件一定要把要存储的数据转换成二进制流
废话就不多说了,大家看看代码很容易明白,先来看一个app程序,当然首先您要在数据库中先建立一个用于保存图片的表和相应的列,数据格式为blob
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.*"%>
< %@ pageimport="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>
分享到:
相关推荐
### JSPSmartUpload 实现数据库中的图片存取 #### 一、引言 在Web开发中,经常需要处理用户上传的文件,特别是图片文件。传统的做法是将这些文件存储在服务器的文件系统中,但这种方法可能会导致文件管理复杂度...
在本系统中,Java主要负责后端逻辑处理,包括数据的存取、业务规则的实现以及服务器与客户端之间的交互。Java的强大之处在于其丰富的类库和强大的多线程支持,使得开发者能够轻松处理复杂的业务需求。 JSP是Java ...
Java的后端处理能力,结合JSP的视图渲染,可以提供高效的数据处理和动态页面展示。而HTML模板则负责页面的静态布局和设计,使得用户界面更加直观和友好。 Tomcat是一款流行的Java应用服务器,特别适合运行JSP应用。...
这份"java jsp_ppt"详细讲解了JSP的核心概念和技术,对于渴望自学JSP的人来说,是一份非常宝贵的资源。 JSP的核心原理是将JSP页面转化为Servlet,Servlet是Java中的一个接口,用于处理HTTP请求。当客户端(如浏览器...
项目可能使用了如MySQL这样的关系型数据库,并通过JDBC(Java Database Connectivity)接口进行数据存取。开发者可能会使用预编译的SQL语句以提高效率和安全性。 4. **MVC模式** 论坛应用通常遵循Model-View-...
【标题】"archive_java+jsp华源网校+西部软件jsp版.zip.zip" 提供的信息表明,这是一个关于Java和JSP技术的教育平台——华源网校的西部软件版本。这个压缩包很可能是包含了该网校课程平台的源代码、文档或者相关教学...
在JSP(Java Server Pages)技术中,session是一种用来跟踪用户状态的机制。由于Web应用通常是无状态的,即每次用户发送请求到服务器,服务器端并不记得这个用户之前的操作,因此为了保持用户的登录状态或者其他信息...
JavaBean是一种符合特定规范的Java类,用于封装数据和业务逻辑,它们可以被Servlet或JSP页面用来存取数据库。 "mysql学习.doc"则专注于MySQL数据库的学习,可能包括了SQL语句、表的创建、查询、更新和删除等基本...
【JAVA JSP MYSQL购物分享系统】是一个基于Java技术,结合JSP(JavaServer Pages)和MYSQL数据库构建的在线平台,旨在提供用户一个分享购物心得、管理个人收藏的环境。在这个系统中,用户不仅可以注册和登录,还能...
1. JSP/Servlet:在Java Web应用中,Servlet通常用来处理图片的读取和写入,JSP则用于展示。 2. 数据库连接池:使用像C3P0或Apache DBCP这样的连接池管理数据库连接,提高性能和资源利用率。 3. 图片URL:为每个图片...
然后,控制器会将请求转发给相应的Java后台服务(Action),Action会执行必要的业务逻辑,比如验证用户输入、存取数据库等。完成处理后,Action会返回一个结果,这个结果可以是一个JSP页面,用于显示处理后的信息或...
在本项目中,Java负责后端逻辑处理,如用户认证、新闻发布、数据存取等,而JSP则作为前端展示,将后端处理的结果以用户友好的方式呈现。 【SQL】 SQL(Structured Query Language)是用于管理关系数据库的标准语言...
"JSP源码——图片浏览小程序(java+applet).zip" 这个标题揭示了我们要讨论的是一个基于Java Server Pages (JSP) 技术的源代码项目,其主要功能是一个用于浏览图片的小应用程序。这里的关键词“java+applet”暗示这个...
【标题】: "基于Java+JSP的企业宣传网站" 是一个使用Java技术和JSP(JavaServer Pages)构建的毕业设计项目。这样的网站通常用于展示企业的基本信息、产品或服务,以及联系方式,以提升企业的在线形象。 【核心知识...
宠物诊所管理系统是一款基于JSP和Java技术开发的综合性管理软件,专为宠物医疗机构设计,用于高效管理和统计关于宠物、宠物主人以及医生的各种信息。在这个系统中,JSP(JavaServer Pages)作为前端展示技术,与后端...
在本系统中,通过JDBC,Java代码可以与MYSQL数据库进行通信,实现数据的存取。 7. **安全与权限控制**:汽车销售系统通常涉及敏感的用户信息和交易数据,因此,安全性和权限控制至关重要。开发者可以利用Java的安全...
1. JDBC:Java与数据库之间的桥梁,用于执行SQL语句,处理数据存取。 2. Servlet:服务器端的Java小程序,处理HTTP请求,实现动态网页。 3. JSTL(JavaServer Pages Standard Tag Library):简化JSP页面,提高...
它支持SQL查询,可以与JSP通过ODBC(Open Database Connectivity)或JDBC(Java Database Connectivity)进行连接,实现数据的存取操作。尽管Access可能不适用于大型高并发的环境,但对于毕业设计级别的项目,它的...
《 ConnDB.java与JSP连接数据库的实现详解》 在Web开发中,数据库连接是不可或缺的一部分,它使得应用程序能够存取、更新和管理数据库中的数据。`ConnDB.java`是Java编程中用于处理数据库连接的一个关键类,尤其在...