1

我有一个以 varbinary 格式存储图像的 sql 表。我想从 sql 表中获取图像数据并将其作为图像文件存储在我的系统上。

$getPhotos = "SELECT Name, PhotoContent
              FROM [Photos]";                 
$resultPhotos = odbc_exec($con, $getPhotos);

while($post = odbc_fetch_array($resultPhotos)){
    $fileData = $post['PhotoContent'];
    $fileName = "D:\\Images\\".$post['Name'];
    file_put_contents($fileName,str_replace('data:image/jpeg;base64,','',$fileData));
}

上面的代码将图像文件保存在系统上,但是保存的图像被破坏了。

在此处输入图像描述

我该如何解决这个问题?

谢谢

4

2 回答 2

0

好的,您可以在 MS SQL 中完成所有这些操作。因为我对PHP一无所知。

所以首先这是我下面的表格。 在此处输入图像描述

1)创建blob格式文件,以便您可以导出blob。

    DECLARE @sql VARCHAR(500)
    SET @sql = 'bcp DatabaseName.dbo.Blob format nul -T -n -f C:\Users\Public\Documents\blob.fmt -S ' + @@SERVERNAME
    SELECT @sql 
    EXEC master.dbo.xp_CmdShell @sql 

格式化文件 格式化文件

2) 编辑格式文件。仅保留内容列。

2.1) 原始格式在此处输入图像描述

2.2) 改变格式如下在此处输入图像描述

3) 最后,我创建了一个存储过程,它将所有 varbinary 数据更改为 .jpb(您也可以使用不同的格式,而不仅仅是 .jpg)。

CREATE PROCEDURE BLOBImageExport

AS

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON

IF OBJECT_ID('tempdb..#export') IS NOT NULL DROP TABLE #export

DECLARE @imgID INT,
    @imgName VARCHAR(128),
    @sql VARCHAR(8000)

SELECT * 
INTO #export
FROM Blob


WHILE (SELECT COUNT(*) FROM #export) > 0
BEGIN
    SELECT TOP 1 @imgID = ID,
        @imgName = imgName
    FROM #export

    SET @sql = 'BCP "SELECT Content FROM DATABASENAME.dbo.Blob WHERE ID = '  + CONVERT(VARCHAR(10), @imgID) + '" QUERYOUT C:\Users\Public\Documents\' + '' + @imgName + '' + ' -T -f C:\Users\Public\Documents\blob.fmt -S ' + @@SERVERNAME

    EXEC master.dbo.xp_CmdShell @sql

    DELETE #export
    WHERE ID = @imgID
END 

4)现在你可以看到下面的图片 在此处输入图像描述

4.1) 会计师形象在此处输入图像描述

4.2) Accountant2 图片在此处输入图像描述

5)因此,您可以在 PHP 中将所有图像复制到您指定的驱动器或使用 SSIS 或更改存储过程中要保存到磁盘的位置。

希望这可以帮助。

于 2016-06-15T09:11:31.947 回答
0

在 MySQL 服务器中,您可以使用以下代码:

using MySql.Data.MySqlClient;
using System.IO;
using System.Globalization;

int i=0; //variable for image name

MySqlConnection conn = new MySqlConnection("SERVER=127.0.0.1;DATABASE=test;UID=root;PASSWORD=1234");
conn.Open();
MySqlCommand cmd = new MySqlCommand("SELECT signature  FROM  imageTble  ", conn);
MySqlDataReader myReader = null;
myReader = cmd.ExecuteReader();

byte[] imgg = (byte[])(myReader["signature"]);

while (myReader.Read())
{
    i = i + 1;
    File.WriteAllBytes(@"C:\Users\Admin\Desktop\New folder\IMAGES\" + i + ".tiff", imgg);
}

如果您使用 MS SQl 数据库,您可以使用:

using System.Data.Sql; 

MYSql 的引用和使用的 sqlkeyword 实例

Eg----> SqlConnection, SqlCommand,SqlDataReader
于 2017-03-17T09:20:11.580 回答