У меня есть таблица SQL, которая хранит изображения в формате varbinary. Я хочу взять данные изображения из таблицы 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));
}
Приведенный выше код сохраняет файл изображения в системе, но сохраненное изображение повреждено.
Как мне исправить эту проблему?
Спасибо
Хорошо, вы можете сделать все это в MS SQL. Поскольку я ничего не знаю о PHP.
Итак, сначала это моя таблица ниже.
1) Создайте файл формата 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.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 BlobWHILE (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) Теперь вы можете увидеть изображения ниже
5) Таким образом, вы можете либо в PHP скопировать все образы на указанный вами диск, либо использовать SSIS, либо изменить местоположение в хранимой процедуре, где вы хотите сохранить на диск.
Надеюсь это поможет.
На сервере 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;
ссылка и подержанный sqlkeyword instagent MYSql
Eg----> SqlConnection, SqlCommand,SqlDataReader