首先,我想說,是的,我知道有文件系統,這樣做的,只是保存文件名/位置數據庫最好的方式去,我可能會在最終版本中做到這一點。保存一個文件從PHP數據庫,查看它的數據庫在VB.net
這主要是概念/實驗/證明一個學習的機會。
我有一個PHP上傳表單正在工作。它需要一個圖像並將其轉換爲base64字符串,並將其放入數據庫表中的圖像塊中。
<?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)
線路出現故障時無效。
有沒有更好的方式來讀取或寫入該數據庫以使其工作?
提示:BLOB字段是用於二進制存儲。沒有必要base64編碼它。您只需將數據大小增加〜33%,稍後再強制執行額外的處理以再次對其進行解碼。 –
你是說我可以這樣做:'$ base64 = chunk_split(base64_encode($ gambar));'並且放置'$ base64 = chunk_split($ gambar);'並讓它工作? – AndyD273
沒有。只是'$ gambar = mysql_real_escape_string(file_get_contents($ _ FILES ['photo'] ['tmp_name']))',或者任何你的DB庫的等價函數。 –