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;
        }

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值