有问题的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?
答案 0 :(得分:1)
byte[] buffer = new byte[(int)stream.Length];
result.Content = new ByteArrayContent(buffer);
这意味着您有一个正确大小的缓冲区,但是为空。你仍然需要从那个流中填充它。