如何往数据库中存图片

如何往数据库中存图片,第1张

两种,一种是将转化成二进制数据流存入数据库中。一种是保存的路径,然后前台读取路径去调用。相关的代码百度一下应该会有,第二种方法实现上比较简单,就是存储路径,然后根据路径读取对应的显示出来。第一种就比较麻烦,要先把转化成二进制数据,读取时就是从数据库读取对应数据再转化成显示出来。

通常对用户上传的需要保存到数据库中。解决方法一般有两种:一种是将保存的路径存储到数据库;另一种是将以二进制数据流的形式直接写入数据库字段中。以下为具体方法:

一、保存的上传路径到数据库:

string uppath="";//用于保存上传路径

//获取上传的文件名

string fileFullname = thisFileUpload1FileName;

//获取上传的时间,以时间作为的名字可以防止重名

string dataName = DateTimeNowToString("yyyyMMddhhmmss");

//获取的文件名(不含扩展名)

string fileName = fileFullnameSubstring(fileFullnameLastIndexOf("\\") + 1);

//获取扩展名

string type = fileFullnameSubstring(fileFullnameLastIndexOf("") + 1);

//判断是否为要求的格式

if (type == "bmp" || type == "jpg" || type == "jpeg" || type == "gif" || type == "JPG" || type == "JPEG" || type == "BMP" || type == "GIF")

{

//将上传到指定路径的文件夹

thisFileUpload1SaveAs(ServerMapPath("~/upload") + "\\" + dataName + "" + type);

//将路径保存到变量,将该变量的值保存到数据库相应字段即可

uppath = "~/upload/" + dataName + "" + type;

}

二、将以二进制数据流直接保存到数据库:

引用如下命名空间:

using SystemDrawing;

using SystemIO;

using SystemDataSqlClient;

设计数据库时,表中相应的字段类型为iamge

保存:

//路径

string strPath = thisFileUpload1PostedFileFileNameToString ();

//读取

FileStream fs = new SystemIOFileStream(strPath, FileModeOpen, FileAccessRead);

BinaryReader br = new BinaryReader(fs);

byte[] photo = brReadBytes((int)fsLength);

brClose();

fsClose();

//存入

SqlConnection myConn = new SqlConnection("Data Source=;Initial Catalog=stumanage;User ID=sa;Password=123");

string strComm = " INSERT INTO stuInfo(stuid,stuimage) VALUES(107,@photoBinary )";// *** 作数据库语句根据需要修改

SqlCommand myComm = new SqlCommand(strComm, myConn);

myCommParametersAdd("@photoBinary", SqlDbTypeBinary, photoLength);

myCommParameters["@photoBinary"]Value = photo;

myConnOpen();

if (myCommExecuteNonQuery() > 0)

{

thisLabel1Text = "ok";

}

myConnClose();

读取:

连接数据库字符串省略

myconOpen();

SqlCommand command = new

SqlCommand("select stuimage from stuInfo where stuid=107", mycon);//查询语句根据需要修改

byte[] image = (byte[])commandExecuteScalar ();

//指定从数据库读取出来的的保存路径及名字

string strPath = "~/Upload/zhangsanJPG";

string strPhotoPath = ServerMapPath(strPath);

//按上面的路径与名字保存文件

BinaryWriter bw = new BinaryWriter(FileOpen(strPhotoPath,FileModeOpenOrCreate));

bwWrite(image);

bwClose();

//显示

thisImage1ImageUrl = strPath;

采用俩种方式可以根据实际需求灵活选择。

在VB中存取数据库中的

2001-07-05·

·史美康

··vbedencom

一、

数据库的设计

数据库可以采用微软的Access97或者SQL

Server来进行,首先新建一张表,取名为Table,添加三个字段,分别是:姓名

Char型(SQL

Server中)文本型(Access中);编号Char型(SQL

Server中)文本型(Access中);照片image型(SQL

Server中)OLE对象(Access中),设计好后存盘。为了可以进行远程调用,我们采用ODBC的方法进行,双击打开控制面板里的ODBC数据源,点“系统DSN”选项卡,按“添加”按钮选择对应的数据源驱动程序Access的mdb或者SQL

Server,依照添加向导加添加数据源,下面就可以开始程序的编写了。

二、

程序的编写

运行VB,新建一个工程。本程序采用ADO控件和动态链接库访问数据库,需要加入ADO的运行库,单击“工程\引用”菜单,出现引用对话框,选择Microsoft

ActiveX

Data

Objects20

Library并确定。

添加一个Form,四个Label控件,两个TextBox控件,一个PictureBox控件,一个ADODC控件,三个CommandButton控件,一个CommandDialog控件,如果ADODC和CommandDialog控件没有出现在工具框上,请单击菜单“工程\部件”。点“控件”选项卡,在其中选中Microsoft

ADO

Data

Control

60(OLEDB)和Microsoft

Common

Dialog

Control

60两项按“确定”按钮。

下面是以上各个控件的一些属性:

Form1MaxButton=False

Label1Caption=姓名:

Label2Caption=编号:

Label3Name=

ResName

Label3BackColor=

&H80000009&

Label3BorderStyle=1-Fixed

Single

Label3DataField=姓名

Label3DataSource=

AdoCtr

Label4Name=

ResNumb

Label4BackColor=

&H80000009&

Label4BorderStyle=1-Fixed

Single

Label4DataField=编号

Label4DataSource=

AdoCtr

Text1Name=

Names

Text2Name=

Numb

CommonDialog1Name=

CDlg

Adodc1Name=AdoCtr

CommonButton1Name=PreView

CommonButton1Caption=预览

CommonButton2Name=Save

CommonButton2Caption=保存

CommonButton3Name=

Update

CommonButton3Caption=更新

PictureBox1Name=

PicBox

PictureBox1AutoSize=False

PictureBox1AutoRedraw=False

PictureBox1DataField=照片

PictureBox1DataSource=AdpCtr

下面是程序代码:

′此工程需有Microsoft

ActiveX

Data

Object

21

Library(msado15dll)

Dim

Constr

As

String

′ODBC路径

Dim

FileName

As

String

′文件名

Const

BLOCKSIZE

=

4096

′每次读写块的大小

Dim

ADOCon

As

New

ADODBConnection

′ADODB

Connection对象

Dim

ADORst

As

New

ADODBRecordset

′ADODB

Recordset

对象

Dim

ADOFld

As

ADODBField

′ADODB

Field

对象

------------------------

Private

Sub

SaveToDB(ByRef

Fld

As

ADODBField,

DiskFile

As

String)

Dim

byteData()

As

Byte

′定义数据块数组

Dim

NumBlocks

As

Long

′定义数据块个数

Dim

FileLength

As

Long

′标识文件长度

Dim

LeftOver

As

Long′定义剩余字节长度

Dim

SourceFile

As

Long

′定义自由文件号

Dim

i

As

Long

′定义循环变量

SourceFile

=

FreeFile

′提供一个尚未使用的文件号

Open

DiskFile

For

Binary

Access

Read

As

SourceFile

′打开文件

FileLength

=

LOF(SourceFile)

′得到文件长度

If

FileLength

=

0

Then

′判断文件是否存在

Close

SourceFile

MsgBox

DiskFile

&

!〃

Else

NumBlocks

=

FileLength

\

BLOCKSIZE

′得到数据块的个数

LeftOver

=

FileLength

Mod

BLOCKSIZE

′得到剩余字节数

FldValue

=

Null

ReDim

byteData(BLOCKSIZE)

′重新定义数据块的大小

For

i

=

1

To

NumBlocks

Get

SourceFile,

,

byteData()

读到内存块中

FldAppendChunk

byteData()

′写入FLD

Next

i

ReDim

byteData(LeftOver)

′重新定义数据块的大小

Get

SourceFile,

,

byteData()

′读到内存块中

FldAppendChunk

byteData()

′写入FLD

Close

SourceFile

′关闭源文件

End

If

End

Sub

----------------------

Private

Sub

Form_Load()

Constr

=

〃DSN=image〃

′定义ODBC连接

ADOConOpen

Constr

′创建一个连接

ADORstOpen

〃table〃,

ADOCon,

adOpenDynamic,

adLockOptimistic

′打开一个ADO动态集

表名为table

Set

AdoCtrRecordset

=

ADORst

′将动态集赋给ADO控件

End

Sub

----------------------

Private

Sub

Form_Unload(Cancel

As

Integer)

′记得关闭打开的数据集,释放资源

ADORstClose

ADOConClose

Set

ADORst

=

Nothing

Set

ADOCon

=

Nothing

End

Sub

----------------------

Private

Sub

PreView_Click()

′显示打开文件的公用对话框,选择需要加入数据库的

CDlgFilter

=

〃位图(bmp)|bmp〃

CDlgShowOpen

FileName

=

CDlgFileName

PicBoxPicture

=

LoadPicture(FileName)

′预览

End

Sub

----------------------

Private

Sub

Save_Click()

ADORstAddNew

′新增纪录

ADORst(〃姓名〃)Value

=

NamesText

′给动态集的第一个字段赋值

ADORst(〃编号〃)Value

=

NumbText

′给动态集的第二个字段赋值

Set

ADOFld

=

ADORst(〃照片〃)

′给ADODBField对象赋值

Call

SaveToDB(ADOFld,

FileName)

′调用子程序,给第三个字段(image)赋值

ADORstUpdate

End

Sub

----------------------

Private

Sub

Update_Click()

′重新打开纪录集,刷新纪录

ADORstClose

ADOConClose

Set

ADORst

=

Nothing

Set

ADOCon

=

Nothing

ADOConOpen

Constr

ADORstOpen

〃table〃,

ADOCon,

adOpenDynamic,

adLockOptimistic

Set

AdoCtrRecordset

=

ADORst

End

Sub

例如,要存入8张信息, *** 作方法和步骤如下:

1、首先,扩展可编程性下面的“用户定义数据类型”为空,如下图所示。

2、其次,完成上述步骤后,选择数据库,然后单击顶部的“新建查询”按钮,如下图所示。

3、接着,完成上述步骤后,直接使用sp_addtype语句定义数据类型,如下图所示。

4、然后,完成上述步骤后,刷新用户定义的数据类型,这一次“用户定义数据类型”下就有数据了,如下图所示。

5、随后,完成上述步骤后,右键单击数据表,然后选择“设计”选项,如下图所示。

6、最后,完成上述步骤后,就可以在数据类型中找到自定义数据类型,如下图所示。

数据库表中的是image类型。

数据库表中的Image数据类型可以进行数据的存储。保存的是二进制字节,所以写入数据库Image数据类型时,数据库自动将转换成二进制字节后存入。从数据库Image数据类型读取内容时,则是将二进制字节先转换成,再输出。

扩展资料:

如果SQL Server是缺省安装时, IMAGE类型字段是有长度限制,用来存储大小不超过2g的。缺点是占用了很大的数据存储空间。但是对于之前的存储物理路径来说读取和存储方便了很多。

IMAGE类型字段如果写入的数据超过长度限制就会抛出异常,缺省的长度限制是65536,需要修改数据库的全局配置参数才可以扩大IMAGE类型字段的存储空间。

我使用过,我一般是这么处理的,如下(我用的vb,你可以转变成access里的代码):

是可以放到数据库里面的,以ACCESS为例子,要使用OLE数据类型,

然后把转化为长二进制数据存入,读取的时候可以生成系统隐藏的图

片然后在控件中显示

Dim cc() As Byte

Dim i

Dim t

Private Sub Command1_Click()

CommonDialog1Filter = "JPG(BMP)|BMP"

CommonDialog1ShowOpen

If CommonDialog1FileName <> "" Then

Picture1Picture = LoadPicture(CommonDialog1FileName)

strname = CommonDialog1FileName

Open strname For Binary As #1

ReDim cc(LOF(1) - 1)

t = cc(LOF(1) - 1) '在读取二进制时,如果是用文件 *** 作那么涉及到到底从文件中取多少字节的问题,所以字节数组要指定大小

Get #1, , cc

Close

Else

MsgBox "没有选中"

End If

End Sub

Private Sub Command2_Click()

Adodc1Refresh

Adodc1RecordsetAddNew

Adodc1RecordsetFields("id") = i

Adodc1RecordsetFields("qq") = cc

i = i + 1

Adodc1RecordsetUpdate

Adodc1Refresh

End Sub

Private Sub Command3_Click()

Adodc1Refresh

Dim P() As Byte

Adodc1RecordSource = "select qq from 表一 where id='" & Text1Text & "'"

P = Adodc1RecordsetFields("qq") '当把一组二进制数据赋值给一个二进制数组时就不用指定数组的大小了,因为是全部赋值

Open AppPath & "\oobmp" For Binary As #1

Put #1, , P

Close

End Sub

Private Sub Command4_Click()

Open AppPath & "\oobmp" For Binary As #1

Put #1, , cc

Close

End Sub

Private Sub Form_Load()

i = 1

End Sub

2种方法1:把放在网站目录下的文件夹中,将的虚拟路径写到数据库中对应数据表的字段下。2:把文件转换成二进制数据写到数据库中,不过 *** 作有些麻烦。(C#代码)数据表{PictureID int indetity(1,1),PictureData varbinary(MAX)}保存图像byte[] picData = FileUpload1FileBytes;//获取上传控件中二进制数据picID = AddPicture(FileUpload1FileNameToString(), picData);//保存图像二进制数据到数据库 SqlDataReader sdr = GetPicture(picID);//读取刚才保存的图像

byte[] picData = null;

while (sdrRead())

{

picData = (byte[])sdr["PictureData"];

}

sdrClose();

SystemIOMemoryStream ms = new SystemIOMemoryStream(picData);

SystemDrawingImage img = SystemDrawingImageFromStream(ms);

imgSave(ResponseOutputStream, SystemDrawingImagingImageFormatJpeg); 上面用到的保存和读取的函数(使用存储过程,把存储过程名车鞥换成SQL语句一样的效果) public int AddPicture(string picDesn, byte[] picData)

{

DB db = new DB();//建立数据库连接

SqlParameter[] parms = { new SqlParameter("@PictureData", SqlDbTypeVarBinary),

new SqlParameter("@PictureID", SqlDbTypeInt,4)};

parms[0]Value = picData;

parms[1]Direction = ParameterDirectionOutput;

if (dbExecuteNonQuery(CommandTypeStoredProcedure, "Picture_ADD", parms) > 0)//添加 *** 作

{

return (int)parms[1]Value;

}

return 0;

}

public SqlDataReader GetPicture(int picID)

{

DB db = new DB();//建立数据库连接 SqlParameter[] parms = { new SqlParameter("@PictureID", SqlDbTypeInt,4)};

parms[0]Value = picID; SqlDataReader sdr = dbExecuteReader(CommandTypeStoredProcedure, "Picture_GetModel", parms);//读取图像二进制数据

return sdr;

} 补充:获取图像数据最好单独写在一个页面里,通过传递参数的方式获取图像并显示在Html控件中。

以上就是关于如何往数据库中存图片全部的内容,包括:如何往数据库中存图片、图片如何存入数据库、如何用vb向sql数据库存取照片 最好有事例 谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9511813.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存