C# 通过系统服务进程备份文件和数据库到百度网盘

要百度上传代码的太多了 还要发邮箱 嫌麻烦 这里开一个贴 放上百度云传类

想开源上传软件 只是卖出去了好多份  再有是通过系统服务进程上传的 不了解的人用起来麻烦些 其次是软件有注册机制关联的地方有点多 删起来也麻烦 等哪天放大假的时候处理一下再说吧 主要是改一改界面什么的 不然卖出去的看到了找我退款怎么办

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using Newtonsoft.Json.Linq;

namespace KosxClassLibrary
{
    public static class Key
    {
        public static string API_Key = "这里是你的KEY";
        public static string Secret_Key = "这里是你的secret";
        public static string scope = "basic,netdisk";//申请api需要的权限 

        /// <summary>
        /// 云端文件跟目录
        /// </summary>
        public static string baidu_dir = "/KosxLims/文件备份/";//注意根目录替换成自己申请的目录 我这个api是企业版的 在实际测试中网盘任意目录可读写 但是有的API只能读写申请的目录 慎重
        /// <summary>
        /// 云端备份文件目录
        /// </summary>
        public static string baidu_history = "/KosxLims/_历史文件/";
    }
    //这个就是记录上传文件进度的一个配置 进程重启后可以续传 
    public static class Cfg
    {
        private static FileStream fsRead;
        private static string fsPath;
        private static bool encryption = false;
        private static bool IsOpen = false;
        public static JObject Json;
        /// <summary>  
        /// 打开上传文件配置信息 
        /// </summary>
        /// <param name="path">打开配置文件路径</param>
        /// <param name="check">检查配置文件是否存在 不存在则生成空白配置文件</param>
        /// <returns>返回配置信息</returns>  
        public static void Open(string path)
        {
            path = path + ".up.cfg";
            fsPath = path;
            if (!File.Exists(path))
            {
                using (fsRead = new FileStream(@fsPath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    string inittext = "{\"status\":0}";
                    if (encryption == true)
                    {
                        inittext = Des.Encrypt(inittext);
                    }
                    byte[] myByte = Encoding.UTF8.GetBytes(inittext);
                    fsRead.Seek(0, SeekOrigin.Begin);
                    fsRead.Write(myByte, 0, myByte.Length);
                    fsRead.Close();
                    File.SetAttributes(fsPath, FileAttributes.Hidden);
                }
            }
            fsRead = new FileStream(fsPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
            int fsLen = (int)fsRead.Length;
            byte[] heByte = new byte[fsLen];
            int r = fsRead.Read(heByte, 0, heByte.Length);
            string JsonData = Encoding.UTF8.GetString(heByte);
            if (encryption == true)
            {
                JsonData = Des.Decrypt(JsonData);
            }
            IsOpen = true;
            Json = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(JsonData);
        }
        public static void Open2(string path)
        {
            path = path + ".up.cfg";
            fsPath = path;
            if (!File.Exists(path))
            {
                File.WriteAllText(path, "{\"status\": 0}");
                File.SetAttributes(path, FileAttributes.Hidden);
            }
            using (fsRead = new FileStream(fsPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
            {
                int fsLen = (int)fsRead.Length;
                byte[] heByte = new byte[fsLen];
                int r = fsRead.Read(heByte, 0, heByte.Length);
                string JsonData = Encoding.UTF8.GetString(heByte);
                if (encryption == true)
                {
                    JsonData = Des.Decrypt(JsonData);
                }
                IsOpen = true;
                Json = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(JsonData);
            }
        }
        /// <summary>  
        /// 重新保存配置文件
        /// </summary>
        public static void Save()
        {
            if (IsOpen == false)
            {
                Open(fsPath);
            }
            string output = Newtonsoft.Json.JsonConvert.SerializeObject(Json, Newtonsoft.Json.Formatting.Indented);
            if (encryption == true)
            {
                output = Des.Encrypt(output);
            }
            byte[] myByte = Encoding.UTF8.GetBytes(output);
            fsRead.Seek(0, SeekOrigin.Begin);
            fsRead.Write(myByte, 0, myByte.Length);
        }
        /// <summary>  
        /// 关闭打开的配置文件
        /// </summary>
        public static void Colse()
        {
            try
            {
                fsRead.Dispose();
                fsRead.Close();
                Json = new JObject();
                IsOpen = false;
            }
            catch
            {
                LogQueue.Log("关闭配置发生错误:"+ fsPath);
            }

        }
        public static void DelFile()
        {
            for(int t = 0; t < 5; t++)
            {
                Colse();
                File.Delete(fsPath);
                System.Threading.Thread.Sleep(100);
            }
        }
    }
    //上传过程 以及部分使用的api
    public static class Baidu
    {
        /// <summary>  
        /// 读取token
        /// </summary>  
        /// <returns>返回Access_token</returns>  
        public static string token()
        {
            string des_token = Json.Get("token", "").ToString();
            string token = Des.Decrypt(des_token);
            return token;
        }
        /// <summary>  
        /// 获取code网址
        /// </summary>  
        /// <returns>返回CODE网址</returns>  
        public static string code(int qrcode = 0)
        {
            string url = "https://openapi.baidu.com/oauth/2.0/authorize?";
            url += "response_type=code";
            url += "&client_id=" + Key.API_Key;
            url += "&redirect_uri=oob";
            //可填basic或mobile
            url += "&scope=" + Key.scope;
            //url += "&state=STATE";
            //登录和授权页面的展现样式 page
            /*
            page:全屏形式的授权页面(默认),适用于web应用。
            popup:弹框形式的授权页面,适用于桌面软件应用和web应用。
            dialog:浮层形式的授权页面,只能用于站内web应用。
            mobile:IPhone / Android等智能移动终端上用的授权页面,适用于IPhone / Android等智能移动终端上的应用。
            pad:IPad / Android等平板上使用的授权页面,适用于IPad / Android等智能移动终端上的应用。
            tv:电视等超大显示屏使用的授权页面。
            */
            url += "&display=page";
            url += "&qrcode="+ qrcode;
            //如传递“force_login=1”,则加载登录页时强制用户输入用户名和口令,不会从cookie中读取百度用户的登陆状态。
            url += "&force_login=1";
            //如传递“confirm_login=1”且百度用户已处于登陆状态,会提示是否使用已当前登陆用户对应用授权。
            url += "&confirm_login=0";
            //如传递“login_type=sms”,授权页面会默认使用短信动态密码注册登陆方式。
            //url += "&login_type=sms";
            //网盘扫码透传字段
            url += "&qrext_appid=kosxlims";
            //二维码登录方式的背景图片url链接,需要encode

            //url += "&bgurl="+ System.Web.HttpUtility.HtmlEncode("http://10.url.cn/qqcourse_logo_ng/ajNVdqHZLLDIZTYPzq8nS0xWbfibnjcHxItq8G5pVpcbhGS0vMw3LmCueZFcp8c3YIx9PJZPGNF8/600");
            //自定义二维码图片的宽度 高度
            //url += "&qrcodeW=120";
            //url += "&qrcodeH=120";
            return url;
        }
        public static string code2(int page = 1)
        {
            string url = "https://openapi.baidu.com/oauth/2.0/authorize?";
            url += "response_type=code";
            url += "&client_id=" + Key.API_Key;
            url += "&redirect_uri=oob";
            //可填basic或mobile
            url += "&scope=" + Key.scope;
            //url += "&state=STATE";
            //登录和授权页面的展现样式 page
            /*
            page:全屏形式的授权页面(默认),适用于web应用。
            popup:弹框形式的授权页面,适用于桌面软件应用和web应用。
            dialog:浮层形式的授权页面,只能用于站内web应用。
            mobile:IPhone / Android等智能移动终端上用的授权页面,适用于IPhone / Android等智能移动终端上的应用。
            pad:IPad / Android等平板上使用的授权页面,适用于IPad / Android等智能移动终端上的应用。
            tv:电视等超大显示屏使用的授权页面。
            */
            if (page == 2)
            {
                url += "&display=tv";
            }
            else if (page == 3)
            {
                url += "&display=dialog";
            }
            else if (page == 4)
            {
                url += "&display=mobile";
            }
            else if (page == 5)
            {
                url += "&display=pad";
            }
            else if (page == 6)
            {
                url += "&display=popup";
            }
            else {
                url += "&display=page";
            }
            
            url += "&qrcode=1" ;
            //如传递“force_login=1”,则加载登录页时强制用户输入用户名和口令,不会从cookie中读取百度用户的登陆状态。
            url += "&force_login=1";
            //如传递“confirm_login=1”且百度用户已处于登陆状态,会提示是否使用已当前登陆用户对应用授权。
            url += "&confirm_login=0";
            //如传递“login_type=sms”,授权页面会默认使用短信动态密码注册登陆方式。
            //url += "&login_type=sms";
            //网盘扫码透传字段
            url += "&qrext_appid=kosxlims";
            //二维码登录方式的背景图片url链接,需要encode

            //url += "&bgurl="+ System.Web.HttpUtility.HtmlEncode("http://10.url.cn/qqcourse_logo_ng/ajNVdqHZLLDIZTYPzq8nS0xWbfibnjcHxItq8G5pVpcbhGS0vMw3LmCueZFcp8c3YIx9PJZPGNF8/600");
            //自定义二维码图片的宽度 高度
            //url += "&qrcodeW=120";
            //url += "&qrcodeH=120";
            return url;
        }
        /// <summary>  
        /// 通过code置换AccessToken
        /// </summary>  
        /// <returns>返回token</returns>  
        public static string get_access_token(string code)
        {
            string url = "https://openapi.baidu.com/oauth/2.0/token?";
            url += "grant_type=authorization_code";
            url += "&code=" + code;
            url += "&client_id=" + Key.API_Key;
            url += "&client_secret=" + Key.Secret_Key;
            url += "&redirect_uri=oob";
            string result = Http.Get(url);

            Console.WriteLine(url);

            JObject json = Json.ToJson(result);
            if (result.IndexOf("\"error\":", StringComparison.OrdinalIgnoreCase) <= 0)
            {
                Json.Set("refresh", Des.Encrypt(json["refresh_token"].ToString()));
                Json.Set("token", Des.Encrypt(json["access_token"].ToString()));
                int t = int.Parse(json["expires_in"].ToString())-86400;
                Json.Set("session_expires_in_time", DateTime.Now.AddSeconds(t).ToString());
            }
            return result;
        }

        /// <summary>  
        /// 刷新Access Token
        /// </summary>  
        /// <returns>返回 新的 token</returns>  
        public static string refresh_token(string refresh_token)
        {
            string refresh = Des.Decrypt(refresh_token);

            string url = "https://openapi.baidu.com/oauth/2.0/token?";
            url += "grant_type=refresh_token";
            url += "&refresh_token=" + refresh;
            url += "&client_id=" + Key.API_Key;
            url += "&client_secret=" + Key.Secret_Key;
            url += "&scope=" + Key.scope;
            string result = Http.Get(url);
            //{"expires_in":2592000,"refresh_token":"122.6b786a19463425ded4d06f84d439539c.Ym3772wGU7NYywxHGVIkQQfAcidn0i110Lvx0ID.WrK1oQ","access_token":"121.5886b6aea5e01507a7f9c43903ac3eb1.YHNxwynnqWarySCV_wohsAxYIRBypgMoGo1fHqx.8z926g","session_secret":"","session_key":"","scope":"basic netdisk"}

            if (result.IndexOf("access_token") >= 0)
            {
                JObject json = Json.ToJson(result);
                Json.Set("refresh", Des.Encrypt(json["refresh_token"].ToString()));
                Json.Set("token", Des.Encrypt(json["access_token"].ToString()));
                int t = int.Parse(json["expires_in"].ToString()) - 86400;
                Json.Set("session_expires_in_time", DateTime.Now.AddSeconds(t).ToString());
            }
            else
            {
                LogQueue.Log("refresh_token" + result);
            }
            return result;
        }

        /// <summary>  
        /// 获取用户信息
        /// </summary>  
        /// <returns>返回</returns>  
        public static string get_userinfo()
        {
            string url = "https://pan.baidu.com/rest/2.0/xpan/nas?method=uinfo&access_token=" + token();
            string result = Http.Get(url);
            return result;
        }

        /// <summary>  
        /// 获取网盘容量信息
        /// </summary>  
        /// <returns>返回</returns>  
        public static string quota()
        {
            string url = "https://pan.baidu.com/api/quota?";
            url += "access_token=" + token();
            url += "&chckfree=1";
            url += "checkexpire=1";
            string result = Http.Get(url);
            return result;
        }



        /// <summary>  
        /// 递归获取文件列表
        /// </summary>  
        /// <returns>返回</returns>  
        public static string listteer(string dir = "", int page = 1)
        {
            dir = dir.Replace(@"\", "/");
            int num = 2000;
            int start = (page - 1) * num;
            int limit = page * num;
            string url = "https://pan.baidu.com/rest/2.0/xpan/file?";
            url += "method=list";
            url += "&access_token=" + token();
            url += "&dir=" + dir;
            url += "&start=" + start;
            url += "&limit=" + limit;
            url += "&folder=0";
            url += "&web=web";
            string result = Http.Get(url);
            return result;
        }



        /// <summary>  
        /// 递归获取文件列表
        /// </summary>  
        /// <returns>返回</returns>  
        public static string list(string dir = "", int page = 1)
        {
            dir = Key.baidu_dir + dir.Replace(@"\", "/");
            int num = 2000;
            int start = (page - 1) * num;
            int limit = page * num;
            string url = "https://pan.baidu.com/rest/2.0/xpan/file?";
            url += "method=list";
            url += "&access_token=" + token();
            url += "&dir=" + dir;
            url += "&start=" + start;
            url += "&limit=" + limit;
            url += "&web=web";
            string result = Http.Get(url);
            return result;
        }

        /// <summary>  
        /// 递归获取文件列表
        /// </summary>  
        /// <returns>返回</returns>  
        public static string listall(string dir = "", int page = 1,int desc = 0)
        {
            dir = Key.baidu_dir + dir.Replace(@"\", "/");
            int num = 100;
            int start = (page - 1) * num;
            int limit = page * num;
            string url = "http://pan.baidu.com/rest/2.0/xpan/multimedia?";
            url += "method=listall";
            url += "&order=time";
            url += "&desc="+desc;  //0 升序,1 降序,默认0
            //url += "&clienttype=123";
            //url += "&channel=123";
            url += "&access_token=" + token();
            url += "&path=" + dir;
            url += "&start=" + start;
            url += "&limit=" + limit;
            url += "&recursion=1";
            url += "&web=1";

            string result = Http.Get(url);
            return result;
        }
        #region 递归获取文件列表 - 历史文件
        /// <summary>  
        /// 获取网盘容量信息
        /// </summary>  
        /// <returns>返回</returns>  
        public static string listalllishi(string dir = "", int page = 1)
        {
            dir = Key.baidu_history + dir.Replace(@"\", "/");
            int num = 1000;
            int start = (page - 1) * num;
            int limit = page * num;
            string url = "http://pan.baidu.com/rest/2.0/xpan/multimedia?";
            url += "method=listall";
            url += "&clienttype=123";
            url += "&channel=123";
            url += "&access_token=" + token() + "";
            url += "&path=" + dir;
            url += "&start=" + start;
            url += "&limit=" + limit;
            url += "&recursion=1";
            url += "&web=1";
            string result = Http.Get(url);
            return result;
        }
        #endregion
        #region 搜索文件
        /// <summary>  
        /// 搜索文件
        /// </summary>  
        /// <param name="key">关键词 </param>
        /// <param name="dir">文件路径 默认跟目录 </param>
        /// <returns>返回</returns>  
        public static string Search(string key, string dir = "/")
        {
            string url = "https://pan.baidu.com/rest/2.0/xpan/file?";
            url += "method=search";
            url += "&access_token=" + token();
            url += "&dir=" + dir;
            url += "&key=" + key;
            url += "&recursion=0";
            url += "&web=1";
            string result = Http.Get(url);
            return result;
        }
        #endregion

        #region 文件操作 -复制、移动、删除、重命名
        /// <summary>  
        /// 文件操作
        /// </summary>  
        /// <param name="opera">操作 copy、move、rename、delete</param>
        /// <param name="filelist">文件列表 json array</param>
        /// <returns>返回</returns>  
        public static string filemanager(string opera, string filelist)
        {
            string url = "https://pan.baidu.com/rest/2.0/xpan/file?";
            url += "method=filemanager&";
            url += "access_token=" + token() + "";
            url += "&opera=" + opera;
            string pram = "async=2&filelist=" + filelist;
            //[{"path":"/百度/图片/IMG.JPG","dest":"/baidu","newname":"IMG_2230.JPG","ondup":"fail"}]
            string result = Http.Post(url, pram);
            return result;
        }
        #endregion

        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="filePath">本地路径 D:\1.rar</param>
        /// <param name="yun">云端路径 test/1.rar</param>
        /// <returns></returns>
        public static string uploader(string filePath, string yun)
        {
            yun = Key.baidu_dir + yun;
            yun = yun.Replace(@"\", @"/");
            Cfg.Open(filePath);
            int status = int.Parse(Cfg.Json["status"].ToString());
            Dump(status.ToString());
            while (status >= 0  && status != 10)
            {
                status = int.Parse(Cfg.Json["status"].ToString());
                Dump(status.ToString());
                switch (status)
                {
                    case 0:     //检查上传文件是否存在
                        if (!File.Exists(filePath))
                        {
                            Cfg.Json["status"] = -1;
                            Cfg.Json["msg"] = "上传文件不存在";
                            Cfg.Save();
                        }
                        else
                        {
                            Cfg.Json["status"] = 1;
                            Cfg.Json["msg"] = "搜索文件";
                            Cfg.Save();
                        }
                        break;
                    case 1:
                        //1.搜索文件
                        Dump("搜索文件:" + filePath);
                        string ser_dir = yun.Replace(Path.GetFileName(filePath), "");
                        string url1 = "https://pan.baidu.com/rest/2.0/xpan/file" +
                                "?method=search" +
                                "&access_token=" + token() + "" +
                                "&dir=" + ser_dir +
                                "&key=" + Path.GetFileName(filePath);
                        string result1 = Http.Get(url1);
                        JObject json1 = Json.ToJson(result1);
                        if (json1["list"].Count() > 0)
                        {
                            Dump("发现搜索文件:" + yun);
                            foreach (var item in json1["list"])
                            {
                                if (item["path"].ToString() == yun)
                                {
                                    if (item["md5"].ToString() == Md5.File_md5(filePath))
                                    {
                                        Dump("不需要备份云端文件:" + yun);
                                        Cfg.Json["status"] = 9;
                                        Cfg.Json["msg"] = "文件已经存在 搜索秒传";
                                        Cfg.Save();
                                    }
                                    else
                                    {
                                        Dump("需要备份云端文件:" + yun);
                                        Cfg.Json["status"] = 2;
                                        Cfg.Json["msg"] = "移动文件  " + yun;
                                        Cfg.Save();
                                    }
                                    break;
                                }
                            }
                        }
                        else
                        {
                            Dump("未发现搜索文件:" + yun);
                            Cfg.Json["status"] = 3;
                            Cfg.Json["msg"] = "文件预读处理";
                            Cfg.Save();
                        }
                        System.Threading.Thread.Sleep(1000);    //频率太快导致返回错误 命中频率31034
                        break;
                    case 2:
                        //2.文件移动
                        string url2 = "https://pan.baidu.com/rest/2.0/xpan/file" +
                                    "?method=filemanager" +
                                    "&access_token=" + token() +
                                    "&opera=" + "move";
                        JArray filelist = new JArray();
                        JObject prame = new JObject();
                        string fdate = "._History." + DateTime.Now.ToString("yyyyMMddHHmmssffff")+ Path.GetExtension("C:/"+ yun);
                        
                        prame.Add("path", yun);
                        //prame.Add("dest", yun.Replace(Key.baidu_dir, Key.baidu_history).Replace(Path.GetFileName(filePath), ""));
                        prame.Add("dest", yun.Replace(Path.GetFileName(filePath), ""));
                        prame.Add("newname", Path.GetFileName(filePath) + fdate);
                        prame.Add("ondup", "overwrite");
                        filelist.Add(prame);
                        string pram2 = "async=0&filelist=" + Json.ToStr(filelist);
                        string result2 = Http.Post(url2, pram2);
                        JObject json2 = Json.ToJson(result2);
                        Dump("移动结果:" + result2);
                        //不管移动是否成功 都进行上传
                        Cfg.Json["status"] = 3;
                        Cfg.Json["msg"] = "移动结果 " + result2;
                        Cfg.Save();
                        System.Threading.Thread.Sleep(10);
                        break;
                    case 3:
                        //文件预读处理
                        FileInfo fileInfo = new FileInfo(filePath);
                        //列表值预设
                        JArray File_list = new JArray();
                        JArray Md5_list = new JArray();
                        int splitFileSize = 4 * 1024 * 1024;       //分成4M
                        Cfg.Json["file"] = filePath;
                        Cfg.Json["file_name"] = fileInfo.Name;
                        Cfg.Json["path"] = yun;
                        Cfg.Json["size"] = fileInfo.Length;
                        Cfg.Json["block_list"] = "";
                        Cfg.Json["part_size"] = splitFileSize;
                        Cfg.Json["part_count"] = (int)Math.Ceiling((double)fileInfo.Length / splitFileSize);
                        Cfg.Json["part_read"] = 0;
                        Cfg.Json["content-md5"] = Md5.File_md5(filePath);
                        Cfg.Json["slice-md5"] = Md5.File_md5_Slice(filePath);
                        Cfg.Json["local_ctime"] = Time.ToTime(fileInfo.CreationTime);
                        Cfg.Json["local_mtime"] = Time.ToTime(fileInfo.LastWriteTimeUtc);
                        if (fileInfo.Length > splitFileSize)
                        {
                            Dump("判定结果:需要分隔文件!上传分块:" + Cfg.Json["part_count"].ToString());
                            using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                            {
                                using (BinaryReader br = new BinaryReader(fs))
                                {
                                    bool isReadingComplete = false;
                                    while (!isReadingComplete)
                                    {
                                        byte[] input = br.ReadBytes(splitFileSize);
                                        Md5_list.Add(Md5.md5(input));
                                        isReadingComplete = (input.Length != splitFileSize);
                                    }
                                    br.Close();
                                }
                                fs.Close();
                            }
                        }
                        else
                        {
                            Dump("判定结果:不需要分隔文件!");
                            Md5_list.Add(Cfg.Json["content-md5"].ToString());
                        }
                        Cfg.Json["block_list"] = Md5_list;
                        Cfg.Json["uploadid"] = "";
                        Cfg.Json["status"] = 4;
                        Cfg.Json["msg"] = "文件预上传";
                        Cfg.Save();
                        Dump(Cfg.Json["msg"].ToString());
                        break;
                    case 4:
                        //文件预上传
                        string url3 = "http://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=" + token();
                        string parm3 = "path=" + Cfg.Json["path"] +
                                      "&size=" + Cfg.Json["size"] +
                                      "&isdir=0" +
                                      "&autoinit=1" +
                                      "&rtype=1" +
                                      "&block_list=" + Json.ToStr(Cfg.Json["block_list"]) +
                                      "&content-md5=" + Cfg.Json["content-md5"] +
                                      "&slice-md5=" + Cfg.Json["slice-md5"] +
                                      "&local_ctime=" + Cfg.Json["local_ctime"] +
                                      "&local_mtime=" + Cfg.Json["local_mtime"];
                        string result3 = Http.Post(url3, parm3);
                        JObject create = JObject.Parse(result3);
                        Dump("post:" + parm3);
                        Dump("结果:" + result3);
                        if (int.Parse(create["errno"].ToString()) == 0)
                        {
                            if (int.Parse(create["return_type"].ToString()) == 2)
                            {
                                Cfg.Json["status"] = 9;
                                Cfg.Json["msg"] = "文件秒传";
                                Cfg.Save();
                            }
                            else
                            {
                                //更新配置
                                Cfg.Json["uploadid"] = create["uploadid"];
                                Cfg.Json["status"] = 5;
                                Cfg.Json["msg"] = "预上传完成 准备分块上传";
                                Cfg.Save();
                            }
                        }
                        else
                        {
                            Cfg.Json["status"] = -1;
                            Cfg.Json["msg"] = "预上传请求失败:" + result3;
                            Cfg.Save();
                        }

                        break;
                    case 5:
                        //分块上传
                        int read = int.Parse(Cfg.Json["part_read"].ToString());
                        int count = int.Parse(Cfg.Json["part_count"].ToString());
                        //当前上传的块文件大于总上传块数 则 代表已经上传完成
                        if (read + 1 > count)
                        {
                            Cfg.Json["status"] = 6;
                            Cfg.Json["msg"] = "分块文件上传完成";
                            Cfg.Save();
                        }
                        else
                        {
                            Dump("开始上传 分片" + (read + 1).ToString() + "/" + count.ToString());
                            FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                            BinaryReader br = new BinaryReader(fs);
                            int size = int.Parse(Cfg.Json["size"].ToString());
                            int part_size = int.Parse(Cfg.Json["part_size"].ToString());

                            fs.Seek(part_size * read, SeekOrigin.Begin);
                            byte[] input = br.ReadBytes(part_size);

                            Console.WriteLine(input.Length);
                            Console.WriteLine(Md5.md5(input));

                            br.Close();
                            fs.Close();

                            string url4 = "https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?" +
                                        "access_token=" + token() +
                                        "&method=upload" +
                                        "&type=tmpfile" +
                                        "&path=" + Cfg.Json["path"] +
                                        "&uploadid=" + Cfg.Json["uploadid"] +
                                        "&partseq=" + read.ToString();
                            string result4 = Http.Upload_Request(url4, input);

                            Dump("url:" + url4);
                            Dump("结果:" + result4);
                            JObject tmpfile = JObject.Parse(result4);
                            if (result4.IndexOf("request_id") >= 0)
                            {
                                Cfg.Json["part_read"] = read + 1;
                                Cfg.Json["msg"] = "分块文件上传  " + Cfg.Json["part_read"].ToString();
                                Cfg.Save();
                            }
                            else
                            {
                                Cfg.Json["status"] = -1;
                                Cfg.Json["msg"] = result4;
                                Cfg.Save();
                            }
                        }
                        break;
                    case 6:
                        //合并文件
                        string url5 = "https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=" + token();
                        string parm5 = "path=" + Cfg.Json["path"] +
                               "&size=" + Cfg.Json["size"] +
                               "&isdir=0" +
                               "&rtype=1" +
                               "&uploadid=" + Cfg.Json["uploadid"] +
                               "&block_list=" + Json.ToStr(Cfg.Json["block_list"]) +
                               "&local_ctime=" + Cfg.Json["local_ctime"] +
                               "&local_mtime=" + Cfg.Json["local_mtime"] +
                               "&is_revision=0" +
                               "&mode=3";

                        string result5 = Http.Post(url5, parm5);
                        JObject json5 = JObject.Parse(result5);
                        Dump("url:" + url5 + " 参数:" + parm5 + " 结果:" + result5);
                        if (int.Parse(json5["errno"].ToString()) == 0)
                        {
                            Cfg.Json["status"] = 9;
                            Cfg.Json["msg"] = "上传成功";
                            Cfg.Save();
                        }
                        else
                        {
                            Cfg.Json["status"] = -1;
                            Cfg.Json["msg"] = "文件合并请求失败 :" + result5;
                            Cfg.Save();
                        }
                        break;
                    case 9:
                        Cfg.Json["status"] = 10;
                        Cfg.Save();
                        break;
                    case 10:
                        break;
                    case -1:
                        break;
                }
            }
            Dump("上传结束:" + Cfg.Json["status"].ToString() + " 信息:" + Cfg.Json["msg"].ToString());

            JObject REL = new JObject();
            REL["code"] = Cfg.Json["status"].ToString();
            REL["msg"] = Cfg.Json["msg"].ToString();
            Cfg.DelFile();
            return Json.ToStr(REL);
        }



        static bool debugs = false;

        /// <summary>
        /// 输出调试信息
        /// </summary>
        /// <param name="str">输出内容</param>
        private static void Dump(string str)
        {
            if(debugs == true)
            {
                LogQueue.Log("上传信息:" + str);
                //Console.WriteLine(str);
            }
        }


    }
}

看起来挺多的 实际核心就是 baidu.upload  别发私信了 说真话 我基本很少看的

嗯嗯嗯嗯

要上传代码的怪我没说明白 上传就是POST 已Form Data格式进行的封装

评论发不了这么长代码 补一个上传代码吧

#region 发送post请求上传
        /// <summary>
        /// 发送 post 请求上传
        /// </summary>
        /// <param name="address">服务器地址  </param>
        /// <param name="fileNamePath">上传的本地文件路径</param>
        /// <param name="saveName">要保存的文件名称</param>
        /// <returns></returns>
        public static string Upload_Request(string address, string fileNamePath)
        {
            string sReturnString = "";
            // 要上传的文件   
            FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
            BinaryReader r = new BinaryReader(fs);     //时间戳   
            string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");     //请求头部信息   
            StringBuilder sb = new StringBuilder();
            sb.Append("--");
            sb.Append(strBoundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append("file");
            sb.Append("\"; filename=\"");
            sb.Append(Path.GetFileName(fileNamePath));
            sb.Append("\";");
            sb.Append("\r\n");
            sb.Append("Content-Type: ");
            sb.Append("application/octet-stream");//image/gif
            sb.Append("\r\n");
            sb.Append("\r\n");
            string strPostHeader = sb.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);     // 根据uri创建HttpWebRequest对象   
            HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
            httpReq.Method = "POST";     //对发送的数据不使用缓存   
            httpReq.AllowWriteStreamBuffering = true;     //设置获得响应的超时时间(300秒)   
            httpReq.Timeout = 3000000;
            httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
            long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
            long fileLength = fs.Length;
            httpReq.ContentLength = length;
            try
            {
                //每次上传4k m  
                int bufferLength = 4096 * 1024;
                byte[] buffer = new byte[bufferLength]; //已上传的字节数
                long offset = 0;         //开始上传时间   
                DateTime startTime = DateTime.Now;
                int size = r.Read(buffer, 0, bufferLength);
                Stream postStream = httpReq.GetRequestStream();         //发送请求头部消息   
                postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                while (size > 0)
                {
                    postStream.Write(buffer, 0, size);
                    offset += size;
                    TimeSpan span = DateTime.Now - startTime;
                    double second = span.TotalSeconds;
                    Debug.WriteLine("上传大小:" + (offset * (int.MaxValue / length)).ToString());
                    Debug.WriteLine("已用时:" + second.ToString("F2") + "秒");

                    if (second > 0.001)
                    {
                        Debug.WriteLine("平均速度:" + (offset / 1024 / second).ToString("0.00") + "KB/秒");
                    }
                    else
                    {
                        Debug.WriteLine(" 正在连接…");
                    }
                    size = r.Read(buffer, 0, bufferLength);
                }
                //添加尾部的时间戳   
                postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                postStream.Close();         //获取服务器端的响应   
                WebResponse webRespon = httpReq.GetResponse();
                Stream s = webRespon.GetResponseStream();
                //读取服务器端返回的消息  
                StreamReader sr = new StreamReader(s);
                sReturnString = sr.ReadLine();
                s.Close();
                sr.Close();
                /*
                if (sReturnString == "Success")
                {
                    Debug.WriteLine("Success 上传成功…");
                }
                else if (sReturnString == "Error")
                {
                    Debug.WriteLine("Error 错误");
                }
                else
                {
                    Debug.WriteLine(sReturnString);
                }
                */
            }
            catch (WebException ev)
            {
                sReturnString = "{\"errno\":408,\"msg\":\"" + "请求超时:" + ev.Message + "\"}";

            }
            catch (Exception ev)
            {
                sReturnString = "{\"errno\":400,\"msg\":\"" + "请求错误:" + ev.Message + "\"}";
            }
            finally
            {
                fs.Close();
                r.Close();
            }
            //Debug.WriteLine(sReturnString);
            return sReturnString;
        }

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
C#5.0本质论第四版,高清扫描的,对C#5.0技术讲的比较详细,第1章 C#概述 1 1.1 Hello,World 1 1.2 C#语法基础 3 1.2.1 C#关键字 3 1.2.2 标识符 4 1.2.3 类型定义 5 1.2.4 Main 6 1.2.5 语句和语句分隔符 7 1.2.6 空白 8 1.2.7 使用变量 8 1.2.8 数据类型 9 1.2.9 变量的声明 9 1.2.10 变量的赋值 10 1.2.11 变量的使用 11 1.3 控制台输入和输出 11 1.3.1 从控制台获取输入 11 1.3.2 将输出写入控制台 12 1.3.3 注释 14 1.3.4 托管执行和公共语言基础结构 16 1.3.5 C#和.NET版本 17 1.3.6 CIL和ILDASM 18 1.4 小结 20 第2章 数据类型 21 2.1 基本数值类型 21 2.1.1 整数类型 22 2.1.2 浮点类型 23 2.1.3 decimal类型 23 2.1.4 字面值 24 2.2 更多基本类型 27 2.2.1 布尔类型 27 2.2.2 字符类型 27 2.2.3 字符串 29 2.3 null和void 34 2.3.1 null 34 2.3.2 void 35 2.4 类型的分类 37 2.4.1 值类型 37 2.4.2 引用类型 37 2.5 可空修饰符 38 2.6 数据类型之间的转换 39 2.6.1 显式转型 39 2.6.2 隐式转型 41 2.6.3 不使用转型操作符的类型转换 42 2.7 数组 43 2.7.1 数组的声明 44 2.7.2 数组的实例化和赋值 45 2.7.3 数组的使用 48 2.7.4 字符串作为数组使用 52 2.7.5 常见数组错误 53 2.8 小结 55 第3章 操作符和控制流 57 3.1 操作符 57 3.1.1 一元操作符正和负 58 3.1.2 二元算术操作符 58 3.1.3 复合赋值操作符 64 3.1.4 递增和递减操作符 65 3.1.5 常量表达式和常量符号 68 3.2 控制流程概述 69 3.2.1 if语句 70 3.2.2 嵌套if 71 3.3 代码块 73 3.4 代码块、作用域和声明空间 74 3.5 布尔表达式 76 3.5.1 关系操作符和相等性操作符 77 3.5.2 逻辑布尔操作符 77 3.5.3 逻辑求反操作符 78 3.5.4 条件操作符 79 3.5.5 空接合操作符 80 3.6 按位操作符 80 3.6.1 移位操作符 81 3.6.2 按位操作符 82 3.6.3 按位赋值操作符 83 3.6.4 按位取反操作符 84 3.7 控制流语句(续) 84 3.7.1 while和do while循环 84 3.7.2 for循环 86 3.7.3 foreach循环 88 3.7.4 switch语句 90 3.8 跳转语句 92 3.8.1 break语句 92 3.8.2 continue语句 94 3.8.3 goto语句 95 3.9 C#预处理指令 97 3.9.1 排除和包含代码 98 3.9.2 定义预处理符号 98 3.9.3 生成错误和警告 99 3.9.4 关闭警告消息 99 3.9.5 nowarn:选项 99 3.9.6 指定行号 100 3.9.7 可视编辑器提示 100 3.10 小结 101 第4章 方法和参数 103 4.1 方法的调用 104 4.1.1 命名空间 105 4.1.2 类型名称 106 4.1.3 作用域 107 4.1.4 方法名称 107 4.1.5 形参和实参 107 4.1.6 方法返回值 107 4.1.7 语句与方法调用的比较 108 4.2 方法的声明 108 4.2.1 形式参数声明 109 4.2.2 方法返回类型声明 110 4.3 using指令 111 4.4 Main()的返回值和参数 114 4.5 方法的参数 116 4.5.1 值参数 116 4.5.2 引用参数(ref) 117 4.5.3 输出参数(out) 118 4.5.4 参数数组 120 4.6 递归 122 4.7 方法重载 124 4.8 可选参数 126 4.9 用异常实现基本错误处理 129 4.9.1 捕捉错误 130 4.9.2 使用throw语句报告错误 136 4.10 小结 138 第5章 类 139 5.1 类的定义和实例化 141 5.2 实例字段 144 5.2.1 实例字段的声明 144 5.2.2 实例字段的访问 144 5.3 实例方法 145 5.4 使用this关键字 146 5.5 访问修饰符 151 5.6 属性 153

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值