转载: 将图片从PDA端上传到Web服务器的方法

概述:本文将教你如何利用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("测试");
   }

  }

   感觉是不是很有趣呢?

posted @ 2007-09-03 14:24  寒天飞雪  阅读(2179)  评论(6编辑  收藏  举报