概述:本文将教你如何利用C#和Pocket PC技术将智能终端上的图片上传到Web服务器。示例代码是我做试验的核心部分,终端设备采用的是装有Pocket PC 2003的PDA,PDA端程序采用C#编写,Web服务器程序也是用C#写的ASP.NET程序。没有提供完成的工程压缩包下载,基于的原因首先是因为我觉得只要拥有核心代码就可以解决问题,其次,说真的,我还不知道怎样往博客上放这些压缩包。如果各位网友在调试过程中出现什么问题,再和我联系。好,尽快进入正文。
这种问题在传统的B/S开发体系中,本应该是个非常容易解决的问题。但是我们现在面临的是M/S,即:Mobile/Server,这个领域在技术上有很多局限性,或者相比之下不那么方便。我曾经尝试往Web页面上放入File Field控件,但是这个页面在Pocket PC Internet Exproer中并不会显示。我们当然也可以通过Socket,建立一个TCP通道,再传送过去,这样简直再容易不过了。但是有时候我们的主要系统是Web系统,往这个服务器上放一个Windows应用程序,或者服务,真的是件非常别扭的事情,而且因为要多开辟一个侦听端口会增加安全方面的风险,有时候可能还得受到代理服务器的限制等等。
我所采用的方案是通过Post方式将图片提交给某个ASP.NET页面,由这个页面的程序来获取图片数据。
首先在智能终端窗体应用项目中的FUploadFile窗体中,添加一个textBox_fileName输入框和一个button_selectFile按钮,用于选择图片文件,以及一个button_submit按钮用于提交图片。
button_selectFile按钮的事件函数代码如下:
private void button_selectFile_Click(object sender, System.EventArgs e)
{
DialogResult res = openFileDialog1.ShowDialog();
if(res.Equals(DialogResult.OK))
{
textBox_fileName.Text = openFileDialog1.FileName;
}
}
|
button_submit按钮的事件函数代码如下:
private void button_submit_Click(object sender, System.EventArgs e)
{
if( ! textBox_fileName.Text.Trim().Equals(""))
{
string loadFile = textBox_fileName.Text.Trim();
string urlStr = @"http://192.168.1.15/UploadFileFromPdaToWebSite/UploadFile.aspx?name=文件的名称";
UploadFileBinary(loadFile,urlStr);
}
else
{
string alStr = "您还没有选择文件";
MessageBox.Show(alStr,"系统提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation,MessageBoxDefaultButton.Button1);
}
}
|
上面代码中调用了一个UploadFileBinary私有方法,它的代码如下:
public void UploadFileBinary(string localFile, string uploadUrl)
{
try
{
FileStream rdr = new FileStream(localFile, FileMode.Open);
byte[] inData = new byte[4096];
int totbytes = 0;
MemoryStream postData = new MemoryStream();
int bytesRead = rdr.Read(inData, 0, inData.Length);
while (bytesRead > 0)
{
postData.Write(inData, 0, bytesRead);
bytesRead = rdr.Read(inData, 0, inData.Length);
totbytes += bytesRead;
}
rdr.Close();
postData.Position = 0;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uploadUrl);
req.Method = "POST";
req.ContentLength = (long)postData.Length;
using (Stream s = req.GetRequestStream())
{
s.Write(postData.ToArray(), 0, (int)postData.Length);
postData.Close();
}
WebResponse resp = req.GetResponse();
resp.Close();
}
catch (Exception ex)
{
string exContent;
exContent = ex.ToString();
MessageBox.Show(exContent);
}
}
|
PDA端的程序设计大概就是如此了,下面我们再来看Web服务器端的程序是如何接收图片的吧!
建立一个ASP.NET程序文件:UploadFile.aspx,在Page_Load事件函数中写下如下代码就可以了:
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
byte[] theData = null;
String ls_name
if (Request.ServerVariables["REQUEST_METHOD"].ToString().ToUpper() == "POST")
{
theData = Request.BinaryRead(Request.ContentLength);
//获取文件名称
ls_name = Request.QueryString("name");
//string picName = DateTime.Now.Ticks.ToString() + ".gif";
//string picName = DateTime.Now.Ticks.ToString() + ".jpg";
FileStream stm = new FileStream(Server.MapPath(ls_name),System.IO.FileMode.CreateNew);
stm.Write(theData, 0, (int)theData.Length);
stm.Close();
}
else
{
Response.write("测试");
}
}
|
感觉是不是很有趣呢?