从服务器下载.pptx文件到客户端 - ASP.NET

时间:2017-04-27 11:55:32

标签: asp.net powerpoint

有问题的PowerPoint文件大小为18mb。单击按钮后,将调用控制器中的以下GET方法:

    [Route("api/download/GetFile")]
    [HttpGet]

    public HttpResponseMessage GetFile()
    {
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);

        try
        {
            var localFilePath = HttpRuntime.AppDomainAppPath + "content\\files\\file.pptx";
            var stream = File.OpenRead(localFilePath);
            stream.Position = 0;
            stream.Flush();

            if (!System.IO.File.Exists(localFilePath))
            {
                result = Request.CreateResponse(HttpStatusCode.Gone);
            }
            else
            {
                byte[] buffer = new byte[(int)stream.Length];

                result.Content = new ByteArrayContent(buffer);

                result.Content.Headers.Add("Content-Type", "application/pptx");
                result.Content.Headers.Add("x-filename", "file.pptx");
                result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                result.Content.Headers.Add("Content-Length", stream.Length.ToString());
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.presentationml.presentation");

            }

            return result;
        }
        catch (Exception e)
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }

文件通过浏览器正常下载到下载文件夹,其大小与在服务器上调用下载的原始文件完全相同。但是,当试图打开它时:

  

" PowerPoint在file.pptx中找到了不可读的内容。你想要_____吗   恢复此演示文稿的内容?如果你相信的来源   在此演示文稿中,单击是。"

点击"是"只会使PowerPoint加载一段时间然后返回错误消息"访问此文件时出现问题"。

我怀疑问题出在这个" x-filename"但是将此值更改为其他内容最终会使浏览器下载一个只有几KB的bin文件。我也尝试将ContentType和MediaTypeHeaderValue更改为很多不同的东西(application / pptx,application / x-mspowerpoint等等),但这一切都没有。此外,我还试图像这样分配内容:

        result.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));

也不起作用。

任何帮助表示感谢。

编辑:

正如Hans Kesting指出的那样,我似乎并没有正确地复制字节。但是,在尝试打开powerpoint文件时,执行以下操作仍会产生相同的错误消息,但文件现在的大小为33mb:

                MemoryStream memoryStream = new MemoryStream();
                stream.CopyTo(memoryStream);

                byte[] buffer = memoryStream.ToArray(); // stream.CopyTo// new byte[(int)stream.Length];

                result.Content = new ByteArrayContent(buffer);

为什么我以错误的方式复制字节,下载的文件与原始文件具有相同的字节数,但现在它有33 MB?

1 个答案:

答案 0 :(得分:1)

          byte[] buffer = new byte[(int)stream.Length];
          result.Content = new ByteArrayContent(buffer);

这意味着您有一个正确大小的缓冲区,但是为空。你仍然需要从那个流中填充它。