【问题标题】:Sending multiple image files to mySQL将多个图像文件发送到 mySQL
【发布时间】:2014-04-06 08:13:29
【问题描述】:

如何使用 C# 将多个 jpg 文件作为字节数组发送到我的 mySQL 数据库?

我已阅读并了解如何将图像文件转换为字节数组,但我只能弄清楚如何使用该方法将单个图像作为 blob 转换为 mySQL。我的应用程序要求用户上传至少 2 个图像文件,最多允许 10 个,同时从多个文本框发送信息。我尝试创建一个字节数组的数组,但这不起作用。当我在 mySQL 的 INSERT 字符串期间在特定索引处引用该数组时,它似乎只存储一个字节数组并引用该字节数组的索引,而不是应该存储在该索引中的整个字节数组。下面是一些显示我尝试的代码:

 ///uploading the image and converting it to a byte array
 private void uploadButtonClick(object sender, RoutedEventArgs e)
    {
        chosenFileTextBox.Text = "No file chosen";
        try
        {
            FileStream fs = new FileStream(imageFileNameArray[i], FileMode.Open,                         
                 FileAccess.Read);
            BinaryReader br = new BinaryReader(fs);
            imageFileArray = br.ReadBytes((int)fs.Length);
            ///Array of byte arrays
            imageArray[i] = imageFileArray;
            uploadedFilesTextBox.Text += imageFileSafeNameArray[i].ToString() + "\n";

创建插入字符串的尝试如下。当我只发送一个字节数组时,字符串有效,所以我将代码更改为尝试下面的 2 个字节数组,但没有运气:

 //open connection
        if (this.OpenConnection() == true)
        {
            //create command and assign the query and connection from the constructor
            try
            {
                MySqlCommand cmd = new MySqlCommand(query, connection);
                cmd.Parameters.Add("?_Date", MySqlDbType.VarChar).Value = dateString;
                cmd.Parameters.Add("?Sex", MySqlDbType.Text).Value = sexString;
                cmd.Parameters.Add("?FirstName", MySqlDbType.Text).Value = 
                     firstNameString;
                cmd.Parameters.Add("?LastName", MySqlDbType.Text).Value =
                     lastNameString;
                cmd.Parameters.Add("?StageName", MySqlDbType.VarChar).Value = 
                     stageNameString;
                cmd.Parameters.Add("?Age", MySqlDbType.Text).Value = ageString;
                cmd.Parameters.Add("?Height", MySqlDbType.VarChar).Value = heightString;
                cmd.Parameters.Add("?weight", MySqlDbType.Text).Value = weightString;
                cmd.Parameters.Add("?Chest", MySqlDbType.Text).Value = chestString;
                cmd.Parameters.Add("?Waist", MySqlDbType.Text).Value = waistString;
                cmd.Parameters.Add("?Hips", MySqlDbType.Text).Value = hipsString;
                cmd.Parameters.Add("?Dress", MySqlDbType.Text).Value = dressString;
                cmd.Parameters.Add("?Shirt", MySqlDbType.Text).Value = shirtString;
                cmd.Parameters.Add("?Pants", MySqlDbType.VarChar).Value = pantsString;
                cmd.Parameters.Add("?Shoe", MySqlDbType.VarChar).Value = shoeString;
                cmd.Parameters.Add("?Email", MySqlDbType.VarChar).Value = emailString;
                cmd.Parameters.Add("?Phone", MySqlDbType.VarChar).Value = phoneString;
                cmd.Parameters.Add("?City", MySqlDbType.Text).Value = cityString;
                cmd.Parameters.Add("?_State", MySqlDbType.Text).Value = stateString;
                cmd.Parameters.Add("?Experience", MySqlDbType.VarChar).Value = 
                     experienceString;
                ///"?Image1" represents Image1 column.  There are 10 columns, but for
                /// this example there are only 2.
                cmd.Parameters.Add("?Image1", MySqlDbType.Blob).Value = 
                     imageArray.GetValue(0);
                cmd.Parameters.Add("?Image2", MySqlDbType.Blob).Value = 
                     imageArray.GetValue(1);

                //Execute command
                cmd.ExecuteNonQuery();

                //close connection
                this.CloseConnection();
                MessageBox.Show("Connection Closed");
            }

【问题讨论】:

  • 我没有 mysql 来测试这个理论,但是你有没有尝试将 imageArray[0] 直接分配给 "?Image1" 参数?
  • cmd.Parameters.Add("?Image1", MySqlDbType.Blob).Value = (byte[])imageArray.GetValue(0); 帮助?您也可以尝试cmd.Parameters.Add("?Image1", MySqlDbType.Blob, ((byte[])imageArray.GetValue(0)).Length).Value = (byte[])imageArray.GetValue(0);,如果可行,请清理代码。最后,确保您的图像大小不大于 65535,否则您将不得不使用 LongBlob 之类的东西。

标签: c# mysql wpf bytearray jpeg


【解决方案1】:

您可能想查看您的数据库结构。在这种情况下,您可能需要多个图像列,或者最好将图像提取到单独的表中,以便每个“用户”可以有 N 个图像。

更改可能包括添加具有以下列的Images 表:

int FK_UserID
斑点图像
int 图像类型

FK_UserID 设置为 userId,并且您可以拥有一个 ImageType 列,这样您就可以拥有,例如,ImageType of 1 用于个人资料照片等。
然后,一旦您存储了您的用户并知道他的 ID,您就可以在此表上执行单独的 insert

【讨论】:

  • 对不起,我确实有多行图片。我忘了把它们添加到这个例子中。我总共有10个。你有这个提取的例子吗?当用户使用此 Web 应用程序/表单时,他们在字段中提供的所有信息以及 2-10 张图像将被发送到一个表中。它将在一个表中保存每个用户的所有信息。
  • 我添加了一个示例。这样做意味着您可以保存用户,然后在一个单独的步骤中为他们上传图像,知道他们的用户 ID。看看使用 Uploadify 之类的异步上传。
  • 我不知道我的问题是否清楚,因为我问了另一个程序员我在这里问了什么,他提出的建议与您在示例中所做的相同。我的问题不是上传或保存到数据库部分。我将根据上传的图像数量使用 switch 语句。此外,我将数据库的 10 个 Blob 列默认设置为 null,这样就可以了。我真正的问题是我无法让我的程序创建 10 字节数组以发送到 DBconnect 类。我尝试制作一个字节数组的数组,但没有奏效。我的朋友推荐了名单。有什么建议吗?
  • 感谢您的回答。另外,你介意提出我的问题吗? IDK 如果其他人看到它。
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多