Отображение varbinary (max) из базы данных с использованием расположения контента - 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);
    }

Я также могу успешно прочитать мои данные обратно. Код для которого выглядит следующим образом:

    [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();
}

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

1 Ответ

0 голосов
/ 17 февраля 2020

Я думаю, что вам не хватает части ...

    string strFileName = "FileName";//Here you have to set the File Name...

    if (strFileName.Substring(strFileName.LastIndexOf('.') + 1).ToLower() == "pdf")
    {
        Response.ContentType = "application/PDF";
    }
    else if (strFileName.Substring(strFileName.LastIndexOf('.') + 1).ToLower() == "doc")
    {
        Response.ContentType = "application/msword";
    }
    else if (strFileName.Substring(strFileName.LastIndexOf('.') + 1).ToLower() == "docx")
    {
        Response.ContentType = "application/msword";
    }
    else if (strFileName.Substring(strFileName.LastIndexOf('.') + 1).ToLower() == "xls")
    {
        Response.ContentType = "application/vnd.ms-excel";
    }
    else if (strFileName.Substring(strFileName.LastIndexOf('.') + 1).ToLower() == "xlsx")
    {
        Response.ContentType = "application/vnd.ms-excel";
    }
    else if (strFileName.Substring(strFileName.LastIndexOf('.') + 1).ToLower() == "ppt")
    {
        Response.ContentType = "application/vnd.ms-powerpoint";
    }
    else if (strFileName.Substring(strFileName.IndexOf('.') + 1).ToLower() == "txt")
    {
        Response.ContentType = "text/plain";
    }
    else
    {
        Response.ContentType = "text/plain";
    }

    System.IO.FileInfo file = new System.IO.FileInfo(strFileName);

    Response.Clear();
    Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
    Response.AddHeader("Content-Length", file.Length.ToString());

    Response.WriteFile(file.FullName);
    Response.End();

После редактирования, если ваши данные в байтах, попробуйте в последний раз:

public void byteArrayToImage(byte[] bytes)
    {
        if (byteArray != null)
        {
            MemoryStream ms = new MemoryStream(bytes);
            System.Drawing.Image img = System.Drawing.Image.FromStream(ms, false,  false);

            img.Save(Server.MapPath("Photo/image.jpg"), System.Drawing.Imaging.ImageFormat.Jpeg);//Set Your image Location...
            ms.Close();                
        }
    }
...