C# 使用FileUpload控件将多个图像同时保存到数据库

C# 使用FileUpload控件将多个图像同时保存到数据库,c#,asp.net,image,file-upload,C#,Asp.net,Image,File Upload,我在一家公司的博客网站上工作,当用户发表文章时,他们可以将计算机中的图像添加到文章中。我使用了一个FileUpload控件来实现这一点,效果非常好。但是,我正在尝试更改功能,以允许用户在一篇文章中选择和上载多个图像,我遇到了一些问题。我已经将“允许多个”属性设置为“true”,但是,一旦在控件中选择了多个图像(图像URL用逗号分隔)并单击“发布”按钮,则只有一个图像插入到数据库中,但插入的次数与图像的次数相同,并且只有一个图像显示在博客文章中。因此,如果我尝试添加三个不同的图像,它会将第一个图像

我在一家公司的博客网站上工作,当用户发表文章时,他们可以将计算机中的图像添加到文章中。我使用了一个FileUpload控件来实现这一点,效果非常好。但是,我正在尝试更改功能,以允许用户在一篇文章中选择和上载多个图像,我遇到了一些问题。我已经将“允许多个”属性设置为“true”,但是,一旦在控件中选择了多个图像(图像URL用逗号分隔)并单击“发布”按钮,则只有一个图像插入到数据库中,但插入的次数与图像的次数相同,并且只有一个图像显示在博客文章中。因此,如果我尝试添加三个不同的图像,它会将第一个图像的三个实例插入数据库。与my 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; 
如果仅获取一个图像的文件字节。。我不确定如何获取这两个文件的filebytes。my BlogImages表中的image列的类型为image


任何建议都将不胜感激

我认为问题在于,在for-each循环中,您正在逐步浏览发布的文件,但每次仍然使用ImageUpload.FileBytes,我希望每次都会返回相同的内容


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

您确定您的工作方式正确吗????PostesFiles是文件列表,每个文件都有自己的属性,您需要从中读取…没有其他内容

这里有一个简单的例子

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


    Next
当这些属性暴露在输入端时,会形成一个图像流,内容长度,Filename图像的文件名。因此,当您传递imageupload时。FileBytes不是实现目标的正确方法。您必须读取流并返回bytearray以将数据保存到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;





}
if(test.HasFiles){
StringBuilder sb=新的StringBuilder();
foreach(test.PostedFiles中的void el_loopVariable){
el=el_变量;
sb.AppendLine(“文件名:+el.FILENAME.ToString+”
); MemoryStream ms=新的MemoryStream(); el.InputStream.CopyTo(毫秒); 字节[]byts=ms.ToArray; Dispose女士(); sb.AppendLine(string.Join(“;”,byts));
sb.AppendLine(“受保护的void btnsupmit_单击(对象发送方,事件参数e) {


我对我的问题进行了一些编辑,因为我注意到有些东西与我描述的不完全一样。似乎imageUpload.FileBytes多次只返回其中一个文件,所以我不确定使用ContentLength属性会有什么帮助。我想我理解你的意思,但问题是,我的代码确实在保存im正确老化到我的数据库(关于一个图像)但问题是,当我在文件上载中选择了多个图像时,只有第一个图像保存到数据库中,并且保存到数据库的次数与选择的图像的次数相同。这就好像所有唯一选择的图像都被第一个图像的副本替换,然后插入到数据库中。因为您只调用imagefileupload.filebytes,它公开文件的字节数组。因此我假设(未测试)您必须迭代以构建bytearray并保存每个图像。让我更新我的代码我喜欢您的做法!但是,当您说file.PostedFile.InputStream.CopyTo(ms)时,您是指imageUpload.PostedFile吗?(imageUpload是我的FileUpload的名称)因为我不能在for each for.PostedFile中使用var。我假设这就是它的意思并运行了代码,我按您的方式进行了尝试,还尝试将ms.Dispose移动到foreach循环的最末端,但这两种方式都会将一个图像插入数据库,而其他两个图像为null。(0x)是的,我从我的应用程序中选取了一个简单的例子,并在这里报告file.postedfile等于imageupload.postedfile:)你说得对。这是一个奇怪的行为让我在我的末尾检查一下。除了在线注释之外,你能添加一个简短的摘要,说明你的代码中哪些部分有助于解决问题吗?谢谢!
     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 !";


  }}