苦苦搞了半个通宵才搞定的直接使用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.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...
随机推荐
- CentOS7-jdk1.8下载安装
一.下载网址 jdk全版本:https://www.oracle.com/java/technologies/downloads/archive/ 本次安装版本(jdk1.8.0_151):https ...
- gongwen
gongwen 学号 姓名 工作占比 20201307 梁辰鱼 20% 20201323 谭顺心 17% 20201222 龚 杰 16.5% 20201325 夏俊睿 16% 20201317 鲁永 ...
- Postman设置Cookie参数为全局变量-环境变量设置IP参数
前提:在遇到多接口测试时,容易出现限制登录的情况 可以使用两种情况: 1.在调用其他接口前,先调用登录接口:这个方法在一般情况下可以,但是对于有些环境,比如像小程序登录时token(或cookie)是 ...
- Python基础教程:字典
字典 = {'键1':'值1','键2':'值2','键3':'值3',...} animal_dict = {'Cow':'Milk','Chicken':'egg'} 字典由键值对构成,这种键值对 ...
- 21.C++的对象模型
程序1: #pragma warning(disable:4996) //2022年9月21日19:20:29 #include <iostream> using namespace st ...
- JAVA数据类型以及什么是字节
强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义才能使用(安全性高) java的数据类型分为两大类 基本类型(primitive type) 引用类型(reference type) / ...
- [Elixir/Erlang/Racket] 模式匹配,字符串,哈希表,格式化输出
https://leetcode.cn/problems/evaluate-the-bracket-pairs-of-a-string/solutions/2057593/s-by-yhm138_-n ...
- vue项目如何解决跨域问题
跨域是什么 跨域本质是浏览器基于同源策略的一种安全手段 同源策略(Sameoriginpolicy),是一种约定,它是浏览器最核心也最基本的安全功能 所谓同源(即指在同一个域)具有以下三个相同点 ...
- GO实现Redis:GO实现内存数据库(3)
实现Redis的database层(核心层:处理命令并返回) https://github.com/csgopher/go-redis datastruct/dict/dict.go type Con ...
- ES(ECMAScript)标准下中的let、var和const
ES标准下中的let,var和const let会报重复声明,var则比较随意,重不重复无所谓 // 使用 var 的时候重复声明变量是没问题的,只不过就是后面会把前面覆盖掉 var num = 10 ...