#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.在WEBCONFIG中未指定编码和指定编码为GB2312情况下均无法正常打开存为本地的文件.
以上代码中的MsgObj与OBJ为同一类文件,只是应用于不同的工程.
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF7;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fName, Encoding.UTF8).ToString());
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()是一样的,是不是在接收过程中出现的问题.我指定了编码也不能正常接收!
server.Urlencoder
然后解密处理一下就可以了。