我已成功将文件上传到我的SQL Server数据库。我可以将信息带回GridView。我无法弄清楚如何创建实际打开文件的超链接。
答案 0 :(得分:2)
您需要创建一个处理图片的URL,并将DB内容返回到响应流中。正如在SQL Saturday #26发生的那样,我有一个演示文稿,显示了这一点。您可以从链接中进行doalo和我的幻灯片,进入演示2,在lotsOfPictures解决方案中,您将找到Picture.aspx.cs,它完全符合您的要求:
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand(
@"SELECT picture
FROM resized_pictures
WHERE picture_id = @id
AND picture_size = @size;", conn);
cmd.Parameters.AddWithValue("@id", pictureId);
cmd.Parameters.AddWithValue("@size", size);
using (SqlDataReader rdr = cmd.ExecuteReader(
CommandBehavior.SequentialAccess))
{
if (rdr.Read())
{
Response.ContentType = "image/jpeg";
byte[] bytes = new byte[1024];
long offSet = 0;
int countRead = (int) rdr.GetBytes(
0, offSet, bytes, 0, 1024);
while (countRead > 0)
{
Response.OutputStream.Write(bytes, 0, countRead);
offSet += countRead;
countRead = (int)rdr.GetBytes(
0, offSet, bytes, 0, 1024);
}
}
}
}
这个难题的重要部分是传递给SqlCommand阅读器的SequentialAccess标志,它将返回一个真正的流,因此页面在返回之前不会将整个图像加载到内存中。对于高性能服务器,您应该使用异步操作,如Asynchronous Pages in ASP.NET 2.0中所述。
答案 1 :(得分:0)
我自己没试过,但如何将数据流式传输到本地文件系统上的临时文件中,然后提供该临时文件的链接?
答案 2 :(得分:0)
通常,您会使用服务器端代码发送相应的headers,然后只回显内容。
从PHP手册:
// We'll be outputting a PDF
header('Content-type: application/pdf');
// It will be called downloaded.pdf
header('Content-Disposition: attachment; filename="downloaded.pdf"');
// The PDF source is in original.pdf
readfile('original.pdf');
答案 3 :(得分:0)
如果您的文件存储在数据库中,则可能将其存储为博客或字节数组。在超链接单击事件上,您需要将字节数组传递到流中,并使用流编写器来创建该文件。然后执行文件。