zoukankan      html  css  js  c++  java
  • WebService传输文件的几个知识点

    前几天用WebService写了传数据的接口。

    要求是 传XML数据 并用Schema(即xsd文件)验证 并且伴有图片传输。

    做这个项目首先要理解

    WebService 传数据本身是通过XML格式传的,所传的数据最后都被包装在一个XML里了

    基于这点,需要准备以下几个知识点。

    1. XML Schema 的编写 (命名空间 ,数据类型,定义属性类型,定义多个相同标签方法)

    2.用Xsd验证XML的程序代码

    3.将文件以什么形式放到xml里

    4.如何从xml里取出文件并保存到本地

    ps:我用正则声称XML的时候用1做后向引用不成功,原因是。C#根js一样都用的是类似$1这样引用的,坑爹的教程啊。

    好了。我们把几个知识点罗列一下就OK啦。

    1.列出XML于XML Schema的样本

          a.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <!---->
    <myxml  xmlns="http://www.aaa.com">
      <!---->

      <Type>01</Type>
      <!--varchar(50), 附件类型 
    -->

      <Name></Name>
      <!--varchar(200),附件名称
    -->
      <Time></eaTime>
      <!--varchar(50),时间
    -->
     

    <file fileName=""></file>
     
      <file fileName=""></file>
      <!--varbinary 上传文件
    -->
    </myxml >

      a.xsd

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="EmrAcce"
        targetNamespace="http://www.cnstroke.com"
        elementFormDefault="qualified"
        xmlns="http://www.cnstroke.com"
        xmlns:mstns="http://www.cnstroke.com"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
    >
      <xs:element name="myxml ">
        <xs:complexType>
          <xs:sequence>

            <xs:element name="Type" type="TypeT"/>

            <xs:element name="Name" type="xs:string"/>
            <xs:element name="Time" type="xs:dateTime"/>
          
            
            <xs:element name="file"  maxOccurs="unbounded" >
              <xs:complexType>
                <xs:attribute name="fileName" type="xs:string"></xs:attribute>
              </xs:complexType>
            </xs:element>
            
          </xs:sequence>
          
        </xs:complexType>
      </xs:element>

      <xs:simpleType name="TypeT">
        <xs:restriction base="xs:string">
          <xs:pattern value="01|02|03|09|10|11|99"/>
        </xs:restriction>
      </xs:simpleType>

      <xs:simpleType name="ClassT">
        <xs:restriction base="xs:string">
          <xs:pattern value="01|02|03|04|99"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType name="fileNameT">
        <xs:restriction base="xs:string">
          <xs:pattern value=".+[.]{1,1}.+"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:schema>

     2..用Xsd验证XML的程序代码

       private void ValidationEventCallBack(Object sender, ValidationEventArgs e)
            {
                if (e.Severity == XmlSeverityType.Warning)//区分是警告还是错误
                {
                    xmlErr += "<br/>验证成功!警告:" + e.Message;
                }
                else
                {
                    xmlErr += "<br/>Err:" + e.Message;
                }
            }
            private void CheckXmlValidate(string strRequestXML)
            {
                string ErrString = string.Empty;
                StringReader sRead = null;
                XmlReader xmlRead = null;
                XmlSchemaSet schemaSet;

                try
                {
                    schemaSet = new XmlSchemaSet();

                    sRead = new StringReader(strRequestXML);

                    schemaSet.Add(null, AppDomain.CurrentDomain.BaseDirectory + "/XML/" + xsdFile + ".xsd");

                    XmlReaderSettings settings = new XmlReaderSettings();
                    settings.ValidationEventHandler += new ValidationEventHandler(this.ValidationEventCallBack);
                    settings.ValidationType = ValidationType.Schema;
                    settings.Schemas = schemaSet;

                    xmlRead = XmlReader.Create(sRead, settings);
                   // xmlRead = XmlReader.Create(xmlUrl, settings);//此处是通过传路径获取xml
                    while (xmlRead.Read())
                    {

                    }

                    if (ErrString.ToString() == String.Empty)
                    {

                        xmlErr += "验证成功!";
                    }
                    else
                    {
                        xmlErr += "验证失败!原因可能是:" + ErrString;

                    }
                }
                catch (XmlException exec)
                {
                    xmlErr += exec.Message;
                }
                finally
                {

                    if (xmlRead != null)
                    {

                        xmlRead.Close();
                    }
                }
            }

    3.将文件以什么形式放到xml里

     /// <param name="filePath">相对路径</param>
            /// <param name="fileName"></param>
            protected void setXmlNodeFile(XmlDocument xmldoc, XmlElement xmlelem, string filePath,string fileName)
            {
                XmlElement file = xmldoc.CreateElement("", "file", "");
              
                file.SetAttribute("fileName",fileName);
                string data = null;
                int readByte = 0;        //
                int bytesToRead = 900000;
                FileStream fs = new FileStream(Server.MapPath(filePath), FileMode.Open);
                bytesToRead = (int)fs.Length;
                BinaryReader br = new BinaryReader(fs);

                byte[] base64buffer = new byte[bytesToRead];
                do
                {
                    readByte = br.Read(base64buffer, 0, bytesToRead);      //将数据读入字节数组
                    // xmlTxtWt.WriteBase64(base64buffer, 0, readByte);       //将数组中二进制值编码为Base64并写出到XML文件

                } while (bytesToRead <= readByte);
                MemoryStream mem = new MemoryStream(base64buffer);
                data = Convert.ToBase64String(mem.ToArray());
                file.InnerText = data;
                xmlelem.AppendChild(file);
           
            }

    4.如何从xml里取出文件并保存到本地

      XmlDocument xmldoc = new XmlDocument();
                xmldoc.Load(Server.MapPath("~/XML/ceshi1.xml"));
                string PicByte = xmldoc.GetElementsByTagName("file")[0].InnerText;
                byte[] b = Convert.FromBase64String(PicByte);
               // System.IO.MemoryStream sm = new MemoryStream();  
               //  sm.Write(b, 0, b.Length);
                using( FileStream fs = new FileStream(Server.MapPath("~/XML/yts.jpg"), FileMode.Create))
                {
               fs.Write(b,0,b.Length);
                }
               return Content("ok");

    这样就好了其他细节 就不用说了

    -----------------------------------------以下内容摘自网络

    1.通过byte传输

    把文件转换

      public static byte[] ConvertToBinary(string Path)
     

           {
                FileStream stream = new FileInfo(Path).OpenRead();
                byte[] buffer = new byte[stream.Length];
                Console.WriteLine("The lenght of the file is "+buffer.Length);
                stream.Read(buffer, 0, Convert.ToInt32(stream.Length));
                return buffer;
            }

    static byte[] buffer;

    buffer = ConvertToBinary(path);

    webService

      

    FileStream fstream = new FileStream(filePath + fileName, FileMode.Append);
            try
            {
                //MemoryStream m = new MemoryStream(fileBt);
                //m.WriteTo(fstream);
                fstream.Write(fileBt, 0, fileBt.Length);   //二进制转换成文件
              
                fstream.Close();
                //rst += " ";
                rst += "File Name is:" + fstream.Name + " ";
                rst += "File Lenght is:" + fstream.Length + " ";
                rst += "File Position is:" + fstream.Position  + " ";
            }
            catch (Exception ex)
            {
                //抛出异常信息
                rst = ex.ToString();
            }
            finally
            {
               
                fstream.Close();
            }

  • 相关阅读:
    python's eithteenth day for me 面向对象——命名空间
    python's seventeenth day for me 面向对象
    python's sixteenth day for me 员工信息表
    python's fifteenth day for me 递归函数
    python's fourteenth day for me 内置函数
    用装饰器做一个登陆功能(进阶):
    装饰器 为多个函数加上认证功能(账号密码来源于文件),要求只要登陆成功一次,后续函数则无需登陆。
    python's thirteenth day for me 迭代器 生成器
    php函数
    php日期格式
  • 原文地址:https://www.cnblogs.com/dygfc/p/3664780.html
Copyright © 2011-2022 走看看