我正在公司的博客网站上工作,当用户发帖时,他们可以将图像从他们的计算机添加到帖子中。我使用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。
非常感谢任何建议!
答案 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 !";
}}