苦苦搞了半个通宵才搞定的直接使用Sliverlight将文件PUT到阿里云OSS
为了公司的项目,小的我各种折腾啊,不过高兴的是实现了Silverlight直接提交至阿里云OSS的文件上传,文件上传再也不用通过服务器中转了。
研究SDK发现还有个Node-oss.js,但还没进行测试。哪天搞一下。成功的话再搞上来。。。
明天还得研究基于ActionScript 2.0/3.0直接上传至阿里云OSS。有得搞了。。。不废话了,把Silverlight上传OSS的代码贴这里,也许大家很多人需要吧。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Net.Browser;
using System.Threading;
using System.Security.Cryptography;
using System.Text;
using SilverlightAliOSSUpload.Common; namespace SilverlightAliOSSUpload
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
byte[] buffer = null;
string accessKeyId = "Access Key ID";
string accessKeySecret = "Access Key Secret";
string fileName = string.Empty; private void button1_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
if (dialog.ShowDialog() == true)
{
try
{
DateTime dt = DateTime.Now; fileName = dialog.File.Name; WebHeaderCollection collection = new WebHeaderCollection(); buffer = new byte[dialog.File.Length]; using (Stream stream = dialog.File.OpenRead())
{
stream.Read(buffer, 0, buffer.Length);
} collection[HttpRequestHeader.ContentMd5] = ICryptography.GetMD5(buffer).ToUpper(); // PUT\n[Content-MD5]\n\n[GMT Date]\n/[BucketName]/[FileName]
HMACSHA1 sha = new HMACSHA1(); sha.Key = Encoding.UTF8.GetBytes(accessKeySecret.ToCharArray()); // 这里值得说一下,是OSS最丫的垃圾的地方。这里面的签名和URL签名都必须使用Expires时间,也就是要指定过期时间,我这里是10分钟后过期
// 就这么一行,调了四个多小时。FUCK
byte[] hashBuffer = Encoding.UTF8.GetBytes(string.Format("PUT\n{0}\n\n{1}\n/Bucket/{2}", ICryptography.GetMD5(buffer), Convert.ToInt64(DateTimeToUTC(dt.AddMinutes(10))),
fileName).ToCharArray()); string hash = Convert.ToBase64String(sha.ComputeHash(hashBuffer)); // 因为Silverlight的WebRequest不能创建PUT和DELETE的Method,所以这里只能使用WebRequestCreator来创建
HttpWebRequest request = (HttpWebRequest)WebRequestCreator.ClientHttp.Create(
new Uri(string.Format("http://Bucket.oss.aliyuncs.com/{0}?OSSAccessKeyId={1}&Expires={2}&Signature={3}", fileName, accessKeyId, Convert.ToInt64(DateTimeToUTC(dt.AddMinutes(10))), hash))); request.Method = "PUT";
request.ContentType = "multipart/form-data";
request.ContentLength = dialog.File.Length; request.Headers = collection; request.BeginGetRequestStream(new AsyncCallback(AsyncRequestStream), request); }
catch (Exception err)
{
new Thread(() =>
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
label1.Content += err.Message;
});
}).Start();
}
}
} /// <summary>
/// 转换当前日期至UTC时间格式
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static double DateTimeToUTC(DateTime dt)
{
DateTime UnixTimestampLocalZero = System.TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), TimeZoneInfo.Local);
return (long)(dt - UnixTimestampLocalZero).TotalMilliseconds;
} private void AsyncRequestStream(IAsyncResult ar)
{
try
{
HttpWebRequest request = (HttpWebRequest)ar.AsyncState; using (Stream stream = request.EndGetRequestStream(ar))
{
stream.Write(buffer, 0, buffer.Length);
stream.Flush();
} request.BeginGetResponse(new AsyncCallback(AsyncGetResponse), request);
}
catch (Exception err)
{
new Thread(() =>
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
label1.Content += err.Message;
});
}).Start();
}
} private void AsyncGetResponse(IAsyncResult ar)
{
try
{
HttpWebRequest request = (HttpWebRequest)ar.AsyncState; HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar); using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
string content = sr.ReadToEnd();
new Thread(() =>
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
textBlock1.Text += content;
});
}).Start();
} response.Close();
}
catch (WebException err)
{
new Thread(() =>
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
label1.Content = err.Status; using (StreamReader sr = new StreamReader(err.Response.GetResponseStream()))
{
textBlock1.Text += sr.ReadToEnd();
}
});
}).Start();
}
catch (Exception err)
{
new Thread(() =>
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
label1.Content += err.Message;
});
}).Start();
}
}
}
}
苦苦搞了半个通宵才搞定的直接使用Sliverlight将文件PUT到阿里云OSS的更多相关文章
- jmeter上传文件搞了一天,才搞定,没高人帮忙效率就是低,赶紧记下来,以备后用
先用谷歌浏览器抓包,抓到的包类似这样: 在jmeter里添加一个http请求,配置好参数,方法,端口,路径等, 勾选 在“同请求一起发送参数”里填写上面抓包的部分数据: 分别对应录入,勾选“编码” 我 ...
- servlet+jsp update修改页面的实现,整整搞了两个小时才搞定
package DAO; public class books { private int bid; private String bname; private int booksl; private ...
- 说下我费了几个钟头才搞定的myeclipse和tomcat问题
配置myeclipse与tomcat的时候,我根本没有想到myeclipse已经集成了tomcat,根据我上篇文章可以找到所集成的tomcat的位置.于是,自己下了一个tomcat,也许是自作聪明吧, ...
- python 简单爬虫获取气象数据发送气象定时报-预报预警信息及时推送及阿里云短信群发接口
!/usr/bin/python #encoding=utf-8 #Author:Ruiy #//////////////////////////////////////////////////// ...
- DEV设计之自动流水号,DEV专家解答,自己折腾了半天也没有搞定,怪英文不好
() 老外专家给了回答,结果没有全到懂,又折腾了20分钟朋友提示才搞定 获取一个自动增加1的流水号值, 第一个参数是本事的数据库连接对象,第2个参数是也这个值为唯一标识返回来一个增量的值,第三个好像没 ...
- (素材源代码)猫猫学IOS(四)UI之半小时搞定Tom猫
下载地址:http://download.csdn.net/detail/u013357243/8514915 以下是执行图片展示 制作思路以及代码解析 猫猫学IOS(四)UI之半小时搞定Tom猫这里 ...
- sklearn.preprocessing OneHotEncoder——仅仅是数值型字段才可以,如果是字符类型字段则不能直接搞定
>>> from sklearn.preprocessing import OneHotEncoder >>> enc = OneHotEncoder() > ...
- SALT-API兼HALITE测试搞定
妈XX,真的搞了近一周的空闲时间. 最后才领悟. 其实,先按HALITE的套路弄好,然后直接SALT-API就OK了..因为HALITE就是SALT-API的封闭和替代嘛. 随便参考一个URL搞定HA ...
- 1分钟搞定超慢SQL
前几天,一个用户的研发人员找到我了,说他们有个SQL语句非常慢,我说多慢?他们说:半个小时也没出结果.于是问他们要了SQL语句和执行计划,SQL语句就不能再这里贴出来了,下面是调整前的执行计划(略去某 ...
- 将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定
1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...
随机推荐
- Windows10电源选项:睡眠、休眠、启用快速启动
参考链接: http://www.dnpz.net/diannaozhishi/2223.html http://www.cfan.com.cn/2018/0118/130151.shtml 在介绍w ...
- database.property文件
注意修改用户名密码 mysql8的版本要注意配置时区 此文件放置连接数据库的相关参数 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://l ...
- spring-boot-starter-webflux
webflux: 反应式编程reactor的产物,采用发布订阅模式,引入netty的nio,比较适合IO密集型应用. 因普遍应用使用的DB链接是IO阻塞型,因此在一般应用中无法体现它的优势.redis ...
- 如何利用Apifox通过签名计算及数据加解密进行用户认证接口测试?
用户注册场景:输入签名数据signature,appId,13位时间戳timestamp,6位随机数nonce,merchantId(非必填,本次不填)的请求参数发送给服务器,服务器返回响应数值后,校 ...
- C# +SQL 存储过程 实现系统数据权限审查AOP效果
背景: 1.C/S系统架构 2.前端 Extjs 3.后台C# 4.数据库SQL 前端通过ajAx请求与后台通信. 前端应用页面统一继承入口类 BasePage 应用页面 public partia ...
- order by是怎么工作的?
order by是怎么工作的? 在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求.还是以我们前面举例用过的市民表为例,假设你要查询城市是"杭州"的所有人名字 ...
- js循环中reduce的用法简单介绍
reduce() 方法接收一个函数作为累加器,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(上一次回调的返回值),当前元素值,当前索引 ...
- 基于docker和cri-dockerd部署k8sv1.26.3
cri-dockerd是什么? 在 Kubernetes v1.24 及更早版本中,我们使用docker作为容器引擎在k8s上使用时,依赖一个dockershim的内置k8s组件:k8s v1.24发 ...
- ARC149(A~E)
Tasks - AtCoder Regular Contest 149 又是114514年前做的题,现在来写 屯了好多,清一下库存 A - Repdigit Number (atcoder.jp) 直 ...
- 常用脚本学习手册——Bat脚本
常用脚本学习手册--Bat脚本 我们在日常工作中常常会遇到一些需要重复进行的工作,又或者我们的项目在转交客户时需要去简化配置过程 这时我们就需要使用到一些自动化部署操作,我们常常会采用脚本来完成这部分 ...