Открытие столбца varbinary во всплывающем окне с использованием contenttype - PullRequest
0 голосов
/ 17 февраля 2020

Я делаю загрузчик файлов, используя теги html. У меня есть идентификатор, имя и данные в моей таблице. Данные хранят содержимое файла в двоичном формате в столбце с типом данных varbinary(max). Я могу успешно загрузить файл, и я также могу прочитать байтовый массив обратно.

Код для загрузки с кодом позади:

    protected void Upload(object sender, EventArgs e)
    {
        string filename = Path.GetFileName(FileUpload1.PostedFile.FileName);
        string contentType = FileUpload1.PostedFile.ContentType;

        using (Stream fs = FileUpload1.PostedFile.InputStream)
        {
            using (BinaryReader br = new BinaryReader(fs))
            {
                byte[] bytes = br.ReadBytes((Int32)fs.Length);
                string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
                using (SqlConnection con = new SqlConnection(constr))
                {
                    string query = "insert into FileUploader2 values (@Name, @ContentType, @Data)";
                    using (SqlCommand cmd = new SqlCommand(query))
                    {
                        cmd.Connection = con;
                        cmd.Parameters.AddWithValue("@Name", filename);
                        cmd.Parameters.AddWithValue("@ContentType", contentType);
                        cmd.Parameters.AddWithValue("@Data", bytes);
                        con.Open();
                        cmd.ExecuteNonQuery();
                        con.Close();
                        Context.Response.Write("Uploaded Successfully!");
                    }
                }
            }
        }

        Response.Redirect(Request.Url.AbsoluteUri);
    }

Я также создаю сетку, которая показывает мне список файлов вместе со значком, который при нажатии будет отображать мне файл после прочтения байта массив. У меня есть функция JS на том клике, к которому я обращаюсь через WebMethod с выделенным кодом. Ниже приведен мой код, когда пользователь нажимает на значок представления:

    [System.Web.Services.WebMethod]
    public static void ShowDocument()
    {
        string filename = string.Empty;
        string contentType = string.Empty;
        byte[] bytes = null;
        string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            con.Open();

            using (SqlCommand com = new SqlCommand("SELECT * FROM FileUploader2", con))
            {
                using (SqlDataReader reader = com.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        filename = (string)reader["Name"];
                        contentType = (string)reader["ContentType"];
                        bytes = (byte[])reader["Data"];
                    }
                }
            }
        }

        System.Web.HttpContext.Current.Response.ContentType = contentType;
        System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; 
        filename=" + filename);
        System.Web.HttpContext.Current.Response.OutputStream.Write(bytes, 0, bytes.Length);
        System.Web.HttpContext.Current.Response.Flush();
    }

Этот код также работает нормально и правильно читает все столбцы. Теперь, после прочтения, я хочу просмотреть файл также во всплывающем окне. Как я могу это сделать? Я думаю, что мне нужно взять contenttype, чтобы он знал, какой тип файла я хочу открыть, а затем использовать байты для этого. Но я понятия не имею, как этого добиться.

...