【问题标题】:file transfer from Server to Local从服务器到本地的文件传输
【发布时间】:2015-06-02 09:21:12
【问题描述】:

更新:

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

这是我的文件传输代码:

        //---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 并禁用右键单击表单。

【问题讨论】:

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


    【解决方案1】:

    这样试试

    这里的mediaUploader 是我的文件夹名称,其中有我所有的.pdf 文件。所以现在下载pdf文件的代码如下所示。

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

    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();
         }
     }
    

    【讨论】:

    • 谢谢,但为什么它对我不起作用?只是同样的例外
    • @SarahN:我添加了Response.End() 而不是HttpContext.Current.ApplicationInstance.CompleteRequest();,并设置了硬编码'Response.ContentType',正如你提到的那样,它只是pdf。如果我的答案对你有用,那么标记为答案
    • 我只是不知道你的答案和我的有什么区别!它们完全一样。我已经尝试过 HttpContext.Current.ApplicationInstance.CompleteRequest();Response.End()
    • @SarahN: 检查你的ViewState["MediaFile"].ToString() 值,你得到了什么?
    • ViewState 没有错误
    【解决方案2】:

    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();
    }
    

    顺便说一句:内容类型与文件扩展名并不真正相关。意味着您不应该使用文件扩展名创建内容类型。

    【讨论】:

    • 谢谢回复,想知道​​下载地址在哪里?因为当我跟踪它时,它只是通过而没有请求保存任何位置。
    • 下载位置将由用户通过浏览器文件保存对话框或浏览器默认设置指定。这取决于浏览器及其设置。
    • 那么它会遇到同样的问题。它不适合我。我正在考虑可能在我的浏览器或视觉工作室中设置一些东西
    • 您能尝试调试 C# 代码吗?如果您没有收到异常,则问题出在客户端(浏览器)您还应该尝试其他浏览器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2023-03-17
    • 2017-06-21
    • 2017-05-02
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多