Поместите requirements.txt
в корневой каталог вашего git-репо с вашими необходимыми зависимостями (указанными в формате pip / easy-install).
Пример, взятый с сайта Heroku :
Flask==0.8
Jinja2==2.6
Werkzeug==0.8.3
certifi==0.0.8
chardet==1.0.1
distribute==0.6.24
gunicorn==0.14.2
requests==0.11.1
Ну, так как не получив помощи, я ушел от проблемы и заставил ее работать наконец. Вот мой рабочий код.
СОХРАНИТЬСЯ в MySQL из Picturebox (pbPicture)
Dim filename As String = txtName.Text + ".jpg"
Dim FileSize As UInt32
conn.Close()
Dim mstream As New System.IO.MemoryStream()
PbPicture.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg)
Dim arrImage() As Byte = mstream.GetBuffer()
FileSize = mstream.Length
Dim sqlcmd As New MySqlCommand
Dim sql As String
mstream.Close()
sql = "insert into [your table] (picture, filename, filesize)
VALUES(@File, @FileName, @FileSize)"
Try
conn.Open()
With sqlcmd
.CommandText = sql
.Connection = conn
.Parameters.AddWithValue("@FileName", filename)
.Parameters.AddWithValue("@FileSize", FileSize)
.Parameters.AddWithValue("@File", arrImage)
.ExecuteNonQuery()
End With
Catch ex As Exception
MsgBox(ex.Message)
Finally
conn.Close()
End Try
LOAD из MySQL db Назад в Picturebox
Dim adapter As New MySqlDataAdapter
adapter.SelectCommand = Cmd
data = New DataTable
adapter = New MySqlDataAdapter("select picture from [yourtable]", conn)
ПРИМЕЧАНИЕ! может помещать только одно изображение в ящик для изображений, поэтому, очевидно, этот запрос может вернуть только одну запись для вас
commandbuild = New MySqlCommandBuilder(adapter)
adapter.Fill(data)
Dim lb() As Byte = data.Rows(0).Item("picture")
Dim lstr As New System.IO.MemoryStream(lb)
PbPicture.Image = Image.FromStream(lstr)
PbPicture.SizeMode = PictureBoxSizeMode.StretchImage
lstr.Close()
Протестированный код для хранения и извлечения изображений с использованием MySQL и VB.NET
Public Class FMImage
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If OpenFileDialog1.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
TextBox1.Text = OpenFileDialog1.FileName
Dim filename As String = TextBox1.Text
Dim FileSize As UInt32
Dim Conn As MySql.Data.MySqlClient.MySqlConnection
Conn = New MySql.Data.MySqlClient.MySqlConnection
Try
If Conn.State = ConnectionState.Open Then Conn.Close()
Conn.ConnectionString = MySQLConnectionString
Conn.Open()
Catch ex As Exception
MessageBox.Show(ex.ToString, "Connect")
End Try
Dim mstream As System.IO.MemoryStream = ConvertImageFiletoMemoryStream(filename)
PbPicture.Image.Save(mstream, Drawing.Imaging.ImageFormat.Jpeg)
Dim arrImage() As Byte = ConvertImageFiletoBytes(filename)
FileSize = mstream.Length
Dim sqlcmd As New MySql.Data.MySqlClient.MySqlCommand
Dim sql As String
mstream.Close()
'CREATE TABLE `actors` ( `actor_pic` longblob,`filesize` bigint(20) default NULL,`filename` varchar(150) default NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1;
sql = "insert into actors (actor_pic, filesize, filename) VALUES(@File, @FileName, @FileSize)"
Try
With sqlcmd
.CommandText = sql
.Connection = Conn
.Parameters.AddWithValue("@FileName", filename)
.Parameters.AddWithValue("@FileSize", FileSize)
.Parameters.AddWithValue("@File", arrImage)
.ExecuteNonQuery()
End With
Catch ex As Exception
MsgBox(ex.Message)
End Try
Dim adapter As New MySql.Data.MySqlClient.MySqlDataAdapter
adapter.SelectCommand = New MySql.Data.MySqlClient.MySqlCommand("SELECT actor_pic, filesize, filename FROM actors", Conn)
Dim Data As New DataTable
'adapter = New MySql.Data.MySqlClient.MySqlDataAdapter("select picture from [yourtable]", Conn)
Dim commandbuild As New MySql.Data.MySqlClient.MySqlCommandBuilder(adapter)
adapter.Fill(Data)
MsgBox(Data.Rows.Count)
Dim lb() As Byte = Data.Rows(Data.Rows.Count - 1).Item("actor_pic")
Dim lstr As New System.IO.MemoryStream(lb)
PbPicture.Image = Image.FromStream(lstr)
PbPicture.SizeMode = PictureBoxSizeMode.StretchImage
lstr.Close()
End If
End Sub
Public Function ConvertImageFiletoBytes(ByVal ImageFilePath As String) As Byte()
Dim _tempByte() As Byte = Nothing
If String.IsNullOrEmpty(ImageFilePath) = True Then
Throw New ArgumentNullException("Image File Name Cannot be Null or Empty", "ImageFilePath")
Return Nothing
End If
Try
Dim _fileInfo As New IO.FileInfo(ImageFilePath)
Dim _NumBytes As Long = _fileInfo.Length
Dim _FStream As New IO.FileStream(ImageFilePath, IO.FileMode.Open, IO.FileAccess.Read)
Dim _BinaryReader As New IO.BinaryReader(_FStream)
_tempByte = _BinaryReader.ReadBytes(Convert.ToInt32(_NumBytes))
_fileInfo = Nothing
_NumBytes = 0
_FStream.Close()
_FStream.Dispose()
_BinaryReader.Close()
Return _tempByte
Catch ex As Exception
Return Nothing
End Try
End Function
Public Function ConvertBytesToMemoryStream(ByVal ImageData As Byte()) As IO.MemoryStream
Try
If IsNothing(ImageData) = True Then
Return Nothing
'Throw New ArgumentNullException("Image Binary Data Cannot be Null or Empty", "ImageData")
End If
Return New System.IO.MemoryStream(ImageData)
Catch ex As Exception
Return Nothing
End Try
End Function
Public Function ConvertImageFiletoMemoryStream(ByVal ImageFilePath As String) As IO.MemoryStream
If String.IsNullOrEmpty(ImageFilePath) = True Then
Return Nothing
' Throw New ArgumentNullException("Image File Name Cannot be Null or Empty", "ImageFilePath")
End If
Return ConvertBytesToMemoryStream(ConvertImageFiletoBytes(ImageFilePath))
End Function
End Class
Принятый и поддержанный ответ может работать, но он субоптимален и довольно расточителен:
MemoryStream
, чтобы получить изображение в массив байтов. .GetBuffer()
совершенно неверно: буфер memstream часто включает неиспользуемые, выделенные байты. С тестовым файлом 25k ToArray()
возвращает 25434 байта - правильный размер изображения, в то время как GetBuffer()
возвращает 44416. Чем больше изображение, тем больше будет пустых байтов. Это использует объекты поставщика MySQL, так как он имеет такую метку, но используемый поставщик данных (MySQL, SQLServer, OleDB и т. д.) не имеет значения: все они работают одинаково.
В случаях, когда источником изображения является PictureBox, используйте MemoryStream
:
Dim picBytes As Byte()
Using ms As New MemoryStream()
picBox1.Image.Save(ms, imgFormat)
picBytes = ms.ToArray() ' NOT GetBuffer!
End Using
. Поскольку изображение должно было откуда-то прибыть, если это файл, это все, что вам нужно:
picBytes = File.ReadAllBytes(filename)
Как только у вас есть изображение в виде байтов, чтобы сохранить:
Dim SQL = "INSERT INTO <YOUR TBL NAME> (picture, filename, filesize) VALUES(@Pic, @FileName, @FileSize)"
Using conn As New MySqlConnection(connstr)
Using cmd As New MySqlCommand(SQL, conn)
conn.Open()
cmd.Parameters.Add("@Pic", MySqlDbType.Blob).Value = picBytes
cmd.Parameters.Add("@FileName", MySqlDbType.String).Value = filename
cmd.Parameters.Add("@FileSize", MySqlDbType.Int32).Value = FileSize
cmd.ExecuteNonQuery()
End Using
End Using ' close and dispose of Connection and Command objects
Dim imgData As Byte()
'... open connection, set params etc
Using rdr As MySqlDataReader = cmd.ExecuteReader
If rdr.HasRows Then
rdr.Read()
imgData = TryCast(rdr.Item("Image"), Byte())
' in case this record has no image
If imgData IsNot Nothing Then
' ToDo: dispose of any previous Image
' create memstream from bytes
Using ms As New MemoryStream(imgData)
' create image from stream, assign to PicBox
picBox1.Image = CType(Image.FromStream(ms), Image)
End Using
End If
End If
End Using
Примечание что Bitmaps
и Images
должны быть удалены. Если вы повторно создаете новые изображения, когда пользователь просматривает базу данных, ваше приложение будет течь и в конечном итоге сбой. Если вы много конвертируете назад, вы можете написать вспомогательный или дополнительный метод для преобразования изображений в байты и наоборот.
DBConnection
и DBCommand
объекты также должны быть удалены. Блок Using
делает это для нас.
Ссылки, ресурсы:
У меня возникла проблема с использованием программы mr @dMo, которая показывает мне ошибку «Изображение столбца» не может быть нулевым
здесь это мой код.
Private Sub ButtonSave_Click(sender As Object, e As EventArgs) Handles ButtonSave.Click
Dim filename As String = TextBoxSave.Text + ".jpg"
Dim FileSize As UInt32
conn.Close()
Dim mstream As New System.IO.MemoryStream()
PictureBoxSave.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg)
Dim arrImage() As Byte = mstream.GetBuffer()
FileSize = mstream.Length
Dim sqlcmd As New MySqlCommand
Dim sql As String
mstream.Close()
sql = ("insert into employeedetails (picture,filename,filesize) VALUES(@File, @FileName, @FileSize)")
Try
conn.Open()
With sqlcmd
.CommandText = sql
.Connection = conn
.Parameters.AddWithValue("@FileName", filename)
.Parameters.AddWithValue("@FileSize", FileSize)
.Parameters.AddWithValue("@File", arrImage)
.ExecuteNonQuery()
End With
Catch ex As Exception
MsgBox(ex.Message)
Finally
conn.Close()
End Try
End Sub
PS Мне жаль, что вы разместили этот комментарий и ответ. У меня недостаточно репутации, чтобы прокомментировать эту запись