MVC FileContentResult - 适用于DOC而非PDF

时间:2013-07-10 14:29:19

标签: c# asp.net-mvc pdf asp.net-mvc-4

我有以下ActionResult:

[Authorize]
public ActionResult DownloadFile(Guid id)
{
    AdjusterFile file = (from f in db.AdjusterFiles
                         join a in db.Adjusters
                         on f.adjusterID equals a.id
                         join u in db.Users
                         on a.userID equals u.id
                         where u.username == HttpContext.User.Identity.Name
                         && f.id == id
                         select f)
                        .FirstOrDefault();

    return new FileContentResult(file.fileContent.ToArray(), file.fileContentType);
}

它适用于word文档(DOC / DOCX)。但是,每当我尝试下载由同一进程上传的PDF时,它都会在Chrome中显示“无法加载PDF文档”。在IE中,它说,“文件已损坏,无法修复。”

内容类型为“application / pdf。”

如何在MVC中下载PDF?

相关文件上传代码:

using (MemoryStream ms = new MemoryStream())
{
    file.InputStream.CopyTo(ms);
    byte[] array = ms.GetBuffer();

    AdjusterFile newFile = new AdjusterFile();

    newFile.id = Guid.NewGuid();
    newFile.adjusterID = adj.id;
    newFile.type = "eo";
    newFile.fileName = file.FileName;
    newFile.fileContent = array;
    newFile.fileContentType = file.ContentType;

    db.AdjusterFiles.InsertOnSubmit(newFile);
}

1 个答案:

答案 0 :(得分:3)

你不需要MemoryStream,试试这样:

byte[] array = new byte[file.ContentLength];
file.InputStream.Read(array, 0, array.Length);

AdjusterFile newFile = new AdjusterFile();

newFile.id = Guid.NewGuid();
newFile.adjusterID = adj.id;
newFile.type = "eo";
newFile.fileName = file.FileName;
newFile.fileContent = array;
newFile.fileContentType = file.ContentType;

db.AdjusterFiles.InsertOnSubmit(newFile);

您的代码不起作用的原因在于您在MemoryStream上使用的GetBytes方法的MSDN文档中的以下引用:

  

请注意,缓冲区包含可能未使用的已分配字节。   例如,如果字符串“test”被写入MemoryStream   对象,从GetBuffer返回的缓冲区的长度是256,而不是   4,未使用252字节。要仅获取缓冲区中的数据,请使用   ToArray方法;但是,ToArray会在其中创建数据的副本   存储器中。

因此,基本上使用GetBytes方法,您可能无法始终获得已写入Stream的确切字节数。或者你可以使用在你的场景中表现正常的ms.ToArray()方法,但老实说你根本不需要这个MemoryStream。你只是分配一些不必要的空间,你可以直接将上传文件的内容读入一个字节数组,如我的答案所示。

重要说明:我希望您意识到通过在内存中加载整个字节数组,您的网络服务器上的内存消耗可能会快速增长,特别是如果您开始使用大文件。理想的解决方案是将文件存储在文件系统上,或者如果您使用的是MS SQL 2008或更高版本,则可以利用新的FILESTREAM类型。