亲啊我怎么把图片存入到数据库呢,然后再显示出来

亲啊我怎么把图片存入到数据库呢,然后再显示出来,第1张

建议存路径

下面是上传并保存路径到数据库

显示有很多中方法,如果在gridview里面显示的就如截图这样设置

 protected void Button4_Click(object sender, EventArgs e)

    {

        string FilePath = "";

        if (FileUpload1FileName != "")

        {

            if (FileUpload1PostedFileContentLength <= 0)

            {

                // PublicFunPublicFunctionshowMsg(this, "上传文件为空,请重新选择");

                labmsgText = "上传文件为空,请重新选择";

                return;

            }

            else

            {

            }

            if (FileUpload1HasFile)

            {

                if (FileUpload1PostedFileContentLength > 4196304)

                {

                    // PublicFunPublicFunctionshowMsg(this, "上传文件过大");

                    // return;

                }

                else

                {

                    // FilePath = ServerMapPath("~/Download/Dload1");//服务器文件路径

                }

                FilePath = ServerMapPath("~/DownLoad/SignImg");//服务器文件路径

                FileLoadFunUpLoad(FilePath, FileUpload1, DropDownList2SelectedValue);

                UploadURL = "~/DownLoad/SignImg/" + DropDownList2SelectedValue + "_" + FileUpload1FileName;

                UploadURL2 = UploadURL;

                sql = " update yp_insproom_base_t set SignURL='" + UploadURL2 + "' " +

                      " where UserID='" + DropDownList2SelectedValue + "' ";

                MySqlHelperExecuteNonQuery(PublicFunPublicFunctionGetDBconstr("ce_manage_db"), sql);

                labmsgText = "上传成功";

                databind();

            }

        }

        else

        {

            // PublicFunPublicFunctionshowMsg(this, "上传文件路径错误");

            labmsgText = "上传文件路径错误";

            return;

        }

    }

存储的是相对路径,可以到网站服务器上查看,应该有upload文件夹,里面就是存储的,这样写的好处是节省了数据库存储空间,转移的时候可以直接将整个服务器的打包转移。

访问的时候,前面可以拼接域名和指定的路径,这些后台可以轻松获取到,然后拼接上服务器的路径,我们就可以直接在网页上访问到了。

这是很常见的数据库保存方式,和直接把的二进制存入数据库,这样的方式便于检索,占用空间小。当然,目前主流都采用oss来单独存储文件了,就是有专门的文件服务器,这个时候,一般存储的是完整的路径。

向数据库中保存不同类型的文件,和在数据库中保存是一样的。就是向数据库以byte形式存入

向数据库中保存不同类型的文件,和在数据库中保存是一样的。就是向数据库以byte形式存入

然后就是写入数据库,代码如下:

FileInfo fi = new FileInfo( txtFileNameText );// Replace with your file name

        if ( fiExists

        {

         byte[] bData = null;

int nNewFileID = 0;

// Read file data into buffer

using ( FileStream fs = fiOpenRead() )

            {

bData = new byte[fiLength];

int nReadLength = fsRead( bData,0, (int)(fiLength) );

}

// Add file info into DB

string strQuery = "INSERT INTO FileInfo "

+ " ( FileName, FullName, FileData ) "

+ " VALUES "

+ " ( @FileName, @FullName, @FileData ) "

+ " SELECT @@IDENTITY AS 'Identity'";

SqlCommand sqlComm = new SqlCommand( strQuery, sqlConn );

sqlCommParametersAdd( "@FileName", fiName );

sqlCommParametersAdd( "@FullName", fiFullName );

sqlCommParametersAdd( "@FileData", bData );

            // Get new file ID

SqlDataReader sqlReader = sqlCommExecuteReader();

if( sqlReaderRead() )

{

nNewFileID = intParse(sqlReaderGetValue(0)ToString());

}

            sqlReaderClose();

            sqlCommDispose();

if( nNewFileID > 0 )

            {

                // Add new item in list view

ListViewItem itmNew = lsvFileInfoItemsAdd( fiName );

itmNewTag = nNewFileID;

            }

        }

4而读出的代码如下:

// Get new file name

string strFullName =

dlgFBSaveSelectedPath;

if( strFullName[strFullNameLength - 1] != '//'

)

strFullName

+= @"/";

strFullName +=

lsvFileInfoSelectedItems[0]Text;

string strQuery = "SELECT FileData FROM FileInfo

"

+

" WHERE FileID = " + lsvFileInfoSelectedItems[0]TagToString();

SqlDataAdapter

sqlDAdapter = new SqlDataAdapter(strQuery,sqlConn);

DataSet

sqlRecordSet = new DataSet();

byte[] bData = null;

//Get file data from DB

try

{

sqlDAdapterFill(

sqlRecordSet, "FileInfo" );

foreach( DataRow dr in sqlRecordSetTables["FileInfo"]Rows)

{

if( dr["FileData"] != DBNullValue )

bData

= ( byte[] )dr["FileData"];

}

}

catch(SqlException sqlErr)

{

MessageBoxShow(

sqlErrMessage );

}

catch

{

MessageBoxShow(

"Failed to read data from DB!" );

}

sqlRecordSetDispose();

sqlDAdapterDispose();

if( bData != null )

{

// Save file

FileInfo

fi = new FileInfo( strFullName

);

if( !fiExists )

{

//Create the file

using (FileStream fs = fiCreate())

{

fsWrite(

bData, 0, bDataLength);

}

}

else

{

//Create the file

using (FileStream fs =

fiOpenWrite())

{

fsWrite(

bData, 0, bDataLength);

}

}

}

背景

MySQL 一直以来都有 TEXT、BLOB 等类型用来存储、视频等大对象信息。比如一张,随便一张都 5M 以上。视频也是,随便一部视频就是 2G 以上。

假设用 MySQL 来存放**视频等信息,一部是 2G,那么存储 1000 部就是 2TB,2TB 也就是 1000 条记录而已,但是对数据库性能来说,不仅仅是看记录数量,更主要的还得看占用磁盘空间大小。空间大了,所有以前的经验啥的都失效了。

所以一般来说存放这类信息,也就是存储他们的存放路径,至于文件本身存放在哪里,那这就不是数据库考虑的范畴了。数据库只关心怎么来的快,怎么来的小。

举例

虽然不推荐 MySQL 这样做,但是也得知道 MySQL 该怎么做才行,做到心里有数。比如下面一张微信,大概 5M 的样子。

root@ytt:/var/lib/mysql-files# ls -sihl 微信_20190711095019jpg274501 54M -rw-r--r-- 1 root root 54M Jul 11 07:17 微信_20190711095019jpg

拷贝 100 份这样的来测试

root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信_20190711095019jpg "$i"jpg;done;

root@ytt:/var/lib/mysql-files# ls

100jpg   17jpg  25jpg  33jpg  41jpg  4jpg   58jpg  66jpg  74jpg  82jpg  90jpg  99jpg  f8tsv

10jpg    18jpg  26jpg  34jpg  42jpg  50jpg  59jpg  67jpg  75jpg  83jpg  91jpg  9jpg   微信_20190711095019jpg

1111jpg  19jpg  27jpg  35jpg  43jpg  51jpg  5jpg   68jpg  76jpg  84jpg  92jpg  f1tsv

11jpg    1jpg   28jpg  36jpg  44jpg  52jpg  60jpg  69jpg  77jpg  85jpg  93jpg  f2tsv

12jpg    20jpg  29jpg  37jpg  45jpg  53jpg  61jpg  6jpg   78jpg  86jpg  94jpg  f3tsv

13jpg    21jpg  2jpg   38jpg  46jpg  54jpg  62jpg  70jpg  79jpg  87jpg  95jpg  f4tsv

14jpg    22jpg  30jpg  39jpg  47jpg  55jpg  63jpg  71jpg  7jpg   88jpg  96jpg  f5tsv

15jpg    23jpg  31jpg  3jpg   48jpg  56jpg  64jpg  72jpg  80jpg  89jpg  97jpg  f6tsv

16jpg    24jpg  32jpg  40jpg  49jpg  57jpg  65jpg  73jpg  81jpg  8jpg   98jpg  f7tsv

我们建三张表,分别用 LONGBLOB、LONGTEXT 和 VARCHAR 来存储这些信息

mysql> show create table tt_image1G

1 row

Table: tt_image1

Create Table: CREATE TABLE `tt_image1` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`image_file` longblob,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

1 row in set (000 sec)

mysql> show create table tt_image2G

1 row

Table: tt_image2

Create Table: CREATE TABLE `tt_image2` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`image_file` longtext,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

1 row in set (000 sec)

mysql> show create table tt_image3G

1 row

Table: tt_image3

Create Table: CREATE TABLE `tt_image3` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`image_file` varchar(100) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

1 row in set (000 sec)

我们来给三张表插入 100 张(插入前,建议把 max_allowed_packet 设置到最大)

tt_image1

root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;

do mysql -S /var/run/mysqld/mysqldsock -e "insert into ytttt_image1(image_file)

values (load_file('/var/lib/mysql-files/$ijpg'))";done;

tt_image2

root@ytt:/var/lib/mysql-files# for i in `seq 1 100`;

do mysql -S /var/run/mysqld/mysqldsock -e "insert into ytttt_image2(image_file)

values (hex(load_file('/var/lib/mysql-files/$ijpg')))";done;

tt_image3

root@ytt:/var/lib/mysql-files# aa='begin;';for i in `seq 1 100`;

do aa=$aa"insert into ytttt_image3(image_file) values

('/var/lib/mysql-files/$ijpg');";

done;aa=$aa'commit;';mysql -S /var/run/mysqld/mysqldsock -e "`echo $aa`";

检查下三张表记录数

mysql> select 'tt_image1' as name ,count() from tt_image1 union allselect 'tt_image2',count() from tt_image2 union all select 'tt_image3', count() from tt_image3;+-----------+----------+| name      | count() |+-----------+----------+| tt_image1 |      100 || tt_image2 |      100 || tt_image3 |      100 |+-----------+----------+3 rows in set (000 sec)

看下文件大小,可以看到实际大小排名,LONGTEXT 字段存储的最大,LONGBLOB 字段缩小到一半,最小的是存储路径的表 tt_image3。所以这里从存储空间来看,存放路径最占优势。

root@ytt:/var/lib/mysql/ytt# ls -silhS tt_image274603 11G -rw-r----- 1 mysql mysql 11G Jul 11 07:27 tt_image2ibd274602 545M -rw-r----- 1 mysql mysql 544M Jul 11 07:26 tt_image1ibd274605  80K -rw-r----- 1 mysql mysql 112K Jul 11 07:27 tt_image3ibd

那么怎么把取出来呢?

tt_image3 肯定是最容易的

mysql> select from tt_image3;+----+----------------------------+| id | image_file                 |+----+----------------------------+|  1 | /var/lib/mysql-files/1jpg |+----+----------------------------+100 rows in set (000 sec)

tt_image1 直接导出来二进制文件即可,下面我写了个存储过程,导出所有。

mysql> DELIMITER $$mysql> USE `ytt`$$mysql> DROP PROCEDURE IF EXISTS `sp_get_image`$$mysql> CREATE DEFINER=`ytt`@`localhost` PROCEDURE `sp_get_image`()mysql> BEGIN      DECLARE i,cnt INT DEFAULT 0;      SELECT COUNT() FROM tt_image1 WHERE 1 INTO cnt;      WHILE i < cnt DO        SET @stmt = CONCAT('select image_file from tt_image1  limit ',i,',1 into dumpfile ''/var/lib/mysql-files/image',i,'jpg''');        PREPARE s1 FROM @stmt;        EXECUTE s1;        DROP PREPARE s1;      SET i = i + 1;      END WHILE;      END$$mysql> DELIMITER ;mysql> call sp_get_image;

tt_image2 类似,把 select 语句里 image_file 变为 unhex(image_file) 即可。

总结

这里我举了个用 MySQL 来存放的例子,总的来说有以下三点:

占用磁盘空间大(这样会带来各种各样的功能与性能问题,比如备份,写入,读取 *** 作等)

使用不易

还是推荐用文件路径来代替实际的文件内容存放

1、首先,打开Access,选择文件菜单中的“新建“,选择一种数据库类型,这里选择的是本地数据库,即”空白桌面数据库“,如下图所示。

2、在d出的新对话框中设置数据库的名字,如下图所示。

3、然后点击浏览,为数据库设置一个保存的位置,如下图所示。

4、数据库名称和保存位置设置完成后,返回数据库设置界面,点击”创建“,如下图所示。

5、这样,就用Access创建了一个新的空白数据库,就可以在数据库里创建数据表来存储jpg了,如下图所示。

1、在打开SQL Server Managemenet Studio窗口,在对象资源管理器窗口依次站看数据库——新建的数据库节点。

2、鼠标右键单击视图节点,在d出的快捷菜单中选择新建视图命令。

3、从添加表对话框中选择建立新视图的基表,视图和函数。

4、根据新建视图的需要,从表中选择视图引用的列。可以再关系图中选中相应表的相应列左边的复选框来完成。

5、最后,在视图设计器窗口中单击工具栏中的验证SQL语法,按钮检查T-SQL语法。确认语法正确后,单击执行 SQL按钮预览视图返回的结果。

以上就是关于亲啊我怎么把图片存入到数据库呢,然后再显示出来全部的内容,包括:亲啊我怎么把图片存入到数据库呢,然后再显示出来、php 数据库图片存储问题、如何在数据库中同时保存文本和图片等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存