如何使用c#将二进制数据流式传输到asp.net中的磁盘

时间:2011-09-27 13:25:39

标签: c# asp.net c#-4.0 c#-3.0 stream

如何将二进制数据流式传输到磁盘,用户首先选择位置路径?

到目前为止我所拥有的: 用户点击我的RadGrid,然后用.ToArrar()获取Binary(或byte [])。

我想要一些东西,用户被要求在位置浏览他的电脑并点击接受/取消。接受将启动流来写入文件。

2 个答案:

答案 0 :(得分:4)

基本上你将响应对象设置为oclet类型,推送数据并将其发送出去。客户端浏览器确定如何向用户显示任何所需的对话框。

这是来自内部网络应用程序的下载实用程序页面。完整的代码包括防止用户尝试读取其路径沙箱之外的文件,我在这个例子中省略了该文件。

string document = "... some server document file name ...";
string fullpath = Server.MapPath("your path"+document);

Response.ContentType = ExtentionToContentType(document);
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", document));

byte[] data = System.IO.File.ReadAllBytes(fullpath);
Response.AppendHeader("Content-Length", data.Length.ToString());
Response.BinaryWrite(data);

Response.End();




public string ExtentionToContentType(string file)
{
    switch (System.IO.Path.GetExtension(file).ToLower())
    {
        case ".xls": return "application/vnd.ms-excel";
        case ".doc": case ".docx": return "application/msword";
        case ".ppt": return "application/vnd.ms-powerpoint";
        case ".mdb": return "application/x-msaccess";
        case ".zip": return "application/zip";
        case ".jpg": case ".jpeg":  case ".jpe": return "image/jpeg";
        case ".tiff": return "image/tiff";
        case ".bmp": return "image/bmp";
        case ".png": return "image/png";
        case ".gif": return "image/gif";
        case ".avi": return "video/x-msvideo";
        case ".mpeg": return "video/mpeg";
        case ".rtf": case ".rtx": return "text/richtext";
        case ".txt": return "text/plain";
        case ".pdf": return "application/pdf";
        default: return "application/x-binary";
    }
}

答案 1 :(得分:3)

您不能(不能)将数据直接流式传输到用户的磁盘或在用户的浏览器之外进行交互。在Web应用程序中,您需要做的就是将内容作为标准HTTP响应提供给用户。用户的浏览器将负责其余部分。

关于这个here,有一个非常好的问题/答案。

了解HTTP协议不处理“文件”。它处理请求和响应,每个请求和响应由标题和正文组成。因此,您的Web应用程序将做的是制作一个响应,用户的浏览器可能会将其解释为应该保存为文件的内容。标题将为浏览器提供进行此解释所需的内容,并且正文将为浏览器提供数据。通常它涉及以下步骤:

  1. 删除所有现有输出(不要发送页面标记或类似内容)。
  2. 相应地设置headers。在这种情况下,您需要设置content-lengthcontent-typecontent-disposition之类的内容,以便向浏览器建议将响应保存为文件。
  3. 将文件的字节写入响应流。
  4. 结束回复流。