'View the file from base64 string instead of varbinary

This is my simple program on downloading file from a varbinary string on click.

Controller:

  public ActionResult Download(string StudentID, string SQNC)
      {
         string query = "exec spToGetVarbinaryString'" + StudentID + "','" + SQNC + "' ";
         string dataStr = GlobalFunction.DataTableToJSON(GlobalFunction.TableFromMSSQL(dbname, query));
         dynamic data = JsonConvert.DeserializeObject(dataStr);
         byte[] file = data[0].ImgVarbinary;

         return File(file, System.Net.Mime.MediaTypeNames.Application.Octet, (string)data[0].FileName);
      }

how I download the File:

<a type="button" href="ControllerName/Download?StudentID=${row.StudentID}&SQNC=${row.SQNC}" class="btn btn-primary btn-sm active" role="button" aria-pressed="true">View File</a>

Now, I want the file instead of being downloaded on click, It will appear on tab or new. I tried the method of converting my Varbinary to Base64 string, but it doesnt read the PDF file for this example below.

From VarBinary to Base64 in SQL

    update a set a.ImgStr=baze64
    from #mytemptable
    cross apply (select ImgVarbinary as '*' for xml path('')) T (baze64)
    where a.ImgVarbinary is not null

Displaying Base64 PDF File (Display doesn't work)

<iframe width="500" height="500"
            src="data:application/pdf;base64,<base64stringhere>"

I found a sample base64 data in this JSFiddle link, I tried it on local and it works.

Image example (left one: my base64 string. Right one: base64 from the js fiddle) enter image description here

How can I do this and why my base64 string isn't working well? Thanks for answering.



Solution 1:[1]

add something like this on click event to read bytes....

public class LoadPdfFileHandler : IHttpHandler
{
    public bool IsResuable => false;
    
    public void ProcessRequest(HttpContext context)
    {
        string id = context.Request.QueryString["id"];
        // TODO: Verify that the user is allowed to view the specified record.
        
        using (var connection = new MySqlConnection("..."))
        using (var command = new MySqlCommand("SELECT Data, ContentType FROM SomeTable WHERE ID = @ID", connection))
        {
            command.Parameters.AddWithValue("@ID", id);
            
            connection.Open();
            using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection))
            {
                if (!reader.Read())
                {
                    context.Response.StatusCode = 404;
                    return;
                }

                string contentType = (string)dr["ContentType"];
                if (string.IsNullOrEmpty(contentType)) contentType = "application/octet-stream";
                context.Response.ContentType = contentType;
                
                byte[] bytes = (byte[])dr["Data"];
                context.Response.BinaryWrite(bytes);
            }
        }
    }
}

Then Write Frame Using this...

myiframe.Attributes["src"] = ResolveUrl("~/loadPdfFile.ashx?id=" + idOfTheRecordToLoad);

You can check Other Reference here image reference

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Peter Csala