要百度上传代码的太多了 还要发邮箱 嫌麻烦 这里开一个贴 放上百度云传类
想开源上传软件 只是卖出去了好多份 再有是通过系统服务进程上传的 不了解的人用起来麻烦些 其次是软件有注册机制关联的地方有点多 删起来也麻烦 等哪天放大假的时候处理一下再说吧 主要是改一改界面什么的 不然卖出去的看到了找我退款怎么办
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;
}