从数据库中读取varbinary列并将其显示在弹出窗口中

时间:2020-02-16 12:10:05

标签: c# asp.net

我正在使用html标签编写文件上传器。

我的Data列将二进制格式的数据存储在数据类型varbinary(max)的列中。

我能够成功上传文件。

我还在制作一个网格,该网格显示我所有文件的列表,并在其旁边带有一个图标,单击该图标将打开一个弹出窗口并查看我的文件。

我有一个onclick函数

onclick = showDocument('" + dr["Id"] + "'); 
我正在通过page方法在后面的代码中访问的

。这是我在aspx中的JS函数:

function showDocument(_id) {
     PageMethods.ShowDocument();
}

此函数指向我在函数后面的代码,如下所示。

[System.Web.Services.WebMethod]
public static void ShowDocument()
{
    byte[] bytes;
    string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;

    using (SqlConnection con = new SqlConnection(constr))
    {
        con.Open();

        using (SqlCommand com = new SqlCommand("SELECT Data FROM FileUploader2", con))
        {
             using (SqlDataReader reader = com.ExecuteReader())
             {
                 if (reader.Read())
                 {
                     bytes = (byte[])reader["Data"];
                 }
             }
         }
     }
}

上面的ShowDocument函数实际上不起作用。它只返回我文件的字节,然后什么也没有。有人可以编辑上面的代码吗?这样它就可以从我的数据库中读取varbinary(max)并将其显示在弹出窗口中?

更新: 错误:

error

1 个答案:

答案 0 :(得分:2)

您不能直接从Ajax调用下载,可以尝试从ShowDocument和WebMethod属性中删除static关键字,并使用HTML中的简单链接。

关于下载,您将文件内容存储在字节数组中,并将内容类型和原始文件名存储在数据库中,因此似乎您具备了将响应发送回浏览器所需的所有要素,例如这个:

public void ShowDocument()
{
    string filename = string.Empty;
    string contentType = string.Empty;
    byte[] bytes = null;

    using (SqlConnection con = new SqlConnection(constr))
    {
        con.Open();

        using (SqlCommand com = new SqlCommand("SELECT * FROM FileUploader2", con))
        {
             using (SqlDataReader reader = com.ExecuteReader())
             {
                 if (reader.Read())
                 {
                     filename = (string)reader["Name"];
                     contentType = (string)reader["ContentType"];
                     bytes = (byte[])reader["Data"];
                 }
             }
         }
     }
    Response.ContentType = contentType; 
    Response.AddHeader("Content-Disposition", "attachment; filename=" + filename); 
    Response.OutputStream.Write(bytes, 0, bytes.Length); 
    Response.Flush(); 
}