在我的一个asp.net Web应用程序中,我需要隐藏正在向用户提供的pdf文件的位置.
因此,我正在编写一种方法,从CMS系统上的位置检索其二进制内容,然后将字节数组刷新到Web用户.
不幸的是,我在下载流时遇到错误:“无法打开文件,因为它已被删除”(或类似于在adobe reader中打开文件时).
问题1:我做错了什么?
问题2:我可以使用这种方法下载大文件吗?
private void StreamFile(IItem documentItem) { //CMS vendor specific API BinaryContent itemBinaryContent = documentItem.getBinaryContent(); //Plain old .NET Stream fileStream = itemBinaryContent.getContentStream(); var len = itemBinaryContent.getContentLength(); SendStream(fileStream,len,itemBinaryContent.getContentType()); } private void SendStream(Stream stream,int contentLen,string contentType) { Response.ClearContent(); Response.ContentType = contentType; Response.AppendHeader("content-disposition",string.Format("inline;filename=file.pdf")); Response.AppendHeader("content-length",contentLen.ToString()); var bytes = new byte[contentLen]; stream.Read(bytes,contentLen); stream.Close(); Response.BinaryWrite(bytes); Response.Flush(); }
解决方法
这是我使用的方法.这会传回一个附件,因此IE会生成一个打开/保存对话框.我也碰巧知道文件不会大于1M,所以我相信有更简洁的方法可以做到这一点.
我对PDF有类似的问题,我意识到我绝对不得不使用二进制流和ReadBytes.任何有字符串的东西搞砸了.
Stream stream = GetStream(); // Assuming you have a method that does this. BinaryReader reader = new BinaryReader(stream); HttpResponse response = HttpContext.Current.Response; response.ContentType = "application/pdf"; response.addheader("Content-disposition","attachment; filename=file.pdf"); response.ClearContent(); response.OutputStream.Write(reader.ReadBytes(1000000),1000000); // End the response to prevent further work by the page processor. response.End();
原文地址:https://www.jb51.cc/aspnet/246625.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。