41

我正在使用以下代码流式传输 MemoryStream 对象中的 pptx,但是当我打开它时,我在 PowerPoint 中收到修复消息,将 MemoryStream 写入响应对象的正确方法是什么?

HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.AppendHeader("Content-Type", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}.pptx;", getLegalFileName(CurrentPresentation.Presentation_NM)));                
response.BinaryWrite(masterPresentation.ToArray());
response.End();
4

8 回答 8

72

我遇到了同样的问题,唯一有效的解决方案是:

Response.Clear();
Response.ContentType = "Application/msword";
Response.AddHeader("Content-Disposition", "attachment; filename=myfile.docx");
Response.BinaryWrite(myMemoryStream.ToArray());
// myMemoryStream.WriteTo(Response.OutputStream); //works too
Response.Flush();
Response.Close();
Response.End();
于 2013-04-07T23:58:39.747 回答
16

例如,假设您可以获得 Stream、FileStream 或 MemoryStream,您可以这样做:

Stream file = [Some Code that Gets you a stream];
var filename = [The name of the file you want to user to download/see];

if (file != null && file.CanRead)
{
    context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
    context.Response.ContentType = "application/octet-stream";
    context.Response.ClearContent();
    file.CopyTo(context.Response.OutputStream);
}

那是我的一些工作代码的复制和粘贴,因此内容类型可能不是您要查找的内容,但是将流写入响应是最后一行的技巧。

于 2014-02-13T19:41:06.847 回答
7

与其在 MemoryStream 中创建 PowerPoint 演示文稿,不如将其直接写入Response.OutputStream. 这样您就不需要在服务器上浪费任何内存,因为组件将直接将输出流式传输到网络套接字流。因此,无需将 MemoryStream 传递给生成此演示文稿的函数,只需传递 Response.OutputStream。

于 2012-12-08T16:18:05.360 回答
4

试试这个

Response.Clear();
Response.AppendHeader("Content-Type", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}.pptx;", getLegalFileName(CurrentPresentation.Presentation_NM)));
Response.Flush();                
Response.BinaryWrite(masterPresentation.ToArray());
Response.End();
于 2012-12-08T16:24:20.947 回答
4

首先我们需要写入我们的内存流,然后在内存流方法“WriteTo”的帮助下,我们可以写入页面的响应,如下面的代码所示。

   MemoryStream filecontent = null;
   filecontent =//CommonUtility.ExportToPdf(inputXMLtoXSLT);(This will be your MemeoryStream Content)
   Response.ContentType = "image/pdf";
   string headerValue = string.Format("attachment; filename={0}", formName.ToUpper() + ".pdf");
   Response.AppendHeader("Content-Disposition", headerValue);

   filecontent.WriteTo(Response.OutputStream);

   Response.End();

FormName 是给定的文件名,此代码将通过调用 PopUp 使生成的 PDF 文件可下载。

于 2014-02-20T09:35:20.550 回答
1

我尝试了 end、close、flush 和 System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest() 的所有变体,但没有一个起作用。

然后我将内容长度添加到标题中: Response.AddHeader("Content-Length", asset.File_Size.ToString());

在此示例中,资产是一个具有称为 File_Size 的 Int32 的类

这对我有用,没有别的。

于 2014-07-02T19:11:04.787 回答
1

我的问题是我的流在下载之前没有设置为原点。

Response.Clear();
Response.ContentType = "Application/msword";
Response.AddHeader("Content-Disposition", "attachment; filename=myfile.docx");

//ADDED THIS LINE
myMemoryStream.Seek(0,SeekOrigin.Begin);

myMemoryStream.WriteTo(Response.OutputStream); 
Response.Flush();
Response.Close();
于 2018-09-17T15:15:34.557 回答
0

我遇到过同样的问题。试试这个:复制到 MemoryStream -> 删除文件 -> 下载。

string absolutePath = "~/your path";
try {
    //copy to MemoryStream
    MemoryStream ms = new MemoryStream();
    using (FileStream fs = File.OpenRead(Server.MapPath(absolutePath))) 
    { 
        fs.CopyTo(ms); 
    }

    //Delete file
    if(File.Exists(Server.MapPath(absolutePath)))
       File.Delete(Server.MapPath(absolutePath))

    //Download file
    Response.Clear()
    Response.ContentType = "image/jpg";
    Response.AddHeader("Content-Disposition", "attachment;filename=\"" + absolutePath + "\"");
    Response.BinaryWrite(ms.ToArray())
}
catch {}

Response.End();
于 2014-09-24T08:54:24.947 回答