如何从SQL Server数据库中检索文件?

时间:2009-10-23 17:24:40

标签: sql sql-server information-retrieval

我已成功将文件上传到我的SQL Server数据库。我可以将信息带回GridView。我无法弄清楚如何创建实际打开文件的超链接。

4 个答案:

答案 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)

如果您的文件存储在数据库中,则可能将其存储为博客或字节数组。在超链接单击事件上,您需要将字节数组传递到流中,并使用流编写器来创建该文件。然后执行文件。