代码改变世界

关于把外网的系统中的信息同步到我们网站大师的系统中去

2019-03-26 10:58  wolfer_3  阅读(125)  评论(0)    收藏  举报

背景:最近在做奉贤专题的时候,有这样一个需求,客户需要把第三方的类似OA系统中产生的数据,需要跟我们的网站大师系统进行数据对接。

遇到的问题:

①数据需要时时同步。

②他们系统是内网,附件的问题不能直接引用他们的数据库。

思路:第一个问题解决办法是,我们这边采取跟第三方软件公司进行沟通,我们这边提供一个接口,然他们在产生了一条信息就调用我们的接口一次。达到信息数据时时同步。

     第二个问题,由于需要把附件进行传过来,有点问题。

下面是解决问题2的步骤和过程:

我刚开始走了点弯路,以为需要把这个附件以二进制的流的形式进行传输过来,直接添加到数据库中,最后发现这样的二进制字符串流在后台很难在转换成二进制流,网上找了很多办法,还是没找到。最后决定采取另一种方式来解决。

我们去get请求,第三方服务器的附件,把它的附件下载到本地,然后以二进制流的形式存到数据库中。

代码如下:需要提供一个请求的url地址和附件的保存到一个相对的唯一guid的文件里面。以下有个注意点:就是

Stream fs = new FileStream 第三个参数最好写上 FileAccess.ReadWrite 。这个作用就是可对文件有读写的权限
        public string CopyFileByUrl(string url,string AttachID)
        {
            string name = System.Web.HttpUtility.UrlDecode(url.Substring(url.LastIndexOf('/') + 1));//获取名字,对url进行解码
            string fileFolder = System.Configuration.ConfigurationManager.AppSettings["EpointFramePath"] + DateTime.Now.ToString("yyyy-MM-dd") + "\\" + AttachID  ;    //存放本地的路径
            string filePath = Path.Combine(fileFolder, name);//存放地址就是本地的upload下的同名的文件
            if (!Directory.Exists(fileFolder))
                Directory.CreateDirectory(fileFolder);

            string returnPath = GetSimplePath(filePath);//需要返回的路径
            if (File.Exists(filePath))
            {//如果已经存在,那么就不需要拷贝了,如果没有,那么就进行拷贝
                return returnPath;
            }
            HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
            request.Method = "GET";
            request.ProtocolVersion = new Version(1, 1);
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            if (response.StatusCode == HttpStatusCode.NotFound)
            {
                return string.Empty;//找不到则直接返回null
            }
            // 转换为byte类型
            System.IO.Stream stream = response.GetResponseStream();


            //创建本地文件写入流
            Stream fs = new FileStream(filePath, FileMode.Create,FileAccess.ReadWrite);//这里的FileAccess.ReadWrite最好是加上,不然在后面读取该附件的时候,就会产生一个该附件被占用的错误
            byte[] bArr = new byte[1024];
            int size = stream.Read(bArr, 0, (int)bArr.Length);
            while (size > 0)
            {
                fs.Write(bArr, 0, size);
                size = stream.Read(bArr, 0, (int)bArr.Length);
            }
            fs.Close();
            stream.Close();


            return filePath;
        }


        public string GetSimplePath(string path)
        {
            return path;
        }

  再接着下面就是一个把硬盘上具体文件的路径,把文件转换成二进制流的方法:如下:

     public byte[] File2Bytes(string path)
        {
            if (!System.IO.File.Exists(path))
            {
                return new byte[0];
            }

            FileInfo fi = new FileInfo(path);
            byte[] buff = new byte[fi.Length];

            FileStream fs = fi.OpenRead();
            fs.Read(buff, 0, Convert.ToInt32(fs.Length));
            fs.Close();

            return buff;
        }

接着就可以对这个附件进行数据的操作了。

         #region 添加附件表信息
             if (!String.IsNullOrWhiteSpace(UrlList) && !string.IsNullOrWhiteSpace(FileNameList)) { string[] arrURL = UrlList.Split(';'); string[] arrFileName = FileNameList.Split(';'); if (arrURL.Length != arrFileName.Length) { //error } else { //String Files , DateTime StartDate for (int m = 0; m < arrURL.Length-1; m++) { string infoid = InfoID; //byte[] fileContent = System.Text.Encoding.Default.GetBytes(arrURL[m]); string contentType = ""; string fileProperty = "Attach"; string length = arrURL.Length.ToString(); DateTime uploadDate = info_Date; bool IsHeadPic = false; string StorageType = "DB"; string AttachID = Guid.NewGuid().ToString(); string FileName = arrFileName[m]; //string PostURL = "http://xxgk.shhk.gov.cn/hkxxgk/Upfiles/FileAttach/70e187e6-d5e7-4434-8ff2-0ed767add36a/2019%E5%B9%B4%E4%B8%8A%E6%B5%B7%E5%B8%82%E7%AC%AC%E4%BA%94%E4%B8%AD%E5%AD%A6%E5%8D%95%E4%BD%8D%E9%A2%84%E7%AE%97%E4%BF%A1%E6%81%AF%E5%85%AC%E5%BC%80%E8%A1%A8.pdf"; string PostURL = arrURL[m]; string FilePath = Info.CopyFileByUrl(PostURL, AttachID);//附件的路径 byte[] byArray = File2Bytes(FilePath); this.Info.WebDB_Info_Upfiles_Insert(this.Connectionstring, AttachID, infoid, FileName, byArray, contentType, fileProperty, length, uploadDate, IsHeadPic, StorageType ); } } } #endregion

然后就可以顺利的解决这个问题了。