我正在使用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)
并将其显示在弹出窗口中?
更新: 错误:
答案 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();
}