0

最初に、はい、ファイル システムでこれを行い、ファイル名/場所をデータベースに保存する方が良い方法であることはわかっています。最終バージョンではおそらくそうするでしょう。

これは主に、実験/概念実証/学習の機会です。

動作している 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の行で失敗します。

これをデータベースに読み書きするより良い方法はありますか?

4

1 に答える 1

0
  • なぜ事前にbase 64でデコードするのですか?
  • アップロード時にミームタイプを保存し、ie の奇妙な p-jpeg の問題を確実に整理することをお勧めします。

とにかく、ここにあなたのためのクラスがあります。

MyImage.vb

Imports System.Data.SqlClient
Imports System.IO

Public Class MyImage
    Implements IHttpHandler

    Public Function GetImage(ByVal id As Integer, ByVal type As String) As Byte()
        Dim Con As New SqlConnection(Common.ConnectionString)
        Dim cmd As New SqlCommand
        cmd.CommandText = _
            "Select * from tblCompanyImg Where CompanyImgID = @imgID"
        cmd.CommandType = System.Data.CommandType.Text
        cmd.Connection = Con

        cmd.Parameters.AddWithValue("@imgID", id)

        Con.Open()
        Dim dReader As SqlDataReader = cmd.ExecuteReader
        dReader.Read()
        Dim img As Byte()
        If dReader.HasRows Then
            img = dReader("Image")
        Else
            Dim im As New ImageManipulator
            Dim notfound = System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Request.PhysicalApplicationPath & "Images\404.jpg")
            img = im.ConvertImageToByteArray(notfound)
        End If

        Con.Close()

        Return img
    End Function

    Function GetMEMEType(ByVal id As Integer) As String
        Dim Con As New SqlConnection(Common.ConnectionString)
        Dim cmd As New SqlCommand
        cmd.CommandText = _
            "Select * from tblCompanyImg Where CompanyImgID = @imgID"
        cmd.CommandType = System.Data.CommandType.Text
        cmd.Connection = Con

        cmd.Parameters.AddWithValue("@imgID", id)

        Con.Open()
        Dim dReader As SqlDataReader = cmd.ExecuteReader
        dReader.Read()
        Dim MEME As String
        If dReader.HasRows Then
            MEME = dReader("MEMEType")
        Else
            MEME = "image/jpeg"
        End If

        Con.Close()

        Return If(MEME = "image/pjpeg", "image/jpeg", MEME)
    End Function

    Public ReadOnly Property IsReusable As Boolean Implements System.Web.IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property

    Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
        Dim path As String = context.Request.Path
        Dim id = path.Split(".")(0).Split("/").Last ' not very pretty, grabs the id from the filename requested
        Dim size = path.Split(".")(1) 'grabs the size required, thumb or full.

        Dim imageData As Byte() = GetImage(id, size)
        context.Response.OutputStream.Write(imageData, 0, imageData.Length)
        'context.Response.
        context.Response.ContentType = GetMEMEType(id)
        'context.Response.AddHeader("content-disposition", "attachment; filename=img.jpg")
    End Sub
End Class

次に、これをweb.configに貼り付けます

<add verb="GET" path="*.jpg.db" type="project.MyImage,project"  resourceType="Unspecified" name="databaseHandler" />

次に 2.jpg.db を呼び出すと、画像ファイルが取得されます。

于 2012-12-12T16:30:48.210 に答える