【问题标题】:Retrieve files from SQL Server, display them with extension's icon and read them从 SQL Server 检索文件,用扩展的图标显示它们并阅读它们
【发布时间】:2019-01-31 22:49:36
【问题描述】:

我已将表中的文件保存为二进制文件。我需要检索它们,显示带有扩展名图标的文件名并打开它。

我使用 SQL Server 查询来检索与频道相关的所有文件并将它们存储在数据表中。之后,我循环访问每个文件以获取其名称、扩展名和数据。现在我需要显示文件。

public void getAttachedFiles(int id)
{
        string fileName;
        string fileExtension;
        string fileData;

        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = Utilities.ConnectionString;

        conn.Open();

        string query = "select cf.Name, cf.ContentType, cf.Data from [dbo].[Channels_Files] cf where cf.ChannelId = "+ id;

        DataTable listFiles = new DataTable();
        SqlDataAdapter adp = new SqlDataAdapter(query, conn);

        adp.Fill(listFiles);

        foreach (DataRow dataRow in listFiles.Rows)
        {
            fileName = dataRow.ItemArray[0].ToString();
            fileExtension = dataRow.ItemArray[1].ToString();
            fileData = dataRow.ItemArray[2].ToString();
            displayFile(fileName,fileExtension,fileData);
        }
}

displayFile 函数必须将文件从二进制转换并显示出来。我需要知道如何转换每个文件并显示文件列表,其中每个文件都将显示其扩展名图标。

我查过这篇文章,但不清楚。

Retrieve files from SQL Server database

【问题讨论】:

  • SQL Injection alert - 您应该将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入 - 查看Little Bobby Tables
  • 文件是什么类型的,你打算如何显示它们?
  • 感谢您的回复。文件类型主要是pdf、图片和autocad文件。 @尼克
  • 显示图像很容易。如果您仅面向 Windows 10,则可以通过 Edge 和 WebView 显示 PDF。但是,对于 Autocad 文件,您需要寻找一些允许集成的查看器。绝非易事。至于图标,如果你只有这些,只需将它们的图标提取到 ICO 文件中并显示出来。如果你想实现 Explorer 所做的,我可以告诉你,这是一项艰巨的努力@

标签: c# sql-server file-io


【解决方案1】:

我解决了我的问题如下:

我创建了一个 listView 并向其中添加了一个 imageList。

我将扩展程序的图标添加到 imageList。

然后我检索了文件二进制数据,所选频道的名称和扩展名。

   public void getAttachedFiles(int id)
        {
            imageList.Items.Clear();
            docList.Items.Clear();
            string fileName;
            string fileExtension;
            byte[] fileData;
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = Utilities.ConnectionString;
            conn.Open();
            string query = "select cf.Data,cf.Name,cf.ContentType from[dbo].[Channels_Files] cf where cf.ChannelId =" + id;
            DataTable listFiles = new DataTable();
            SqlDataAdapter adp = new SqlDataAdapter(query, conn);
            adp.Fill(listFiles);
            foreach (DataRow dataRow in listFiles.Rows)
            {

                fileData = (byte[])dataRow.ItemArray[0];
                fileName = dataRow.ItemArray[1].ToString();
                fileExtension = dataRow.ItemArray[2].ToString();
                displayFile(fileName,fileExtension, fileData);
            }
        }

我将项目添加到 listView 我将文件的 id 保存为 Item 键以及 imageView 的 fileName 和扩展图像索引。

docList.Items.Add(Convert.ToBase64String(fileData), fn, 3);

然后选择合适的图标。

 private void displayFile(string fn,string fe, byte[] fileData)
    {

        switch(fe.ToString())
        {
            case ".pdf":
                docList.Items.Add(Convert.ToBase64String(fileData), fn,0);
                break;
            case ".doc":
            case ".docx":
                docList.Items.Add(Convert.ToBase64String(fileData), fn, 2);
                break;
            case ".xls":
            case ".xlsx":
                docList.Items.Add(Convert.ToBase64String(fileData), fn, 1);
                break;
            case ".dwg":
                docList.Items.Add(Convert.ToBase64String(fileData), fn, 3);
                break;
            case ".bmp":
            case ".jpg":
            case ".jpeg":
                imageList.Items.Add(Convert.ToBase64String(fileData), fn, 5);
                break;
            default:
                docList.Items.Add(Convert.ToBase64String(fileData), fn, 4);
                break;
        }
    }

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 2016-07-08
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多