تبدیل متن کدگذاری شده Base64 به تصویر در SQL Server
ذخیره اشیاء باینری بزرگ (BLOB) مانند تصاویر، اسناد یا ویدیوها مستقیماً در یک پایگاه داده SQL Server دارای مزایا و معایبی است. در حالی که ذخیره BLOBها در پایگاه داده، آنها را به دادههای برنامه متصل نگه میدارد و عملیات پشتیبانگیری/بازیابی را ساده میکند، اما میتواند منجر به افزایش حجم پایگاه داده، کندتر شدن عملکرد و رقابت بر سر منابع نیز شود. به عنوان یک راه حل جایگزین، بسیاری از برنامهها BLOBها را در سیستم فایل ذخیره میکنند و فقط یک اشارهگر (مسیر) به BLOB را در پایگاه داده نگهداری میکنند. رویکرد رایج دیگر، ذخیره دادههای باینری به عنوان متن (VARCHAR یا NVARCHAR) پس از کدگذاری آنها است، مثلاً با استفاده از کدگذاری Base64. کدگذاری Base64 دادههای باینری را به فرمت رشته ASCII تبدیل میکند. این میتواند زمانی مفید باشد که نیاز به انتقال دادههای باینری از طریق رسانههایی دارید که عمدتاً متن را پردازش میکنند، مانند XML، JSON، یا پروتکلهای خاص سرویسهای وب. در حالی که ذخیره دادههای کدگذاری شده Base64 در SQL Server میتواند برخی سناریوهای یکپارچهسازی را ساده کند، بازیابی و تبدیل مجدد آن به فرمت باینری اصلی خود (مثلاً یک تصویر) نیازمند مراحل خاصی است. این مقاله نشان میدهد که چگونه دادههای تصویری کدگذاری شده Base64 را از SQL Server استخراج کرده و با استفاده از T-SQL و PowerShell به فایلهای تصویری تبدیل کنید.
برای اهداف نمایشی، بیایید یک جدول نمونه ایجاد کرده و مقداری داده تصویری کدگذاری شده Base64 را در آن درج کنیم. ما از یک رشته Base64 کوچک برای یک تصویر GIF شفاف 1×1 پیکسلی ساده استفاده خواهیم کرد.
CREATE TABLE dbo.Images (
ImageID INT IDENTITY(1,1) PRIMARY KEY,
ImageName VARCHAR(255),
Base64Image NVARCHAR(MAX)
);
GO
INSERT INTO dbo.Images (ImageName, Base64Image)
VALUES ('TransparentGIF', 'R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==');
GO
برای استخراج دادههای تصویری کدگذاری شده Base64، به سادگی آن را از جدول `Images` خود انتخاب میکنیم. ما به این دادهها برای پردازش توسط اسکریپت PowerShell نیاز داریم.
SELECT ImageName, Base64Image
FROM dbo.Images;
اکنون که رشته کدگذاری شده Base64 را در اختیار داریم، میتوانیم از PowerShell برای رمزگشایی آن و ذخیره آن به عنوان یک فایل تصویری استفاده کنیم. PowerShell قابلیتهای داخلی برای مدیریت تبدیلهای Base64 دارد.
# Define the output directory
$outputPath = "C:\Temp\DecodedImages"
if (-not (Test-Path $outputPath)) {
New-Item -ItemType Directory -Path $outputPath
}
# --- Replace this with actual Base64 data retrieved from SQL Server ---
# For demonstration, using the sample Base64 string directly
$base64String = 'R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='
$imageName = 'DecodedImage.gif'
# --- End of replacement section ---
# Convert Base64 string to byte array
$bytes = [System.Convert]::FromBase64String($base64String)
# Define the full path for the output file
$fullPath = Join-Path $outputPath "$imageName"
# Write the byte array to a file
[System.IO.File]::WriteAllBytes($fullPath, $bytes)
Write-Host "Image saved to: $fullPath"
در یک سناریوی واقعی، شما معمولاً مقادیر `Base64Image` و `ImageName` را مستقیماً از SQL Server بازیابی کرده و آنها را به اسکریپت PowerShell خود ارسال میکنید. این کار را میتوان با استفاده از روشهای مختلفی مانند `Invoke-Sqlcmd` یا یک برنامه سفارشی .NET انجام داد. در ادامه مثالی آورده شده است که چگونه میتوانید دادهها را واکشی کرده و سپس در یک حلقه برای رمزگشایی هر تصویر از آن استفاده کنید.
# Define SQL Server connection parameters
$serverName = "YourSQLServerName" # e.g., "localhost\SQLEXPRESS"
$databaseName = "YourDatabaseName" # e.g., "TestDB"
# Output path for decoded images
$outputPath = "C:\Temp\DecodedImagesFromDB"
if (-not (Test-Path $outputPath)) {
New-Item -ItemType Directory -Path $outputPath
}
# SQL query to retrieve image data
$sqlQuery = "SELECT ImageName, Base64Image FROM dbo.Images;"
# Fetch data from SQL Server
$connectionString = "Server=$serverName;Database=$databaseName;Integrated Security=True;"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConnection)
$sqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($sqlCommand)
$dataTable = New-Object System.Data.DataTable
try {
$sqlConnection.Open()
$sqlAdapter.Fill($dataTable)
$sqlConnection.Close()
# Loop through each row and decode/save the image
foreach ($row in $dataTable.Rows) {
$imageName = $row["ImageName"]
$base64String = $row["Base64Image"]
# Ensure the filename is valid
$fileName = [System.IO.Path]::GetInvalidFileNameChars() | ForEach-Object { $imageName = $imageName.Replace($_, '_') }
$fileName = "$imageName.gif" # Assuming GIF, adjust as needed
# Convert Base64 string to byte array
$bytes = [System.Convert]::FromBase64String($base64String)
# Define the full path for the output file
$fullPath = Join-Path $outputPath $fileName
# Write the byte array to a file
[System.IO.File]::WriteAllBytes($fullPath, $bytes)
Write-Host "Image '$imageName' saved to: $fullPath"
}
}
catch {
Write-Error "Error retrieving or saving images: $($_.Exception.Message)"
}
finally {
if ($sqlConnection.State -eq 'Open') {
$sqlConnection.Close()
}
}
اسکریپت PowerShell اقدامات کلیدی زیر را انجام میدهد:
`$outputPath` دایرکتوری را که تصاویر رمزگشایی شده در آن ذخیره میشوند، تعریف میکند و در صورت عدم وجود دایرکتوری، آن را ایجاد میکند.
`$base64String` این متغیر متن کدگذاری شده Base64 را نگه میدارد. در یک سناریوی واقعی، این مقدار از نتایج کوئری SQL Server شما به دست میآید.
برای رمزگشایی رشته Base64 و تبدیل آن به یک آرایه بایت (که دادههای باینری خام تصویر را نشان میدهد)، از این دستور اصلی استفاده میشود:
[System.Convert]::FromBase64String($base64String)
برای دریافت آرایه بایت و نوشتن آن در یک فایل در مسیر کامل مشخص شده ( `$fullPath`)، از این دستور استفاده میشود. پسوند فایل (مانند `.gif`, `.jpg`, `.png`) باید با فرمت تصویر اصلی مطابقت داشته باشد. این اسکریپت از یک حلقه برای پردازش چندین تصویر بازیابی شده از پایگاه داده استفاده میکند:
[System.IO.File]::WriteAllBytes($fullPath, $bytes)