c#上传文件到服务器实例,c# 上传文件到百度服务器

artic-19002961.html

之前玩了下百度bcs,觉得还不错,看了下云存储貌似没.net sdk  但是既然有api就好办嘛,自己动手写个文件上传试试

它的参数用了hmac签名,.net有自带的库,下面是签名方法,这个找了很久...参考着修改了下.还有个疑问,不知道百度是怎么验证签名内容的,因为我们只传入了sign,而hmac据说是不能解密的,只能用密钥来验证

///

/// 对数据进行Hmac签名

///

/// 要签名的数据

/// 密钥

///

private string Hamc(string valueStr, string keyStr)

{

HMAC hmac = HMACSHA1.Create();

//源数据

var data = System.Text.Encoding.UTF8.GetBytes(valueStr);

//密钥

var key = System.Text.Encoding.UTF8.GetBytes(keyStr);

//设置密钥

hmac.Key = key;

//计算哈希值

var hash = hmac.ComputeHash(data);

//对数据进行签名

var signedData = hash.Concat(data).ToArray();

var receivedHash = signedData.Take(hmac.HashSize >> 3).ToArray();

String str = HttpUtility.UrlEncode(Convert.ToBase64String(receivedHash));

return str;

}

然后就是上传文件到服务器了,可以看着进行修改下,下面的方法检索了流的sha1,如果服务器存在则直接返回地址.这里流的读取有一个注意的地方,不能一次读取流的全部,因为某些流不支持查找操作,所以先设了个40kb的缓存

///

/// 上传文件到百度空间,并写入文件数据库

///

/// 输入流 该流必须能够读取

/// 上传的文件名

///

///

public string UploadToBaidu(Stream input, string fileName, string bucket = "kecq-com")

{

if (String.IsNullOrEmpty(fileName))

{

throw new Exception("savePath参数不能为空");

}

fileName = fileName.TrimStart('/');

string savePath = "/" + DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day + "/" + Guid.NewGuid().ToString("N") + Path.GetExtension(fileName);

string fileUrl = "http://bcs.duapp.com/" + bucket + savePath;

string Content = "MBO" + "\n"

+ "Method=PUT" + "\n"

+ "Bucket=kecq-com" + "\n"

+ "Object=" + savePath + "\n";

string sign = Hamc(Content, "xxxxxxxxxxxxx");

string url = "http://bcs.duapp.com/" + bucket + savePath + "?sign=MBO:D200252c02041aac02015b01656582bf:" + sign;

HttpWebResponse res = null;

string returnString = "";

try

{

List data = new List();

byte[] buffer = new byte[40960];

int read = input.Read(buffer, 0, buffer.Length);

while (read > 0)

{

for (int i = 0; i < read; i++)

{

data.Add(buffer[i]);

}

read = input.Read(buffer, 0, buffer.Length);

}

input.Close();

//获取流的sha1码

System.Security.Cryptography.HashAlgorithm algorithm = System.Security.Cryptography.SHA1.Create();

String sha1 = BitConverter.ToString(algorithm.ComputeHash(data.ToArray())).Replace("-", "");

string writeDbUrl = "http://my.fyj.me/service/upload.action?method=POST&userID=xxxxxxxxx&flag=MU&ak=afbf3d192908477d9e24b3e351bc4ebe&sign=0PjZ80oM9HRgyJYGQtmawv2eiwI%3d";

writeDbUrl += "&action=saveFileDb&fileSha1=" + sha1 + "&fileName=" + fileName + "&fileSize=" + data.Count + "&fileUrl=" + HttpUtility.UrlEncode(fileUrl);

string result = FYJ.Common.HttpHelper.DoGet(writeDbUrl);

FYJ.Common.JsonHelper json = new FYJ.Common.JsonHelper(result);

if (json.GetValue("code") != "1")

{

throw new Exception(json.GetValue("message"));

}

else

{

returnString = result;

}

if (json.GetValue("isFileExist") == "0")

{

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

req.Method = "PUT";

req.ContentType = "application/x-www-form-urlencoded";

req.ContentLength = data.Count;

Stream newStream = req.GetRequestStream();

newStream.Write(data.ToArray(), 0, data.Count);

newStream.Close();

req.GetRequestStream();

res = (HttpWebResponse)req.GetResponse();

Stream ReceiveStream = res.GetResponseStream();

Encoding encode = System.Text.Encoding.UTF8;

StreamReader sr = new StreamReader(ReceiveStream, encode);

// strResult = sr.ReadToEnd();

sr.Close();

ReceiveStream.Close();

}

return returnString;

}

catch (Exception e)

{

return "{\"code\":\"-1\",\"msg\":\""+e.Message+"\"}";

}

finally

{

if (res != null)

{

res.Close();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值