使用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 .
任何建议都非常感谢!
您确定您正在正确的方式?????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 !";
}}