我有一个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应用程序中执行此操作。
有人可以提供建议或提供一些示例源代码吗?所有的帮助将不胜感激。
感谢。
答案 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列)http://yourpath/ShowContent.ashx?ID=111
之类的记录(例如,Id是主键)。DataBind
设置为GridView
第2步:显示
点击GridView中的链接后,它将调用ShowContent.ashx
;在那里处理事件并发生以下事件:
DataTable
中选择该记录
BinaryWrite
如下:
byte[] content = (byte[])dataRow["COL_CONTENT"];
HttpContext.Current.Response.ContentType = dataRow["COL_CONTENT_TYPE"];
HttpContext.Current.Response.BinaryWrite(content);
请注意,您可能需要在会话中添加DataTable /记录,以方便处理记录。