【问题标题】:ASP.NET MVC List of attachments (from binary data)ASP.NET MVC 附件列表(来自二进制数据)
【发布时间】:2018-06-09 10:43:35
【问题描述】:

使用 ASP.NET MVC 和 SQL Server 2016。我有附件作为二进制数据存储在 SQL Server 中。

带有数据的表格如下所示:

 attachment_ID  | attachment_GUID  | attachment_data | attachment_name|
  --------------|------------------|-----------------|----------------|
       211      |   A893C2Z1-4C0   |  0x255044462... |    file1.doc   |
       212      |   A893C2R5-4F0   |  0x255044455... |    file5.pdf   | 

我需要在 html 页面中显示此附件(名称)的列表,作为超链接。因此,如果我单击附件名称,它应该会开始下载过程。

在 ASP.NET MVC 控制器方面需要帮助。

我有直接下载文件的控制器:

using System;
using System.Data.SqlClient;
using System.IO;
using System.Web;
using System.Web.Mvc;
using System.Collections.Generic;

namespace Project.SERVER.Controllers
{
    public class AttachmenttoHTMLController : Controller
    {
        #region View attachments
        [HttpGet]
        public ActionResult Get()
        {
            SqlConnection connection = Project.SERVER.Classes.INT_DataBase.getConnection();
            SqlCommand command = new SqlCommand("SELECT * FROM AllAttachments WHERE document_GUID='F3A2AC32-D98D'", connection);
            command.Dispose();

            SqlDataAdapter sqlDtAdptr = new SqlDataAdapter(command);
            System.Data.DataTable result = new System.Data.DataTable();
            result.Dispose();
            sqlDtAdptr.Fill(result);
            sqlDtAdptr.Dispose();
            connection.Dispose();
            connection.Close();

            if (result.Rows.Count > 0 && !System.Convert.IsDBNull(result.Rows[0]["attachment_data"]))
            {
                byte[] file = (byte[])result.Rows[0]["attachment_data"];
                Response.ContentType = result.Rows[0]["attachment_contentType"].ToString();

                return File(file, Response.ContentType, result.Rows[0]["attachment_fileName"].ToString());
            }
            else return new EmptyResult();
        }
        #endregion
    }
}

我应该在代码中添加什么来实现带有点击下载选项的附件列表控制器?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 hyperlink attachment


    【解决方案1】:

    您必须先将二进制数据以图像格式保存到您的目录项目中。

    使用FileResult

    HTML:

    <div>
        @Html.ActionLink("Download", "Download", "Home");
    </div>
    

    HomeController:

     public FileResult Download()
        {
            String path = HostingEnvironment.ApplicationPhysicalPath + "Image\\Capture.PNG";
            string fname= Path.GetFileName(path);
            byte[] fileBytes = System.IO.File.ReadAllBytes(path);
            string fileName = fname;
            return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
    
        }
    

    假设你的模型中有一个列表

     List<Attachment> lst = new List<Attachment>();
    

    此列表是您数据库中数据的内容,并将字节以图像格式保存到您的项目文件夹中。

    您上面的代码应该在此处保存带有文件名的字节,即使是id.PNG 或任何文件名。添加lst.idlst.filename 用于html。

     public class Attachment
            {
                public int id { get; set; }
                public string filename { get; set; }
            }
    

    您的 HTML 如下所示:

    <table> 
    @{
                if (Models.GetAttachment.lst.Count > 0)
                {
                      for (int m = 0; m < Models.GetAttachment.lst.Count; m++)
                    {
                    <tr>
    
                        <td>
                            @Html.ActionLink("Download", "Download", new { id = Models.GetAttachment.lst.Coun[m].id })
                        </td>
                    </tr>
                    }
                }
    
    
      }
    </table>
    

    带有id的HomeController:

     public FileResult Download(int?id)
            {
                String path = HostingEnvironment.ApplicationPhysicalPath + "Image\\Capture.PNG";
                string fname= Path.GetFileName(path);
                byte[] fileBytes = System.IO.File.ReadAllBytes(path);
                string fileName = fname;
                return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
    
            }
    

    id 的目的是在每次用户点击时在项目目录中找到文件。

    【讨论】:

    • 假设您的Capture.PNG 在您的项目目录下的Image 文件夹内。
    • 如果您的数据库中有很多文件,那么您可以使用循环将其添加到您的 html 中,以便为每个文件创建一个链接。
    • 我花了一段时间才弄清楚并重现它。此解决方案有效,感谢您的帮助!
    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多