这是下载文件的逻辑。
它会自动下载文件,无论是.jpg、.pdf、.zip还是其他什么,我希望它只有在图像文件(jpg、png 等)时才在新选项卡中打开,然后其他所有内容都会提示下载。
我觉得在解决这个问题时我错过了一些东西。
public void DownloadArchivedFiles(ArchiveType type, Object id, String fileName)
{
Response.ContentType = "application/zip";
Response.AddHeader("content-disposition", "filename=" + fileName);
String path = Server.MapPath(String.Format("~/{0}Files/{1}", type, id));
var fmFiles = new string[0];
var files=new string[0];
if(type==ArchiveType.Issue)
{
fmFiles = _files.GetIssueFiles(new Guid(id.ToString())).Select(x => Server.MapPath("~" + x.FilePath)).ToArray();
}else if(type==ArchiveType.Task)
{
fmFiles = _files.GetTaskFiles(int.Parse(id.ToString())).Select(x => Server.MapPath("~" + x.FilePath)).ToArray();
}
if (!System.IO.Directory.Exists(path) && !fmFiles.Any()) return;
//String[] files = System.IO.Directory.GetFiles(Server.MapPath(String.Format("~/{0}Files/{1}", type, id)));
try
{
files = System.IO.Directory.GetFiles(Server.MapPath(String.Format("~/{0}Files/{1}", type, id)));
}
catch (Exception)
{
;
}
using (ZipFile zip = new ZipFile())
{
zip.AddFiles(files, "/");
if(fmFiles.Any())
zip.AddFiles(fmFiles,"/");
zip.Save(Response.OutputStream);
}
HttpContext.Response.End();
}
无法通过在响应中提供标头来打开新选项卡。 太迟了。 生成响应时,浏览器已尝试将响应流放入同一选项卡,并且旧文档可能已卸载。
相反,您需要更改发送请求的方式。 具体而言,图像的链接必须将_target="blank"
作为属性。 这告诉浏览器打开一个新选项卡(或窗口,具体取决于用户的浏览器设置),然后在那里请求图像。 此时,您无需对响应标头执行任何特殊操作。
您应避免target="blank"
可下载文件(例如 PDF)。 它在某些浏览器上可以正常工作,但在其他浏览器上,您最终会得到难看的僵尸选项卡。