如何在asp.net中使用jquery ajax从数据库加载图像

时间:2016-10-13 07:40:30

标签: c# jquery asp.net ajax

我正在通过jQuery AJAX在ASP.Net中创建评论系统,但我面临着从数据库加载图像的问题。我在数据库中有3个表:

  1. 放在userRegistration(UID(PK),用户名....)
  2. 资料(配置文件ID(PK),UID(FK),fulname,userPic ...)
  3. 注释(cmntID(PK),cmntText,UID(FK)....)
  4. 以下是jQuery AJAX代码:

    function getcomment() {
        var postPlace = $('div.q1');
        $.ajax({
            url: '/WebForm1.aspx/GetComment',
            contentType: "application/json; charset=utf-8",
            data: "{}",
            dataType: 'json',
            type: 'POST',
            success: function (data) {
                var newData = jQuery.parseJSON(data.d);
                var trHtml = '';
                var loadPost = postPlace;
    
                $.each(newData, function (i, item) {
                    trHtml += '<div class="q2" style="background-color: red">' +
                       '<img src="' + item.userPic + '" class="img-circle" width="32px" height="32px" />'+
                       '<span>' + item.username + '</span>' +
                       '<p>' + item.cmntText + '</p>' + '</div>';
                });
                loadPost.html(trHtml);
            }
    

    这是循环内部item.userPic的问题。 item.usernameitem.cmntText效果很好,但item.userPic无效。但是,当我访问配置文件表的另一个属性,如fulname时,它的工作原理。我无法访问同一个表中的userPic

    这是C#背后的代码:

    [WebMethod]
    public static string GetComment()
    {
        string connection = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
        SqlConnection con = new SqlConnection(connection);
        SqlDataAdapter da = new SqlDataAdapter("select * from userregistration inner join comment on userregistration.uid=comment.uid inner join profile on comment.uid=profile.uid  order by cmntID DESC ", con);
        DataTable dt = new DataTable();
        da.Fill(dt);
        return JsonConvert.SerializeObject(dt);
    }
    

    这是我得到的结果:

    enter image description here

2 个答案:

答案 0 :(得分:1)

如果要检索base64编码的字符串,请设置&#39; src&#39;带有base64编码字符串的image标签的属性。 例如:

$("#img").attr('src','data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==');

如果您要检索图像的路径,则必须使用ajax调用检索图像,并使用asmx中的HttpContext.Current.Server.MapPath("~/"),您必须指定图像文件夹的位置。

将以下代码段添加到函数或Web方法

string strdocPath;
        try
        {
            strdocPath = (Server.MapPath("~\\Uploads\\" + DocumentName));

            FileStream objfilestream = new FileStream(strdocPath, FileMode.Open, FileAccess.Read);
            int len = (int)objfilestream.Length;
            Byte[] documentcontents = new Byte[len];
            objfilestream.Read(documentcontents, 0, len);
            objfilestream.Close();
            string result = Convert.ToBase64String(documentcontents);
            return result;
        }
        catch (Exception ex)
        {
            return ex.ToString();
        }

注意:替换&#39;上传&#39;根据您的需要,即图像所在的文件夹。另请注意,我传递的是“文件名称”&#39;这实际上只是文件名。

答案 1 :(得分:0)

您必须使用另一个接受用户ID并返回图像的页面或处理程序,代码应如下所示:

在JavaScript块中,您将更改绘制图像标记的部分

$.each(newData, function (i, item) {
                trHtml += '<div class="q2" style="background-color: red">' +
                   '<img src="/GetUserImage?userId=' + item.username + '" class="img-circle" width="32px" height="32px" />'+
                   '<span>' + item.username + '</span>' +
                   '<p>' + item.cmntText + '</p>' + '</div>';
            });

然后创建一个新的HTTP Handler,如下所示

public class UserImagesHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        //Get username from from query string

        //Get binary data

        context.Response.ContentType = "image/jpeg";
        context.Response.BinaryWrite(bytes);
    }
}

然后在web.config中注册处理程序