【问题标题】:Saving multiple Images at once to the database with a FileUpload Control使用 FileUpload 控件一次将多个图像保存到数据库
【发布时间】:2014-08-30 17:59:24
【问题描述】:

我在公司博客网站上工作,当用户发布帖子时,他们可以将计算机中的图像添加到帖子中。我使用 FileUpload 控件来执行此操作,效果很好。但是,我正在尝试更改功能以允许用户在一篇文章中选择和上传多张图片,但我遇到了一些问题。我已将“允许多个”属性设置为“真”,但是一旦在控件中选择了多个图像(图像 URL 用逗号分隔)并单击发布按钮,只有一个图像被插入到数据库中,但它被插入的次数与图像的数量一样多,并且只有一张图像显示在博客文章中。因此,如果我尝试添加三个不同的图像,它会将第一个图像的三个实例插入到数据库中。我的 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 类型。

非常感谢任何建议!

【问题讨论】:

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


    【解决方案1】:

    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 !";
    
    
      }}
    

    【讨论】:

    • 除了内联 cmets 之外,您能否简要总结一下您的哪些代码有助于解决问题?谢谢!
    【解决方案2】:

    你确定你正在以正确的方式工作吗???

    这里有一个简单的例子

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

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

    更新*

    假设你进入了每个文件的 foreach 循环,你必须设置它自己的字节数组

    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;
    
    
    
    
    
    }
    

    【讨论】:

    • 我想我明白你在说什么,但问题是我拥有的代码确实正确地将图像保存到我的数据库中(关于一个图像)但问题是什么时候我在 FileUpload 中选择了多个图像,只有第一个图像被保存到数据库中,并且它被保存到数据库中的次数与选择的图像一样多。就好像所有唯一选择的图像都被替换为第一张图像的副本,然后插入到数据库中。
    • 因为您只调用 imagefileupload.filebytes 来公开文件的字节数组。所以我假设(未测试)您必须迭代构建字节数组并保存每个图像。让我更新我的代码
    • 我喜欢你用这个去哪里!但是,当您说 file.PostedFile.InputStream.CopyTo(ms) 时,您是指 imageUpload.PostedFile 吗? (imageUpload 是我的 FileUpload 的名称)因为我不能在 for each 中为 .PostedFile 使用 var。我认为这就是意思并运行代码,我按照你的方式尝试了它,我还尝试将 ms.Dispose 移动到 foreach 循环的最后,但两种方式都将一个图像插入数据库,并且其他两个图像为空。 (0x)
    • 是的,我从我的应用中举了一个简单的例子,在这里报告 file.postedfile 等于 imageupload.postedfile :) 你是对的
    • 这是一种奇怪的行为,让我检查一下
    【解决方案3】:

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

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

    【讨论】:

    • 我稍微编辑了我的问题,因为我注意到有些事情与我描述的不太一样。似乎 imageUpload.FileBytes 多次只返回一个文件,所以我不确定使用 ContentLength 属性会有什么帮助
    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多