显示从数据库上传的文档

时间:2010-10-10 06:47:55

标签: asp.net asp.net-mvc

我有一个MVC 2 Web应用程序。该网站获取贷款的拨款申请。每个应用程序我都可以上传文件。我们将文档上传到数据库的方式如下:

private IEnumerable<byte> GetStreamByteArrayData(Stream stream)
{
   byte[] buffer = new byte[8192];
   int bytesRead = 0;
   while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
   {
      for (int byteIndex = 0; byteIndex < bytesRead; byteIndex++)
      {
         yield return buffer[byteIndex];
      }
   }
}

调用方法如下所示:

Convert.ToBase64String(GetStreamByteArrayData(hpf.InputStream).ToArray());

在显示上传文档的网格中,我有文档名称,mime类型等。我想要做的是在链接中包含文档的名称。单击链接后,将打开文档。我不知道如何在MVC应用程序中执行此操作。

有人可以提供建议或提供一些示例源代码吗?所有的帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:2)

假设您已将每个文档的名称,mime类型和内容存储到数据库中,您可以使用控制器操作,该操作将根据文件的唯一ID提供文件:

public ActionResult Download(int? id)
{
    Document document = _repository.GetDocument(id);
    if (document == null)
    {
        throw new HttpException(404, "Not found");
    }

    // For example document.ContentType = "application/pdf" and 
    // document.Name = "test.pdf"
    return File(document.Contents, document.ContentType, document.Name);
}

Document模型可能如下所示:

public class Document
{
    public int Id { get; set; }
    public byte[] Contents { get; set; }
    public string ContentType { get; set; }
    public string Name { get; set; }
}

最后,您可以在网格中生成指向此操作的链接:

<%: Html.ActionLink("Download", "Download", new { id = "123" })%>

如果您没有存储在数据库中的文档的内容类型和名称,则可以将它们作为操作参数传递:

<%: Html.ActionLink("Download", "Download", 
    new { id = "123", contentType = "application/pdf", name = "test.pdf" }) %>

答案 1 :(得分:0)

制作一个.ashx BinaryWrite 内容的处理程序可能有所帮助。以下是实现这一目标的一种方法:

第1步:加载

  • 将数据加载到DataTable(假设您还有ID列)
  • 在标记中添加link类型的模板项
  • 添加LINK列并通过浏览每条记录或在数据库中保存记录时设置http://yourpath/ShowContent.ashx?ID=111之类的记录(例如,Id是主键)。
  • DataBind设置为GridView

第2步:显示

点击GridView中的链接后,它将调用ShowContent.ashx;在那里处理事件并发生以下事件:

  • 在ShowContent.ashx
  • 中获取活动
  • 从查询字符串中获取ID
  • 使用ID
  • DataTable中选择该记录
  • BinaryWrite如下:

    byte[] content = (byte[])dataRow["COL_CONTENT"]; HttpContext.Current.Response.ContentType = dataRow["COL_CONTENT_TYPE"]; HttpContext.Current.Response.BinaryWrite(content);

请注意,您可能需要在会话中添加DataTable /记录,以方便处理记录。

享受示例A Boilerplate HttpHandler