使用FileUpload控件一次将多个图像保存到数据库

本文关键字:图像 保存 数据库 一次 控件 FileUpload 使用 | 更新日期: 2023-09-27 18:12:06

我在一家公司的博客网站上工作,当用户在发表文章时,他们可以从他们的计算机上添加图像到文章中。我使用了FileUpload控件来做到这一点,它工作得很好。然而,我试图改变功能,让用户选择和上传多个图像在一个帖子,我遇到了一些问题。我已经将"允许多个"属性设置为"true",但是一旦多个图像被选择到控件中(图像url被逗号分隔),并且单击post按钮,只有一个图像被插入到数据库中,但它被插入的次数与图像一样多,并且只有一个图像显示在博客文章上。因此,如果我尝试添加三个不同的图像,它会将第一个图像的三个实例插入数据库。对应于我的onClick函数中的FileUpload的代码如下:

  if (imageUpload.HasFile == true)
                {
                    SqlCommand maxMessId = new SqlCommand("SELECT Max(MessageID) FROM BlogMessages", conn);
                    lastMessageID = Convert.ToInt32(maxMessId.ExecuteScalar());
                    foreach (var uploadedFile in imageUpload.PostedFiles)
                    {

                        SqlCommand cmdInsertImage = new SqlCommand("INSERT INTO BlogImages(Image, MessageID) VALUES (@Image, @MessageID)", conn);
                        cmdInsertImage.Parameters.AddWithValue("@Image", SqlDbType.Image).Value = imageUpload.FileBytes;
                        cmdInsertImage.Parameters.AddWithValue("@MessageID", lastMessageID);

                        cmdInsertImage.ExecuteNonQuery();
                    }
                }

我想问题可能出在:

cmdInsertImage.Parameters.AddWithValue("@Image", SqlDbType.Image).Value = imageUpload.FileBytes; 

如果这是获取文件字节只有一个图像..我不确定如何获得两个文件的文件字节。我的BlogImages表中的图片列的类型是image .

任何建议都非常感谢!

使用FileUpload控件一次将多个图像保存到数据库

您确定您正在正确的方式?????PostesFiles是文件列表,每个文件都有自己的属性,您需要从那里读取.....没有其他

这里有一个简单的例子

 For Each xx In fp.PostedFiles
        xx.InputStream
        xx.ContentLength
        xx.FileName

    Next

在这些属性中,inputstream是图像的流,contentelengight是图像的长度,Filename是图像的文件名。当你传递imageupload。FileBytes不是实现目标的正确方法。您必须读取流并返回一个字节数组,以便在sql server中保存数据。没有别的了,我希望它能帮助你解决你的问题。

更新*

假设你在foreach循环中为每个单独的文件设置自己的bytearray

MemoryStream ms = new MemoryStream();
file.PostedFile.InputStream.CopyTo(ms);
var byts = ms.ToArray();
ms.Dispose();
然后

像这样修改insert语句

    cmdInsertImage.Parameters.AddWithValue("@Image", SqlDbType.Image).Value = byts;

没有测试,但应该可以解决问题。

更新2

if (test.HasFiles) {
    StringBuilder sb = new StringBuilder();

    foreach (void el_loopVariable in test.PostedFiles) {
        el = el_loopVariable;
        sb.AppendLine("FILENAME:<B>" + el.FileName.ToString + "</B><BR/>");
        MemoryStream ms = new MemoryStream();
        el.InputStream.CopyTo(ms);
        byte[] byts = ms.ToArray;
        ms.Dispose();

        sb.AppendLine(string.Join(";", byts));
        sb.AppendLine("<br/<br/>");
        byts = null;
    }

    LitResponse.Text = sb.ToString;


}

我认为问题是,在你的每个循环,你通过发布的文件步进,但你仍然只是使用ImageUpload。FileBytes,我希望每次都返回相同的内容。

我对文件上传控件不是很熟悉,但也许你可以使用你上传的文件对象的ContentLength属性来索引ImageUpload返回的字节数组。FileBytes(假设数组包含多个文件中的每一个)。

protected void btnSubmit_Click(对象发送者,EventArgs e){

     string strImageName = txtImage.Text.ToString();      //to store image into sql database.

                if (FileUpload1.PostedFile != null &&
                FileUpload1.PostedFile.FileName != "")
                  {
                       byte[] imageSize = new byte[FileUpload1.PostedFile.ContentLength];
                       HttpPostedFile uploadedImage = FileUpload1.PostedFile;
                       uploadedImage.InputStream.Read(imageSize, 0, (int)FileUpload1.PostedFile.ContentLength);

                // Create SQL Command 
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "INSERT INTO Pictures(ID,ImageName,Image)" +
                           " VALUES (@ID,@ImageName,@Image)";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conn;
                //retrieve latest ID from tables which was stored in session.
                int ID = Convert.ToInt32(System.Web.HttpContext.Current.Session["ID"].ToString());
                SqlParameter ID = new SqlParameter
                            ("@ID", SqlDbType.Int, 5);
                ID.Value = (Int32)ID;
                cmd.Parameters.Add(ID);
                SqlParameter ImageName = new SqlParameter
                            ("@ImageName", SqlDbType.VarChar, 50);
                ImageName.Value = strImageName.ToString();
                cmd.Parameters.Add(ImageName);
                SqlParameter UploadedImage = new SqlParameter("@Image", SqlDbType.Image, imageSize.Length);
                UploadedImage.Value = imageSize;
                cmd.Parameters.Add(UploadedImage);
                conn.Open();
                int result = cmd.ExecuteNonQuery();
                conn.Close();
                if (result > 0)
                    lblMessage.Text = "File Uploaded";
                lblSuccess.Text = "Successful !";

  }}