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 += "\r\n";
            rst += "File Name is:" + fstream.Name + "\r\n";
            rst += "File Lenght is:" + fstream.Length + "\r\n";
            rst += "File Position is:" + fstream.Position  + "\r\n";
        }
        catch (Exception ex)
        {
            //拋出異常信息
            rst = ex.ToString();
        }
        finally
        {
           
            fstream.Close();
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM