使用FileUpload Control一次将多个映像保存到数据库

时间:2014-07-09 15:49:54

标签: c# asp.net image file-upload

我正在公司的博客网站上工作,当用户发帖时,他们可以将图像从他们的计算机添加到帖子中。我使用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列的类型为Image。

非常感谢任何建议!

3 个答案:

答案 0 :(得分:1)

你确定你正在以正确的方式工作吗????? PostesFiles是文件列表,每个人都有自己的属性,你需要从那里读取.....没有别的

这里有一个简单的例子

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


    Next

当这些属性暴露出Inputstrem图像流时,ContenteLenght它长度,Filename图像的文件名。所以当你传递imageupload.FileBytes不是实现目标的正确方法。你必须阅读流并返回一个bytearray来保存你的sql server的数据。我希望它不能帮助你解决你的问题。

<强> UPDATE *

假设您已经进入每个单独文件的foreach循环,您必须设置自己的bytearray

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

然后

像这样更改你的插入语句

    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;





}

答案 1 :(得分:0)

我认为问题在于,在每个循环中,您都会逐步浏览已发布的文件,但您每次仍然只使用ImageUpload.FileBytes,我希望它会返回同样的东西每一次。

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

答案 2 :(得分:0)

protected void btnSubmit_Click(object sender,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 !";


  }}