更新:
我使用.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并禁用右键单击表单。
答案 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