【问题标题】:Inserting a PNG or JPG into MySQL is corrupting the image将 PNG 或 JPG 插入 MySQL 会损坏图像
【发布时间】:2017-04-10 10:32:01
【问题描述】:

我在将一些 JPG 或 PNG 图像插入 MySQL 时遇到问题。其中一些图像已损坏。

损坏的 JPG 截图:

损坏的 PNG 的屏幕截图:

我的代码有什么问题?

代码:

Private Sub Button3_Click_1(sender As Object, e As EventArgs) Handles Button3.Click
    Dim cmd As New MySqlCommand
    Dim SQL As String
    Dim FileSize As UInt32
    Dim rawData() As Byte = IO.File.ReadAllBytes(ListBox1.SelectedItem)
    Dim fs As FileStream
    Try
        fs = New FileStream(ListBox1.SelectedItem.ToString, FileMode.Open, FileAccess.Read)
        FileSize = fs.Length
        rawData = New Byte(FileSize) {}
        fs.Read(rawData, 0, FileSize)
        'fs.Close()
        MysqlConn.Open()
        SQL = "INSERT INTO xcollectibles.foto (foto) VALUES(@foto)"
        cmd.Connection = MysqlConn
        cmd.CommandText = SQL
        cmd.Parameters.AddWithValue("@foto", rawData)
        cmd.ExecuteNonQuery()
        fs.Close()
        MessageBox.Show("File Inserted into database successfully!",
        "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        MysqlConn.Close()
    Catch ex As Exception
        MessageBox.Show("There was an error: " & ex.Message, "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
End Sub

我也试过了:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    MysqlConn.Open()
    Me.Cursor = Cursors.WaitCursor
    For i = 0 To Me.ListBox1.Items.Count - 1
        ProgressBar1.Maximum = Me.ListBox1.Items.Count - 1
        Me.ListBox1.SetSelected(i, True)
        Dim cmd As New MySqlCommand
        Dim SQL As String
        Dim filesize As UInt32
        Dim mstream As New System.IO.MemoryStream()
        If TextBox1.Text = ".jpg" Then
            PictureBox1.Image.Save(mstream, Imaging.ImageFormat.Jpeg)

        ElseIf TextBox1.Text = ".png" Then
            PictureBox1.Image.Save(mstream, Imaging.ImageFormat.Png)

        ElseIf TextBox1.Text = ".bmp" Then
            PictureBox1.Image.Save(mstream, Imaging.ImageFormat.Png)

        End If


        'Dim bmp As New Bitmap(Width, Height)
        'Dim g As Graphics = Graphics.FromImage(bmp)
        'g.Clear(Color.Transparent)
        'bmp.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)


        'End If
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim arrImage() As Byte = mstream.GetBuffer()
        filesize = mstream.Length
        mstream.Close()
        SQL = "INSERT INTO xcollectibles.foto (id_product,foto) VALUES ((Select id from xcollectibles.product where product.name='" & ComboBox1.Text & "'), @foto) "
        ProgressBar1.Value = i
        cmd.Connection = MysqlConn
        cmd.CommandText = SQL
        cmd.Parameters.AddWithValue("@foto", arrImage)
        cmd.ExecuteNonQuery()
    Next
    MessageBox.Show("File Inserted into database successfully!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
    MysqlConn.Dispose()
    ProgressBar1.Value = 0
    Me.Cursor = Cursors.Default
End Sub

我现在尝试一些不同的东西...... 将文件保存在电脑的某个路径中,并将路径保存在mysql中

我试试这个来添加文件

System.IO.Directory.CreateDirectory("C:\Users\Jamyz\Source\Repos\xCollectibles\xCollectibles\xCollectibles\Images" & "\" & ComboBox1.Text)
        Dim SaveFile As New System.IO.StreamWriter("C:\Users\Jamyz\Source\Repos\xCollectibles\xCollectibles\xCollectibles\Images" & "\" & ComboBox1.Text & "\" & TextBox3.Text)

        If TextBox1.Text = ".jpg" Then
            PictureBox1.Image.Save("C:\Users\Jamyz\Source\Repos\xCollectibles\xCollectibles\xCollectibles\Images\mypic.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
        ElseIf TextBox1.Text = ".bmp" Then
            PictureBox1.Image.Save("C:\Users\Jamyz\Source\Repos\xCollectibles\xCollectibles\xCollectibles\Images\mypic.bmp", System.Drawing.Imaging.ImageFormat.Bmp)
        ElseIf TextBox1.Text = ".png" Then
            PictureBox1.Image.Save("C:\Users\Jamyz\Source\Repos\xCollectibles\xCollectibles\xCollectibles\Images\mypic.png", System.Drawing.Imaging.ImageFormat.Png)
        End If

但我想用文件夹保存文件

System.IO.Directory.CreateDirectory("C:\Users\Jamyz\Source\Repos\xCollectibles\xCollectibles\xCollectibles\Images" & "\" & ComboBox1.Text)

并以TextBox3.Text的名称保存文件

Dim SaveFile As New System.IO.StreamWriter("C:\Users\Jamyz\Source\Repos\xCollectibles\xCollectibles\xCollectibles\Images" & "\" & ComboBox1.Text & "\" & TextBox3.Text)

因为在例子中

PictureBox1.Image.Save("C:\Users\Jamyz\Source\Repos\xCollectibles\xCollectibles\xCollectibles\Images\mypic.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)

文件被覆盖........

非常感谢......

【问题讨论】:

  • “我的代码有什么问题???” – 除了您试图将图像放入数据库这一事实之外,您的意思是?图片属于文件系统,而不是数据库。
  • @CBroe:这是不正确的,也不是很有帮助。不过,在设计新应用程序时,这可能是一个经验法则。
  • 我认为问题很简单。您不应该在数据库中使用图像!特别是您的图像看起来具有高分辨率,因此它会损坏,因为您可能无法将所有字节保存到数据库中。尝试使用 16*16px 的图标,您会发现它可能有效。
  • 存储图像数据而不是文件名会使数据库不必要地膨胀。但是,始终使用 SQL 参数,使用 Add 而不是 AddWithValue,GetBuffer 是错误的。见stackoverflow.com/a/31370711

标签: mysql vb.net png jpeg corrupt


【解决方案1】:

您必须先将图像转换为字节数组,然后才能将其存储到数据库中。我使用Oracle,但我想Sql Server 是一样的。我从上传中捕获照片,将图像缩放为缩略图,然后将其转换为字节数组以存储在数据库中。见以下代码:

    If Not file1.PostedFile Is Nothing And file1.PostedFile.ContentLength > 0 Then
        Session("ThePhoto") = ""
        Dim TheStream As Stream = file1.PostedFile.InputStream
        Dim origimage As System.Drawing.Image
        origimage = System.Drawing.Image.FromStream(TheStream)

        Dim ms2 As New System.IO.MemoryStream
        origimage = ScaleImage(origimage, 320, 200) ' Thumbnail
        origimage.Save(ms2, Imaging.ImageFormat.Jpeg)
        Dim MyPhoto() As Byte = ms2.GetBuffer ' The scaled image is now stored in memory as a byte array
        Session("ThePhoto") = MyPhoto ' put it into the session to retreive later
        ms2.Dispose()
        origimage.Dispose()
    End If

我将图像存储在会话对象中,因为还有其他事情正在进行,并且在用户单击保存按钮之前,我还无法将图像保存到数据库中。将字节数组传递给存储过程以保存到数据库非常简单。

【讨论】:

    【解决方案2】:

    感谢我使用它的帮助。问题解决了

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        Me.Cursor = Cursors.WaitCursor
        For i = 0 To Me.ListBox1.Items.Count - 1
            ProgressBar1.Maximum = Me.ListBox1.Items.Count - 1
            Me.ListBox1.SetSelected(i, True)
            Dim cmd As New MySqlCommand
            Dim SQL As String
            'Dim FileSize As UInt32
            Dim rawData() As Byte = IO.File.ReadAllBytes(ListBox1.SelectedItem)
    
    
            Dim mstream As New System.IO.MemoryStream()
            Dim arrImage() As Byte = mstream.GetBuffer()
            mstream.Close()
    
            'Save Image in Folder
            Dim strBasePath As String
            Dim strFileName As String
            strFileName = TextBox3.Text
            strBasePath = Application.StartupPath & "\Images" & ComboBox1.Text & "\"
            ' >> Check if Folder Exists 
            If Directory.Exists(strBasePath) = False Then
                    Call Directory.CreateDirectory(strBasePath)
                End If
            ' >> Save Picture 
            If TextBox1.Text = ".jpg" Then
                Call PictureBox1.Image.Save(strBasePath & "\" & strFileName, System.Drawing.Imaging.ImageFormat.Jpeg)
            ElseIf TextBox1.Text = ".png" Then
                Call PictureBox1.Image.Save(strBasePath & "\" & strFileName, System.Drawing.Imaging.ImageFormat.Png)
            ElseIf TextBox1.Text = ".bmp" Then
                Call PictureBox1.Image.Save(strBasePath & "\" & strFileName, System.Drawing.Imaging.ImageFormat.Bmp)
            End If
            'Save Image in Folder
    
            MysqlConn.Close()
            MysqlConn.Open()
            SQL = "INSERT INTO xcollectibles.foto (id_product,name,path) VALUES ((Select id from xcollectibles.product where product.name='" & ComboBox1.Text & "'), @name, @path) "
            ProgressBar1.Value = i
            cmd.Connection = MysqlConn
            cmd.CommandText = SQL
            cmd.Parameters.AddWithValue("@name", TextBox3.Text)
            cmd.Parameters.AddWithValue("@path", strBasePath)
            cmd.ExecuteNonQuery()
        Next
        MessageBox.Show("File Inserted into database successfully!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
        MysqlConn.Dispose()
        ProgressBar1.Value = 0
        Me.Cursor = Cursors.Default
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2019-12-31
      • 1970-01-01
      • 2019-08-25
      • 2014-12-08
      • 2013-08-20
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      相关资源
      最近更新 更多