这是我在数据库中的表格:
我读了数据库,如:
DataClassesDataContext db = new DataClassesDataContext();
usertable thisuser = db.usertables.First(p => p.username == User.Identity.Name);
因此,thisuser.picture
是图像的句柄。但是如何在我的页面上的asp:image控件中显示它呢?
修改 我用这段代码保存了图片:
DataClassesDataContext db = new DataClassesDataContext();
usertable thisuser = db.usertables.First(p => p.username == User.Identity.Name);
byte[] filebyte = FileUpload1.FileBytes;
System.Data.Linq.Binary fileBinary = new System.Data.Linq.Binary(filebyte);
thisuser.picture = fileBinary;
db.SubmitChanges();
有什么不对吗?
答案 0 :(得分:4)
<asp:Image ImageUrl='<%# GetImage(Eval("IMG_DATA")) %>' />
上面我们告诉ASPX引擎我们想要获取列[IMG_DATA]的值,并将其传递给页面的方法GetImage,它应该返回一个有效的图像。所以,让我们在页面类中实现该方法:
public string GetImage(object img)
{
return "data:image/jpg;base64," + Convert.ToBase64String((byte[])img);
}
答案 1 :(得分:4)
您需要创建通用处理程序 - 让我们将其称为ImageHandler.ashx,它将位于您的网络应用程序的根目录中。
public class ImageHandler : IHttpHandler {
public void ProcessRequest(HttpContext context) {
// here is the tricky part - you don't store image type anywhere (you should)
// assuming jpeg
context.Response.ContentType = "image/jpeg";
DataClassesDataContext db = new DataClassesDataContext();
if (HttpContext.Current.User != null && HttpContext.Current.User.Identity != null) {
var thisuser = db.usertables.First(p => p.username == HttpContext.Current.User.Identity.Name);
if (thisuser != null) {
byte[] buffer = thisuser.picture.ToArray();
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
}
}
}
public bool IsReusable {
get { return false; }
}
}
然后在页面中添加:
<asp:Image runat="server" ImageUrl="~/ImageHandler.ashx" />
很少注意到:
你应该考虑缓存图像
你应该从image sql类型切换到varbinary(http://msdn.microsoft.com/en-us/library/ms187993.aspx)
你应该在某处存储图像mimetype(如果它是jpeg,png,bmp) - 最好是在同一个表中,并在服务器中为服务器提供正确的mimetype
答案 2 :(得分:4)
ASP.NET Image
控件松散地表示HTML中的<img>
标记。因此,您只能通过将URL设置为要嵌入页面的图像内容,将图像转换为HTML文档。
<img src="images/picture.png" />
这意味着您需要一种机制来获取请求图像资源的HTTP请求,并返回包含图像二进制数据的响应。
使用ASP.NET Web API,这将成为一项简单的实现操作:
public HttpResponseMessage GetImage(string username)
{
DataClassesDataContext db = new DataClassesDataContext();
usertable thisuser = db.usertables.FirstOrDefault(
p => p.username == username);
if (thisuser == null)
{
return new HttpResponseMessage(HttpStatusCode.NotFound));
}
// Create a stream to return to the user.
var stream = new MemoryStream(thisuser.picture.ToArray());
// Compose a response containing the image and return to the user.
var result = new HttpResponseMessage();
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType =
new MediaTypeHeaderValue("image/jpeg");
return result;
}
如果您无法使用Web API,则必须实施HTTP处理程序才能执行相同的工作。
在ASP.NET页面中,您必须将属性ImageUrl
设置为为控制器/处理程序配置的地址,包括用户名作为URL的一部分。
答案 3 :(得分:0)
如果thisuser.picture有一个正确的图像路径,你可以尝试这样的事情:
Image im = new Image();
im.ID = "myImg";
im.ImageUrl = thisuser.picture.toString();
this.Controls.Add(im);
我假设您正在使用网络表单(我认为这不会有所作为。)
此外,这可能需要页面刷新。 'this'指的是Page对象(在我的例子中)。
答案 4 :(得分:0)
您不能使用ASP.NET Image控件直接渲染它(或者至少不是我立刻意识到的)。很快我的头脑:
解决方案1: 你的图像需要一些HttpHandler。在您的asp:image标签中,您需要一个将由此特定HttpHandler拾取的ImageUrl。在那里,您可以使用正确的MIME类型和标题将数据库中的图像内容写为字节。
解决方案2: 看看在URL中嵌入数据,也许你可以像这样写出你的图像并将其添加到asp:image ImageUrl中:https://en.wikipedia.org/wiki/Data_URI_scheme
答案 5 :(得分:0)
创建ashx页面。在它上面使用像这样的东西
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/jpeg";
Stream strm = new MemoryStream(GetImage(ID));
long length = strm.Length;
byte[] buffer = new byte[length];
int byteSeq = strm.Read(buffer, 0, 2048);
while (byteSeq > 0)
{
context.Response.OutputStream.Write(buffer, 0, byteSeq);
byteSeq = strm.Read(buffer, 0, 2048);
}
}
ON get image method
public static byte[] GetImage(string ImageId)
{
byte[] img = null;
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "USP_SELECT_GLOBAL_METHOD";
cmd.Parameters.AddWithValue("@EVENT", 5);
cmd.Parameters.AddWithValue("@CODE", ImageId);
cmd.Connection = DL_CCommon.Connection();
SqlDataReader dr = null;
dr = cmd.ExecuteReader();
if (dr.Read())
{
img = (byte[])dr[0];
}
dr.Close();
return img;
}
此方法返回将图像作为您的ID返回。
..
Image1.ImageUrl = "somthing.ashx?ID="+userImageID;
我希望它能奏效。因为我发现它在我自己的工作。谢谢