解决方法:
SL 端。
string FIleName="中文文件下载.rar"
if (file == null) return;
var aa = System.Windows.Browser.HttpUtility.UrlEncode(FIleName);
var bb = Uri.EscapeUriString(FIleName);
string urlstr = new Uri(Application.Current.Host.Source, "../Handlers/downloadAppFilesData.ashx?filename=" + bb ;
HtmlWindow htmlPage = HtmlPage.Window;
if (HtmlPage.IsPopupWindowAllowed)
{
HtmlPage.PopupWindow(new Uri(urlstr), "_blank", new HtmlPopupWindowOptions() { Left = 0, Top = 0, Toolbar = false, Status = false, Height = 20, Width = 20, Menubar = false });
}
else
{
HtmlPage.PopupWindow(new Uri(urlstr), "_blank", new HtmlPopupWindowOptions() { Left = 0, Top = 0, Toolbar = false, Status = false, Height = 20, Width = 20, Menubar = false });
}
ASHX 端。
//注意。用了两个变量。 filenameforurl和 filename . 必须采用不同的转换方法。
public void ProcessRequest(HttpContext context)
{
try
{
string filename = context.Request["filename"];
filename = System.Web.HttpContext.Current.Server.UrlDecode(filename);
string filenameforurl= context.Server.HtmlDecode(context.Request["filename"]);
string fileFolder = context.Request["filefolder"];
if (filename == null || filename == null || filename == "" || fileFolder == "") return;
string fileNamesPath = Path.Combine(context.Server.MapPath(".."), fileFolder, filename);
if (fileNamesPath.Length == 0)
{
throw new Exception("");
}
context.Response.Expires = 0;
context.Response.Buffer = true;
context.Response.Clear();
// context.Response.ContentType = "text/html";
context.Response.ContentEncoding = Encoding.UTF8;
context.Response.ContentType = "pplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + filenameforurl);
if (File.Exists(fileNamesPath))
{
FileInfo fileinfo = new FileInfo(fileNamesPath);
FileStream Openfile = fileinfo.OpenRead();
long byteLength = Openfile.Length;
byte[] streambyte = new byte[byteLength];
Openfile.Read(streambyte, 0, (int)(byteLength));
context.Response.OutputStream.Write(streambyte, 0, (int)(byteLength));
Openfile.Close();
}
else
{
context.Response.Write("下载文件已不存在");
}
}
catch
{
context.Response.Write("下载文件失败");
}
finally
{
context.Response.End();
}
}