我已经能够以二进制格式将图像上传到sql server。这是我用来上传它的代码..
protected void Button2_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
string filename = FileUpload1.FileName;
Stream imgStream = FileUpload1.PostedFile.InputStream;
int imgLen = FileUpload1.PostedFile.ContentLength;
byte[] imgBinaryData = new byte[imgLen];
string strCm = "s_PictInsert";
SqlCommand cm = new SqlCommand(strCm, Cn);
cm.CommandType = CommandType.StoredProcedure;
cm.Parameters.Add(new SqlParameter("@TheImage", SqlDbType.Image)).Value = imgBinaryData;
Cn.Open();
cm.ExecuteNonQuery();
Cn.Close();
}
}
当我查看数据库时,我在数据库中看到的所有我上传的图片都是0x00000000000000等...我不知道为什么它看起来像......
然后我使用此代码检索图像..
protected void Button3_Click(object sender, EventArgs e)
{
string strCm = "select TheImage from [Pictures] where PictureID = 2";
SqlCommand cm = new SqlCommand(strCm, Cn);
cm.CommandType = CommandType.Text;
Cn.Open();
SqlDataReader dr = cm.ExecuteReader();
if (dr.Read())
{
Response.ContentType = "image/jpg";
Response.BinaryWrite((byte[])dr["TheImage"]);
}
Cn.Close();
}
当我点击按钮时它没有显示图像,只是将标记写到页面上。
我想要做的是检索图像并将其放到asp图像中,我上传的图像可能是.png格式。
我只使用了response.binarywrite,因为这就是我的表现。但它不像我被告知的那样有效。
由于
答案 0 :(得分:1)
问题在于您的上传功能,您没有使用文件流中的数据设置imgBinaryData
,您只需设置匹配的大小,因此默认为全零。
而不是这部分:
byte[] imgBinaryData = new byte[imgLen];
替换为:
byte[] imgBinaryData = null;
using (var reader = new BinaryReader(FileUpload1.PostedFile.InputStream))
{
imgBinaryData = reader.ReadBytes(FileUpload1.PostedFile.ContentLength);
}
然后检查您的数据库数据是什么样的。
另外,我建议在将文件存储到数据库时始终存储文件名和MIME类型,您永远不知道何时需要它们!
答案 1 :(得分:1)
试试这个:
var length = FileUpload1.PostedFile.ContentLength;
Byte[] imgBinaryData = new Byte[length];
var stream = FileUpload1.FileContent;
stream.Read(imgBinaryData, 0, length);
然后插入二进制对象。您的代码不会将图像读入流中以进行插入。上面的代码应该将图像读入字节数组,然后你的db代码应该插入实际数据而不是占位符。
答案 2 :(得分:1)
您正在以二进制格式将图像存储到数据库中,您将检索相同的图像。您需要使用MemoryStream从您检索的字节数组中获取图像。
看到这个: Retrieve image from database and display on ASP.NET without httphandler