#region  创建协议
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(WebURL);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)";
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
#endregion#region  写入传送数据

byte[] PostData = Obj.Variant();   //Obj.Variant为读取客户端EXCEL文件,并存入OBJ里的一个BYTE[]里.
request.ContentLength = PostData.Length;   
Stream sw = request.GetRequestStream();   
sw.Write(PostData,0,PostData.Length); //写入数据   
sw.Close();   
#endregion#region 传送数据并取得返回值
WebResponse resp = request.GetResponse();
StreamReader sr = new StreamReader(resp.GetResponseStream(),System.Text.Encoding.Default);
byte[] ServerMsg = System.Text.Encoding.Default.GetBytes(sr.ReadToEnd());
MsgObj.MsgVariant(ServerMsg);----------------------------------
处理程序: protected void Page_Load(object sender, EventArgs e)
    {
        
        Obj = new OBJServer();
        Obj .MsgVariant(Request.BinaryRead(Request.ContentLength));            mOption = Obj .GetMsgByName("OPTION");
            if (mOption.Equals("LOADFILE"))
            {
                string connstring = "server=.;database=ActivexDB;uid=sa;pwd=sa";
                SqlConnection conn = new SqlConnection(connstring);
                conn.Open();
                string Sqlstr = "Select * From OCX_Test where FileName ='First_TestFile'";
                SqlCommand cmd = new SqlCommand(Sqlstr, conn);
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    mFileBody = reader.GetSqlBinary(2).Value;
                    Obj .MsgFileBody(mFileBody);
                    string aa = Server.MapPath(".") + "\\aaaa.xls";
                    Obj .MsgFileSave(aa);  //在这里写入服务器指定目录正常
                }
                reader.Close();
                conn.Close();
            }
            if (mOption.Equals("SAVEFILE"))
            {
                mFileBody = Obj .MsgFileBody();
                string aa = Server.MapPath(".") + "\\aaaa.xls";
                Obj .MsgFileSave(aa);
                string connstring = "server=.;database=ActivexDB;uid=sa;pwd=sa";
                SqlConnection conn = new SqlConnection(connstring);
                conn.Open();
                
                string Sqlstr = "Insert into OCX_Test values(@RecordID,@FileName,@FileBody)";
                SqlCommand cmd = new SqlCommand(Sqlstr,conn);
                
                cmd.Parameters.Add(new SqlParameter("@RecordID", SqlDbType.VarChar,50)); 
cmd.Parameters["@RecordID"].Value =System.DateTime.Now.ToString("yyyyMMdd");                cmd.Parameters.Add(new SqlParameter("@FileName", SqlDbType.VarChar,50)); 
cmd.Parameters["@FileName"].Value ="First_TestFile";                cmd.Parameters.Add(new SqlParameter("@FileBody", SqlDbType.Image)); 
cmd.Parameters["@FileBody"].Value =mFileBody;
                cmd.ExecuteNonQuery();
                conn.Close();
                               
                Obj .MsgFileClear();
            }
        Response.BinaryWrite(Obj .MsgVariant());
    }请问高手:
我在客户端将电子表格文件EXCEL读入对象并发送给服务器处理程序写入数据库.经测试写入正常.在服务器上用DATAREADER读取后写在服务器指定目录下也是正常的.
现在的问题是:经过request.GetResponse()回来的文件数据在客户端写入指定目录文件后,发现无法正常打开此文件,打开后显示乱码.
请问如保解决!

解决方案 »

  1.   

    补充说明:
    1.在WEBCONFIG中未指定编码和指定编码为GB2312情况下均无法正常打开存为本地的文件.
    以上代码中的MsgObj与OBJ为同一类文件,只是应用于不同的工程.
      

  2.   

    给写出的流编个码试试
    Response.Charset = "GB2312"; 
    Response.ContentEncoding = System.Text.Encoding.UTF7; 
    Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fName, Encoding.UTF8).ToString()); 
      

  3.   

    我也怀疑是编码问题,但不知道怎么解决!因为向处理程序传送时是这样. byte[] PostData = Obj.Variant();   //Obj.Variant为读取客户端EXCEL文件,并存入OBJ里的一个BYTE[]里.
    request.ContentLength = PostData.Length;   
    Stream sw = request.GetRequestStream();   
    sw.Write(PostData,0,PostData.Length); //写入数据   
    sw.Close();
    其中Obj.Variant()代码如下: 
                    
    public byte[] Variant()
    {
       this.OBJToStream();
       return this.FStream;
    }
    public  bool OBJToStream()
            {
                int count = 0x40;
                int length = 0;
                int num3 = 0;
                int fFileSize = 0;
                int num5 = 0;
                try
                {
                    num5 = 0;
                    length = this.FMsgText.Length;
                    num3 = this.FError.Length;
                    fFileSize = this.FFileSize;
                    MemoryStream stream = new MemoryStream(((count + length) + num3) + fFileSize);
                    string vString = this.FormatHead(this.FVersion) + this.FormatHead(length.ToString()) + this.FormatHead(num3.ToString()) + this.FormatHead(fFileSize.ToString());
                    stream.Write(this.StringToByte(vString), 0, count);
                    num5 += count;
                    if (length > 0)
                    {
                        stream.Write(this.StringToByte(this.FMsgText), 0, length);
                    }
                    num5 += length;
                    if (num3 > 0)
                    {
                        stream.Write(this.StringToByte(this.FError), 0, num3);
                    }
                    num5 += num3;
                    if (fFileSize > 0)
                    {
                        stream.Write(this.FMsgFile, 0, fFileSize);
                    }
                    num5 += fFileSize;
                    stream.Close();
                    this.FStream = stream.ToArray();
                    return true;
                }
                catch (Exception ex)
                {
                    this.FError = this.FError + ex.ToString();
                    return false;
                }
            }
     private byte[] StringToByte(string vString)
            {
                return Encoding.Default.GetBytes(vString);
            }
    在向处理程序传送数据时用的应该是:Encoding.Default.GetBytes();处理程序用的是:
    Response.BinaryWrite(Obj.Variant());
    其中前台和后台处理函数中的两处
    Variant()是一样的,是不是在接收过程中出现的问题.我指定了编码也不能正常接收!
      

  4.   

    http://blog.csdn.net/xiaojianpitt/archive/2007/12/18/1946744.aspx
      

  5.   

    request.GetResponse()回来之前,先对其进行加密:
    server.Urlencoder
    然后解密处理一下就可以了。