DOCX FILE CORRUPTED WHEN RETRIEVED FROM SQL2005

Discussion in 'ASP .Net' started by SUNNY, Aug 7, 2008.

  1. SUNNY

    SUNNY Guest

    Hi, i am uploading a .docx file into sql2005 and later when i retrieve the
    file from the database and i open it, i get a error message "The file is
    corrupted and cannot be open". I am not facing this issue when i store and
    retrieve files of type .doc

    i am storing the file in a column of datatype image.
    Here is the code where i insert the file into database. Am sure the code is
    working. its just not working for .docx

    protected void Button1_Click(object sender, EventArgs e)
    {
    if (FileUpload1.HasFile && FileUpload1.PostedFile != null)
    {
    int ilength =
    Convert.ToInt32(FileUpload1.PostedFile.ContentLength);
    string content = FileUpload1.PostedFile.ContentType;
    string file_name = FileUpload1.FileName;
    Byte[] bytecontent = new Byte[ilength];

    con = new SqlConnection();
    con.ConnectionString = "Server=W2RZYFV603\\SQLEXPRESS;
    Database=master; Trusted_Connection=True";
    con.Open();

    string sql = "insert into
    files(file_data,name,content_type,file_size)VALUES(@file, @name, @content,
    @size)";
    try
    {
    SqlCommand cmd = new SqlCommand(sql, con);
    FileUpload1.PostedFile.InputStream.Read(bytecontent, 0,
    FileUpload1.PostedFile.ContentLength);
    cmd.Parameters.AddWithValue("@file", bytecontent);
    cmd.Parameters.AddWithValue("@name", file_name);
    cmd.Parameters.AddWithValue("@content", content);
    cmd.Parameters.AddWithValue("@size", ilength);
    int i = cmd.ExecuteNonQuery();
    TextBox1.Text = i.ToString();
    }
    catch (Exception ex)
    {
    TextBox1.Text = ex.Message;
    }
    finally
    {
    con.Close();
    }

    }


    Here is the code to retrieve the data from the database.
    protected void Page_Load(object sender, EventArgs e)
    {
    try
    {

    con = new SqlConnection();
    con.ConnectionString = "Server=W2RZYFV603\\SQLEXPRESS;
    Database=master; Trusted_Connection=True";
    con.Open();

    }
    catch (Exception ex)
    {

    }
    string qid = "select max(id) from files";
    int id;
    SqlCommand cmd1 = new SqlCommand(qid, con);
    id = Convert.ToInt32( cmd1.ExecuteScalar());


    string query = "select * from files where id="+ id.ToString();
    //string query = "select * from images where id=4";
    SqlCommand cmd = new SqlCommand(query, con);
    SqlDataReader dr = cmd.ExecuteReader();

    if (dr.Read())
    {
    byte[] imagecontent = (byte[])(dr[1]);
    Response.ContentType = dr[3].ToString();
    Response.AddHeader("Content-Disposition",
    "attachment;filename="+dr[2].ToString());
    Context.Response.BinaryWrite(imagecontent);

    }
    cmd = null;
    dr.Close();
    con.Close();

    }

    Please let me know as to why is this not working for .docx files.

    --
    SUNNY
     
    SUNNY, Aug 7, 2008
    #1
    1. Advertising

  2. On Aug 7, 12:47 pm, SUNNY <SUNNY> wrote:
    > Hi, i am uploading a .docx file into sql2005 and later when i retrieve the
    > file from the database and i open it, i get a error message "The file is
    > corrupted and cannot be open". I am not facing this issue when i store and
    > retrieve files of type .doc
    >
    > i am storing the file in a column of datatype image.
    > Here is the code where i insert the file into database. Am sure the code is
    > working. its just not working for .docx
    >
    > protected void Button1_Click(object sender, EventArgs e)
    >     {
    >         if (FileUpload1.HasFile && FileUpload1.PostedFile != null)
    >         {
    >             int ilength =
    > Convert.ToInt32(FileUpload1.PostedFile.ContentLength);
    >             string content = FileUpload1.PostedFile.ContentType;
    >             string file_name = FileUpload1.FileName;
    >             Byte[] bytecontent = new Byte[ilength];
    >
    >             con = new SqlConnection();
    >             con.ConnectionString = "Server=W2RZYFV603\\SQLEXPRESS;
    > Database=master; Trusted_Connection=True";
    >             con.Open();
    >
    >             string sql = "insert into
    > files(file_data,name,content_type,file_size)VALUES(@file, @name, @content,
    > @size)";
    >             try
    >             {
    >                 SqlCommand cmd = new SqlCommand(sql, con);
    >                 FileUpload1.PostedFile.InputStream.Read(bytecontent, 0,
    > FileUpload1.PostedFile.ContentLength);
    >                 cmd.Parameters.AddWithValue("@file", bytecontent);
    >                 cmd.Parameters.AddWithValue("@name", file_name);
    >                 cmd.Parameters.AddWithValue("@content", content);
    >                 cmd.Parameters.AddWithValue("@size", ilength);
    >                 int i = cmd.ExecuteNonQuery();
    >                 TextBox1.Text = i.ToString();
    >             }
    >             catch (Exception ex)
    >             {
    >                 TextBox1.Text = ex.Message;
    >             }
    >             finally
    >             {
    >                 con.Close();
    >             }
    >
    >         }
    >
    > Here is the code to retrieve the data from the database.
    > protected void Page_Load(object sender, EventArgs e)
    >     {
    >         try
    >         {
    >
    >             con = new SqlConnection();
    >             con.ConnectionString = "Server=W2RZYFV603\\SQLEXPRESS;
    > Database=master; Trusted_Connection=True";
    >             con.Open();
    >
    >         }
    >         catch (Exception ex)
    >         {
    >
    >         }
    >         string qid = "select max(id) from files";
    >         int id;
    >         SqlCommand cmd1 = new SqlCommand(qid, con);
    >         id = Convert.ToInt32( cmd1.ExecuteScalar());
    >
    >         string query = "select * from files where id="+ id.ToString();
    >         //string query = "select * from images where id=4";
    >         SqlCommand cmd = new SqlCommand(query, con);
    >         SqlDataReader dr = cmd.ExecuteReader();
    >
    >         if (dr.Read())
    >         {
    >             byte[] imagecontent = (byte[])(dr[1]);
    >             Response.ContentType = dr[3].ToString();
    >             Response.AddHeader("Content-Disposition",
    > "attachment;filename="+dr[2].ToString());
    >             Context.Response.BinaryWrite(imagecontent);
    >
    >         }
    >         cmd = null;
    >         dr.Close();
    >         con.Close();
    >
    >     }
    >
    > Please let me know as to why is this not working for .docx files.
    >
    > --
    > SUNNY


    Ensure that aspx file has no html layout "<html><head>....."

    Add

    context.Response.ClearHeaders();
    context.Response.ClearContent();
    context.Response.ContentEncoding = System.Text.Encoding.UTF8;
    context.Response.ContentType = "application/vnd.ms-word.document.12";

    and see if it helps
     
    Alexey Smirnov, Aug 7, 2008
    #2
    1. Advertising

  3. What Alexey said.

    As a side comment, why are you storing documents in the master database ?

    Database=master

    The master database is a system database which should only be used for system information.
    Create a proper database and use *that* to store documents in.



    Juan T. Llibre, asp.net MVP
    asp.net faq : http://asp.net.do/faq/
    foros de asp.net, en español : http://asp.net.do/foros/
    ======================================
    "Alexey Smirnov" <> wrote in message
    news:...
    On Aug 7, 12:47 pm, SUNNY <SUNNY> wrote:
    > Hi, i am uploading a .docx file into sql2005 and later when i retrieve the
    > file from the database and i open it, i get a error message "The file is
    > corrupted and cannot be open". I am not facing this issue when i store and
    > retrieve files of type .doc
    >
    > i am storing the file in a column of datatype image.
    > Here is the code where i insert the file into database. Am sure the code is
    > working. its just not working for .docx
    >
    > protected void Button1_Click(object sender, EventArgs e)
    > {
    > if (FileUpload1.HasFile && FileUpload1.PostedFile != null)
    > {
    > int ilength =
    > Convert.ToInt32(FileUpload1.PostedFile.ContentLength);
    > string content = FileUpload1.PostedFile.ContentType;
    > string file_name = FileUpload1.FileName;
    > Byte[] bytecontent = new Byte[ilength];
    >
    > con = new SqlConnection();
    > con.ConnectionString = "Server=W2RZYFV603\\SQLEXPRESS;
    > Database=master; Trusted_Connection=True";
    > con.Open();
    >
    > string sql = "insert into
    > files(file_data,name,content_type,file_size)VALUES(@file, @name, @content,
    > @size)";
    > try
    > {
    > SqlCommand cmd = new SqlCommand(sql, con);
    > FileUpload1.PostedFile.InputStream.Read(bytecontent, 0,
    > FileUpload1.PostedFile.ContentLength);
    > cmd.Parameters.AddWithValue("@file", bytecontent);
    > cmd.Parameters.AddWithValue("@name", file_name);
    > cmd.Parameters.AddWithValue("@content", content);
    > cmd.Parameters.AddWithValue("@size", ilength);
    > int i = cmd.ExecuteNonQuery();
    > TextBox1.Text = i.ToString();
    > }
    > catch (Exception ex)
    > {
    > TextBox1.Text = ex.Message;
    > }
    > finally
    > {
    > con.Close();
    > }
    >
    > }
    >
    > Here is the code to retrieve the data from the database.
    > protected void Page_Load(object sender, EventArgs e)
    > {
    > try
    > {
    >
    > con = new SqlConnection();
    > con.ConnectionString = "Server=W2RZYFV603\\SQLEXPRESS;
    > Database=master; Trusted_Connection=True";
    > con.Open();
    >
    > }
    > catch (Exception ex)
    > {
    >
    > }
    > string qid = "select max(id) from files";
    > int id;
    > SqlCommand cmd1 = new SqlCommand(qid, con);
    > id = Convert.ToInt32( cmd1.ExecuteScalar());
    >
    > string query = "select * from files where id="+ id.ToString();
    > //string query = "select * from images where id=4";
    > SqlCommand cmd = new SqlCommand(query, con);
    > SqlDataReader dr = cmd.ExecuteReader();
    >
    > if (dr.Read())
    > {
    > byte[] imagecontent = (byte[])(dr[1]);
    > Response.ContentType = dr[3].ToString();
    > Response.AddHeader("Content-Disposition",
    > "attachment;filename="+dr[2].ToString());
    > Context.Response.BinaryWrite(imagecontent);
    >
    > }
    > cmd = null;
    > dr.Close();
    > con.Close();
    >
    > }
    >
    > Please let me know as to why is this not working for .docx files.
    >
    > --
    > SUNNY


    Ensure that aspx file has no html layout "<html><head>....."

    Add

    context.Response.ClearHeaders();
    context.Response.ClearContent();
    context.Response.ContentEncoding = System.Text.Encoding.UTF8;
    context.Response.ContentType = "application/vnd.ms-word.document.12";

    and see if it helps
     
    Juan T. Llibre, Aug 7, 2008
    #3
  4. I am not really answering, as much as clarifying the why. Both Alexy and
    Juan have done a good job of aid.

    First, let's look at the corrupted document issue: .DOCX is a zip file, not
    a document, like .DOC. Want proof? Change the extension to .ZIP and open it.
    In side you will find the following directories and files (the # indicates
    there may be more of each of these types of files):

    _Rels
    .rels
    customXml
    _rels
    .rels
    item#.xml
    itemProps#.xml
    docProps
    app.xml
    core.xml
    word
    _rels
    document.xml.rels
    theme
    theme#.xml
    --various docs here
    [Content_Types].xml

    Interesting, eh? This explains why Alexy wants you to remove the headers.
    Note also that you cannot just display the contents of a .docx file in a
    page (as part of the page, not the whole, for example), as it is not a
    document in the traditional sense.

    As for Juan's comment, I cannot state strongly enough why you should not put
    your own data in the master database. If you end up corrupting anything, you
    will likely end up with a database that is unreverable, as many of the
    recovery bits are in the master database. Not wise.

    --
    Gregory A. Beamer
    MVP, MCP: +I, SE, SD, DBA

    Subscribe to my blog
    http://gregorybeamer.spaces.live.com/lists/feed.rss

    or just read it:
    http://gregorybeamer.spaces.live.com/

    ********************************************
    | Think outside the box! |
    ********************************************
    <SUNNY> wrote in message
    news:...
    > Hi, i am uploading a .docx file into sql2005 and later when i retrieve the
    > file from the database and i open it, i get a error message "The file is
    > corrupted and cannot be open". I am not facing this issue when i store and
    > retrieve files of type .doc
    >
    > i am storing the file in a column of datatype image.
    > Here is the code where i insert the file into database. Am sure the code
    > is
    > working. its just not working for .docx
    >
    > protected void Button1_Click(object sender, EventArgs e)
    > {
    > if (FileUpload1.HasFile && FileUpload1.PostedFile != null)
    > {
    > int ilength =
    > Convert.ToInt32(FileUpload1.PostedFile.ContentLength);
    > string content = FileUpload1.PostedFile.ContentType;
    > string file_name = FileUpload1.FileName;
    > Byte[] bytecontent = new Byte[ilength];
    >
    > con = new SqlConnection();
    > con.ConnectionString = "Server=W2RZYFV603\\SQLEXPRESS;
    > Database=master; Trusted_Connection=True";
    > con.Open();
    >
    > string sql = "insert into
    > files(file_data,name,content_type,file_size)VALUES(@file, @name, @content,
    > @size)";
    > try
    > {
    > SqlCommand cmd = new SqlCommand(sql, con);
    > FileUpload1.PostedFile.InputStream.Read(bytecontent, 0,
    > FileUpload1.PostedFile.ContentLength);
    > cmd.Parameters.AddWithValue("@file", bytecontent);
    > cmd.Parameters.AddWithValue("@name", file_name);
    > cmd.Parameters.AddWithValue("@content", content);
    > cmd.Parameters.AddWithValue("@size", ilength);
    > int i = cmd.ExecuteNonQuery();
    > TextBox1.Text = i.ToString();
    > }
    > catch (Exception ex)
    > {
    > TextBox1.Text = ex.Message;
    > }
    > finally
    > {
    > con.Close();
    > }
    >
    > }
    >
    >
    > Here is the code to retrieve the data from the database.
    > protected void Page_Load(object sender, EventArgs e)
    > {
    > try
    > {
    >
    > con = new SqlConnection();
    > con.ConnectionString = "Server=W2RZYFV603\\SQLEXPRESS;
    > Database=master; Trusted_Connection=True";
    > con.Open();
    >
    > }
    > catch (Exception ex)
    > {
    >
    > }
    > string qid = "select max(id) from files";
    > int id;
    > SqlCommand cmd1 = new SqlCommand(qid, con);
    > id = Convert.ToInt32( cmd1.ExecuteScalar());
    >
    >
    > string query = "select * from files where id="+ id.ToString();
    > //string query = "select * from images where id=4";
    > SqlCommand cmd = new SqlCommand(query, con);
    > SqlDataReader dr = cmd.ExecuteReader();
    >
    > if (dr.Read())
    > {
    > byte[] imagecontent = (byte[])(dr[1]);
    > Response.ContentType = dr[3].ToString();
    > Response.AddHeader("Content-Disposition",
    > "attachment;filename="+dr[2].ToString());
    > Context.Response.BinaryWrite(imagecontent);
    >
    > }
    > cmd = null;
    > dr.Close();
    > con.Close();
    >
    > }
    >
    > Please let me know as to why is this not working for .docx files.
    >
    > --
    > SUNNY
     
    Cowboy \(Gregory A. Beamer\), Aug 8, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Roel
    Replies:
    1
    Views:
    4,464
    Mark Rae
    Feb 27, 2007
  2. Replies:
    4
    Views:
    1,506
    Rad [Visual C# MVP]
    Oct 24, 2007
  3. David Thielen
    Replies:
    3
    Views:
    79,002
    David Thielen
    May 27, 2008
  4. Madison

    DOCX MIME Type

    Madison, Aug 5, 2008, in forum: ASP .Net
    Replies:
    2
    Views:
    2,095
    Madison
    Aug 6, 2008
  5. Replies:
    4
    Views:
    386
Loading...

Share This Page