文件从服务器传输到本地

时间:2015-05-25 00:15:33

标签: c# asp.net httpresponse file-transfer httpcontext

更新:

我使用.net 4.0进行编码,我想找到一个带有特定路径的pdf文件(ViewState [“MediaFile”])并将其传输到本地系统。

这是我的文件传输代码:

        //---server path ---
        String sFilePath = Server.MapPath("~/" + ViewState["MediaFile"].ToString());
        String sFileName= System.IO.Path.GetFileName(sFilePath);
        String RelativePath =sFilePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty);
        HttpContext.Current.Response.ContentType = "APPLICATION/OCTET-STREAM";
        String Header = "Attachment; Filename=" + sFileName;
        HttpContext.Current.Response.AppendHeader("Content-Disposition", Header);
        System.IO.FileInfo Dfile = new System.IO.FileInfo(RelativePath);
        HttpContext.Current.Response.End();

但是在跑步之后,出现了错误:

无法评估表达式,因为代码已优化或本机框架位于调用堆栈之上。

当我把 HttpContext.Current.ApplicationInstance.CompleteRequest()而不是 HttpContext.Current.Response.End()时,它不是错误但是没有!我的意思是没有显示下载面板。

注意:我在另一个页面上测试此代码,它可以工作。只是想说因为我的表单中的任何代码都可以吗?我使用Ajax UpdatePanel并禁用右键单击表单。

2 个答案:

答案 0 :(得分:0)

Response.End()应该足够了:) 您还应将Content-Length标头设置为浏览器文件的大小,以计算下载进度。

比使用Response.TransmitFile更好的是使用该PDF的文件流将该文件串流出并将该块以块的形式写入Response.OutputStream

var BlockSize = 4 * 1024 * 1024;
var buffer = new byte[BlockSize];
int bytesRead;
var outStream = Response.OutputStream;
while ((bytesRead = fileStream.Read(buffer, 0, BlockSize)) > 0)
{
    outStream.Write(buffer, 0, bytesRead);
    outStream.Flush();
}

BTW:内容类型与文件扩展名没有关系。表示您不应使用文件扩展名创建内容类型。

答案 1 :(得分:0)

试试这个

这里的.pdf是我的文件夹名称,其中包含我的所有ViewState["MediaFile"] ="mediaUploader/Visual2.pdf"; if (ViewState["MediaFile"] != null) { String sFile = Server.MapPath("~/" + ViewState["MediaFile"].ToString()); FileInfo file = new FileInfo(sFile); if (file.Exists) { Response.ContentType = "application/pdf"; Response.AppendHeader("Content-Disposition", "attachment; filename=" + file.Name); Response.TransmitFile(Server.MapPath("~/" + ViewState["MediaFile"].ToString())); Response.End(); } } 个文件。所以现在下载pdf文件的代码如下所示。

首先检查ViewState是否为null,然后检查文件是否存在,然后我们下载文件

emp