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