将图片保存到数据库的处理

来源:互联网 发布:奈何 君子以泽网络结局 编辑:程序博客网 时间:2024/05/16 08:35

其实将图片保存在数据库中不外乎两种方式。

1,图片文件保存在硬盘上,数据库中负责记录路径(不管是绝对路径还是相对路径)。

2,图片直接以二进制的形式保存在数据库中。

 

两者各有优势

1,存储的文件显而易见,而且实现方便。当然掉包也方便。

麻烦的地方就是管理,比如路径以及关联内容的识别管理。程序移植不变。

 

2,管理方便。全sql管理。图片文件及其相关的内容可以方便检索和识别。

不便就是写程序麻烦一点。当然这一点在现在来说,也是不值得一提。封装好的库包不需要再动脑筋想事。

还有就是当图片文件大和非常多的时候,将可能严重影响数据库的性能。

 

当然还有很多异同都可以自己体会,具体选择哪种方式,依据自身情况而定。

 

下面说说二进制保存的例子。

在将图片文件添加到数据库的时候,需要预处理一下。
1,将图片文件转换成二进制
2, 对二进制分析,提取文件数据,剔除头部和尾部
3, 然后就可以将二进制数据保存在对应的image类型的字段中了。

读取图片数据的时候,指定一下文件格式。图片就还原了。

 

这是一段n久前写的vb代码:

这段是页面上传图片文件的处理过程。request是form过来的。

 

又兴趣的可以研究下,不进行处理,数据库中的相应字段存放的内容是什么,然后在看看处理后,字段存放的二进制代码内容又有什么差异。

读取的时候:
function getSignature(id)
set rs=server.createobject("ADODB.recordset")
sql="select * from test_img where id=" & id
rs.open sql,conn,1,1
'Response.ContentType = "text/html" '显示图片的格式也可以用
Response.ContentType = "image/gif"' 以gif显示
'Response.ContentType = "image/jpg" '以jpg显示
Response.BinaryWrite rs("img")  '显示图片
rs.close
end function

 

 

Java版本的处理过程。

 

这里需要注意 pstmt.setBinaryStream(2,fis,(int)file.length) 需要加(int)。 很奇怪的。

没有强制转换,居然能报错。虽然file.length()返回的是long。抑或sun还需要在加个函数setBinaryStream(int,InputStream,long)重载一下。

Exception in thread "main" java.lang.AbstractMethodError: com.microsoft.jdbc.base.BasePreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V

 

为什么这段Java代码没有预处理呢,只能归功于java.sql中已经实现了,我们就随便用就行了。

 再补充一个例子的二进制文件:

这个是图片文件存储到数据库中的二进制表示形式:

 

而在本地磁盘中,文件的二进制表示形式为:

 本地图片文件二进制形式