最初に、はい、ファイル システムでこれを行い、ファイル名/場所をデータベースに保存する方が良い方法であることはわかっています。最終バージョンではおそらくそうするでしょう。
これは主に、実験/概念実証/学習の機会です。
動作している PHP アップロード フォームがあります。画像を取得して base64 文字列に変換し、データベース テーブルの画像 BLOB に配置します。
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// cleaning title field
$title = trim(sql_safe($_POST['title']));
if ($title == '') // if title is not set
$title = '(empty title)';// use (empty title) string
if ($_POST['password'] != $password) // cheking passwors
$msg = 'Error: wrong upload password';
else
{
if (isset($_FILES['photo']))
{
@list(, , $imtype, ) = getimagesize($_FILES['photo']['tmp_name']);
// Get image type.
// We use @ to omit errors
if ($imtype == 3) // cheking image type
$ext="png"; // to use it later in HTTP headers
elseif ($imtype == 2)
$ext="jpeg";
elseif ($imtype == 1)
$ext="gif";
else
$msg = 'Error: unknown file format';
if (!isset($msg)) // If there was no error
{
//$file = File Image yang ingin di encode
//Filetype: JPEG,PNG,GIF
$base64 = "";
$file = $_FILES['photo']['tmp_name'];
if($fp = fopen($file,"rb", 0))
{
$gambar = fread($fp,filesize($file));
fclose($fp);
$base64 = chunk_split(base64_encode($gambar));
}
// Preparing data to be used in query
$q = "INSERT INTO tblCompanyImg (CompanyID, ImgNum, ImgExt, ImgName, ImgImg) Values (1, 1, '$ext', '$title', '$base64')";
$database->query($q);
$msg = "Success: image uploaded:";
}
}
elseif (isset($_GET['title'])) // isset(..title) needed
$msg = 'Error: file not loaded';// to make sure we've using
// upload form, not form
// for deletion
}
}
?>
そして、次のように画像を表示できるため、正しく保存されていることがわかります。
<?php
while($row = $database->fetch_array($result))
{
$CompanyImgID = $row["CompanyImgID"];
$CompanyID = $row["CompanyID"];
$ImgName = $row["ImgName"];
// outputing list
echo "<img src='data:image/jpeg;base64," . $row['ImgImg'] . "' />";
}
?>
次にやりたいことは、アップロードされた画像を Visual Basic プログラム内で表示することです。
私はこれを試しました:
Dim sSql As String = "Select * from tblCompanyImg Where CompanyImgID = 2"
Dim rSelect As New ADODB.Recordset
Dim img As Image
Dim imageBytes As Byte()
Dim ms As MemoryStream
With rSelect
.Open(sSql, MyCn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockOptimistic)
If Not .EOF Then
imageBytes = .Fields!ImgImg.Value
ms = New MemoryStream(imageBytes, 0, imageBytes.Length)
ms.Write(imageBytes, 0, imageBytes.Length)
img = Image.FromStream(ms, True) ' it fails right here: Parameter is not valid '
LogoPictureBox.Image = img
End If
.Close()
End With
img = Image.FromStream(ms, True)
しかし、エラー Parameter is not validの行で失敗します。
これをデータベースに読み書きするより良い方法はありますか?