2011-10-28 53 views
1

我在我的SQL数据库中上传BLOB文件。我创建动态超链接重定向到我的download.aspx.cs,以下载文件。检索BLOB文件

当我点击它,我获取的唯一事情是这样的事情:

*����JFIF,,��ExifMM*� ���(1�2;%+>P?`���7��i��%��NIKON CORPORATIONNIKON D3-��'-��'Adobe Photoshop CS4 Macintosh2010:11:19 21:53:25 9�I�@d!ddGddd+�K�r� (��Ƃ�Έ"�'@�0221�֐����� ���� � ��,��42��42��42�0100����Р�d����J����R�b���� � ��Z @(2010:11:19 20:44:392010:11:19 20:44:39 � ASCII R030100��(�HH����JFIFHH��Adobe_CM��Adobed����* 

这是本downloading.aspx我的Page_Load代码:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string filename = Request["file"].ToString(); 
    var conString = ConfigurationManager.ConnectionStrings["LocalSqlServer"]; 
    string strConnString = conString.ConnectionString; 
    SqlConnection dbConnection = new SqlConnection(strConnString); 
    dynamic queryString = ("SELECT Data FROM Files WHERE Name = '" + filename + "'"); 
    SqlCommand theCommand = new SqlCommand(queryString, dbConnection); 
    dbConnection.Open(); 
    SqlDataReader reader = theCommand.ExecuteReader(); 

    if (reader.Read() && reader != null) 
    { 
     Byte[] bytes; 
     bytes = Encoding.UTF8.GetBytes(String.Empty); 
     bytes = (Byte[])reader["Data"]; 
     Response.BinaryWrite(bytes); 

     reader.Close(); 
    } 

    dbConnection.Close(); 
} 

有人能告诉我为什么?谢谢。

回答

5

您需要设置内容类型和内容部署到您的响应头添加为这样:

Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
Response.AddHeader("content-disposition", "attachment; filename=whatever.xlsx"); 
Response.BinaryWrite(yourbytes); 

注意:内容类型必须是特定的文件你流的类型。如果一个图像,它必须是像“image/jpg”;等等。如果它是一个图像,可能要将文件名部分的扩展名设置为“file.jpg”。 以上代码只是一个例子

+0

如果我还想下载.cs,visual studio文件,pdf?我应该怎么做 ? 否则,你的代码是完美的工作!非常感谢 ! – Kiwimoisi

+0

@Emged您需要知道您要传输给用户的文件类型,并适当设置内容处置和内容类型。我的建议是,您还将文件类型存储在数据库中,因此您不必尝试“检测”分析字节。 – Icarus

+0

@Emged只需使用适当的MIME类型为您的文件。 http://www.iana.org/assignments/media-types/image/index.html – jbtule

3

您需要将Content-Type,Content-Length和Content-Disposition标头发送到浏览器,以便它能够理解二进制数据。

+0

正如伊卡洛斯所说。谢谢你的回答,它帮助了我! – Kiwimoisi