我在将一些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)
文件被覆盖........
非常感谢.......
答案 0 :(得分:0)
您必须先将图像转换为字节数组,然后才能将其存储在数据库中。我使用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
我将图像存储在会话对象中,因为还有其他事情发生,我还无法将图像保存到数据库,直到用户单击保存按钮。将字节数组传递给存储过程以保存到数据库非常简单。
答案 1 :(得分:0)
感谢我使用它的帮助。问题是解决
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