概述:本文将教你如何利用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("测试"); } } |
感觉是不是很有趣呢?