使用 C# 从 SQL 下载 Blob 文件 asp.net,并且不显示在其相关的查看器应用程序中

本文关键字:显示 应用程序 下载 SQL Blob 文件 net asp 使用 | 更新日期: 2023-09-27 18:35:59

我有一个显示记录的网格视图。网格视图有一个链接按钮,我想用它来下载 blob 文件,该文件保存在网格视图加载其数据的位置相同的表中。该文件下载得很好,但问题是当我打开下载的文件时,它不会在其相关的查看器应用程序中显示任何内容,这意味着如果我下载一个 PDF 文件并在下载后当我在 Adobe Reader 中打开时打开,在 Adobe 阅读器中打开良好 完整的页面显示但空白没有数据显示相同的 JPG, ppt,xlx等,这是我的代码

string[] commandArgument = e.CommandArgument.ToString().Split('|');
            hfResourcesdocumentId.Value = commandArgument[0];
            hfBlobId.Value = commandArgument[1];
            if (e.CommandName == "ViewFile")
            {
                GetBlob(hfBlobId.Value);
             }

protected void GetBlob(string blobId)
    {
        string url = "https://api.truevault.com/v1/vaults/" + vaultId + "/blobs/" + blobId;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.ContentType = "application/json";
        request.Accept = "*/*";
        request.Method = WebRequestMethods.Http.Get;
        request.Headers.Add("Authorization", "Basic " +               Convert.ToBase64String(Encoding.ASCII.GetBytes(apiKey + ":")));
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader streamReader = new StreamReader(response.GetResponseStream());
        string html = streamReader.ReadToEnd();
        response.Close();
        streamReader.Close();
        string file = Convert.ToString(response.Headers["Content-Disposition"]);
        string[] str = file.Split('=');
        string filename = str[1];
        Byte[] bytes = Encoding.UTF8.GetBytes(html);
        Response.Buffer = true;
        Response.Charset = "";
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.ContentType = "application/jpg/png/gif/pdf/ppt/xlx/docx";
        Response.AddHeader("content-disposition", "attachment;filename="+filename);
        Response.BinaryWrite(bytes);
        Response.Flush();
        Response.End();
}

使用 C# 从 SQL 下载 Blob 文件 asp.net,并且不显示在其相关的查看器应用程序中

尝试使用 BinaryReader 而不是 StreamReader。然后取出线

Byte[] bytes = Encoding.UTF8.GetBytes(html);

请求 BLOB 读取时,TrueVault 会发回二进制数据,无需特殊编码。

参见:StreamReader vs BinaryReader?

protected void GetBlob(string blobId)
    {
string url = "https://api.truevault.com/v1/vaults/" + vaultId + "/blobs/" + blobId;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.ContentType = "application/json";
        request.Accept = "*/*";
        request.Method = WebRequestMethods.Http.Get;
        request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(apiKey + ":")));
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        BinaryReader streamReader = new BinaryReader(response.GetResponseStream());
        //string html = Convert.ToString(streamReader.ReadInt32());
        const int bufferSize = 4096;
        byte[] test;
        using (var ms = new MemoryStream())
        {
            byte[] buffer = new byte[bufferSize];
            int count;
            while ((count = streamReader.Read(buffer, 0, buffer.Length)) != 0)
                ms.Write(buffer, 0, count);
            test = ms.ToArray();
        }

        string file = Convert.ToString(response.Headers["Content-Disposition"]);
        string[] str = file.Split('=');
        string filename = str[1];
        //  Byte[] bytes = streamReader.ReadBytes(int.MaxValue);
        //Byte[] bytes = Encoding.UTF8.GetBytes(html);
        Response.Buffer = true;
        Response.Charset = "";
        response.Close();
        streamReader.Close();
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.ContentType = "application/jpg/png/gif/pdf/ppt/xlx/docx";
        Response.AddHeader("content-disposition", "attachment;filename=" + filename);
        Response.BinaryWrite(test);
        Response.Flush();
        Response.End();
}