最近在搞OSS对象存储,发现了自身的一些不足,趁着有空在此做个总结,希望能够帮助到大家!!!

首先解释下OSS,Object Storage Service(对象存储服务),一般的云公司,都会提供OSS的。说的通俗点,就是远程服务器提供一定的空间专门来存储文件的,这些文件可以直接通过url任意时间,任意地点访问。

而把文件存储到OSS空间里,就是使用的http协议。OSS中的Bucket就是Windows系统下的文件夹。

一、http原理

我们知道http协议是基于TCP/IP协议的,也就是说,通过http进行数据传输,首先需要进行TCP连接。TCP连接需要进行三次握手,断开连接需要进行四次挥手。

关于TCP的三次握手跟四次挥手,话不多说,直接推荐,人家已经写的很好了。 无需我多说废话。

TCP的三次握手

TCP的四次挥手

握手要稍微了解一下的,不然可能无法理解下面的keep-alive。

想了解https原理的,推荐彻底搞懂https原理

http请求信息

http的请求报文,就是发送给服务端的信息,主要包含三个部分:请求行、请求头部、请求数据

(借用别人的图)

请求行主要包含请求方法(GET,POST,PUT,DELETE),URL跟http协议版本

请求头部:



在这里,稍微了解一下

Accept指的是,本次请求,接受哪些格式的文件

Accept-Encoding :接受的文件压缩格式

Host :域名,主机名

比较重要的请求头部

Connection :采用的连接方式

Content-Type(请求编码方式): application/x-www-form-urlencoded(只能是键值对方式) application/form-data(可以包含文件)

Content-Length(请求数据长度): 35

Authorization(认证):当我们需要访问其他公司提供的服务接口时,必须要有这个签名认证。

有兴趣可以了解一下http协议版本

在1.0版本下,每次发送一个请求时都要进行一次TCP三次握手,然后再进行数据传输,TCP连接消耗成本较高。为了能够复用TCP的连接,
因而诞生了1.1版本,主要的变化就是可以进行持久连接,也就是说,一次TCP连接可以发送多个http请求,但服务端仍然一次只能处理一个请求,依次进行。只需设置请求头部的Connection的值为keep-alive,即可。如果超过一定的时间没有继续发送http请求,TCP连接会自动关闭,当然也可以设置主动关闭。
至于未来的2.0版本,最大的变化便是增加双工模式,使用多路复用技术,也就是说不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求
2.0版本的还没捂热,3.0已经来了,学不动了呀。至于3.0是个什么情况,小爷也不知道。

http响应信息

http的响应报文就是服务端给http请求的回应信息,主要包含状态行、响应头部、响应数据。

1 状态行:协议版本、状态码、简要描述,例如:HTTP/1.1 200 OK

常见的状态码:200,一切正常 400,客户端错误 404,相关资源文件未找到 500,服务端错误

2 响应头部:例如:Content-Type: text/plain,json等

3 响应数据:即服务器回应客户端的内容。如果我们请求网页,则返回网页内容,如果只是单纯请求数据,则返回相应的数据。

二、.NET中提供的相应的API

WebRequest,HttpWebRequest, WebResponse,HttpWebResponse

这几个类做爬虫的话,也经常用到的。可能很多人被这几个类搞混了。鄙人也是的,怎么这么多类,好像还有什么WebClient等。。。

WebRequest类,这个类是一个抽象类,是对URI发出请求而进行了一种抽象,跟动物是对狗狗、猫咪、小老鼠等的一种抽象是一个道理。

面向对象的思想很是伟大,他来源于真实世界的抽象,当然我们也可以用面向对象的思想来反观世界。

很是精彩!!!

HttpWebRequest类,这个类是WebRequest类的派生类,专门用于进行http特定的实现。里面有相应的属性和方法。

WebResponse HttpWebResponse 同理。

//请求
HttpWebRequest request =(HttpWebRequest)WebRequest.Create("http://www.contoso.com/");
request.KeepAlive = false;//设置是否为持久连接
request.Method = "POST";
string authorization="";//获取认证签名
request.Headers.Add("Authorization", authorization);//将认证签名添加到请求头部 Stream requestStream = request.GetRequestStream();//获取请求流 string postData = "nickName=打游戏也要有梦想&hobby=coding";//添加请求数据
ASCIIEncoding encoding = new ASCIIEncoding ();
byte[] byte1 = encoding.GetBytes (postData);
request.ContentType = "application/x-www-form-urlencoded";//请求编码方式
request.ContentLength = byte1.Length;//请求数据长度 requestStream.Write (byte1, 0, byte1.Length);//给请求流中添加请求数据
requestStream.Close();//关闭请求流 //响应
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();//获取响应流
StreamReader readStream = new StreamReader (responseStream, Encoding.UTF8);//读取响应流
string responseText=readStream.ReadToEnd();//响应信息
response.Close ();
readStream.Close ();

三、流的概念

http协议传输的数据其实就是通过流来传输的。流这东西,有数据流、文件流、读写流等,的确很是抽象,不知道到底是个什么东西,搞了半天,发现被这个高大上的名字给忽悠了。

所谓的流呢,其实就是字节序列,就是字节数组。搞后端的应该都知道,需要将返回的对象进行序列化后再传输到前端。其中的序列化,便是将对象转为字节序列(流),来进行传输。这么说吧,http传输的数据都是通过流来传输的。

那大家可能会有个问题,http协议中是怎么上传下载文件的,通过类HttpWebRequest,我们得到一个对象,接下来我们得到请求流,然后把文件添加到这个请求流里,便可以了;同理,下载文件也是如此,得到响应流,然后将流写入到一个新建的文件流便可以了。

//通过http上传文件,只需在请求流中写入需要上传的文件    fileStream为需要上传的文件转为流的形式
Stream requestStream = request.GetRequestStream();//请求流
//上传文件
byte[] buffer = new byte[64 * 1024];//设置缓存区大小,据说64KB最好(只是据说,没有亲测)
int read = fileStream.Read(buffer, 0, buffer.Length);
while (read > 0)
{
requestStream.Write(buffer, 0, red);//在请求流中继续写入文件流
read = fileStream.Read(buffer, 0, buffer.Length);
}
//关闭流
fileStream.Close();
requestStream.Close();
//通过http下载文件,只需将响应流中写入到新建的文件流中
Stream responseStream = response.GetResponseStream();//获取响应流 string fileName="";//新建的文件名,包含路径名称和文件名以及后缀
FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);//创建文件流
byte[] buffer = new byte[64 * 1024];//设置缓存区大小,据说64KB最好(只是据说,没有亲测)
int totalSize = 0;//文件总大小
int size = responseStream.Read(buffer, 0, buffer.Length);
while (size > 0)
{
totalSize += size;
fileStream.Write(buffer, 0, size);//将响应流中写入到新建的文件流中
size = responseStream.Read(buffer, 0, buffer.Length);
}
fileStream.Close();
responseStream.Close();

四、认证签名

关于签名的,肯定会涉及到一些加密算法,base64,sha1,md5等这些算法,这些算法并不需要我们去掌握,.NET已经提供了相应的API,只需会调用即可,没必要去深究到底是怎么实现的。

使用其他公司提供的接口服务,都会有相应的公钥和私钥,按照官网文档来生成相应的认证签名就可以了。然后将认证签名添加到请求头部里,便可以访问其他公司提供的接口服务了。

一般生成签名的接口需要在自己的服务端自己写一个,得到的签名与其他公司服务端生成的签名进行比对。

五、最后

最后祝大家国庆快乐,玩得开心,国庆Happy!!!



在搞OSS对象存储中发现了自身的一些不足的更多相关文章

  1. 22.Java面试学习平台-整合OSS对象存储

    SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...

  2. iOS使用阿里云OSS对象存储 (SDK 2.1.1)

    最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所 ...

  3. 架构师小跟班:教你从零开始申请和配置七牛云免费OSS对象存储(不能再详细了)

    背景 之前为了练习Linux系统使用,在阿里云上低价买了一台服务器(网站首页有活动链接,传送门),心里想反正闲着也是闲着,就放了一个网站上去.现在随着数据越来越多,服务器空间越来越吃紧,我就考虑使用七 ...

  4. Java使用阿里云OSS对象存储上传图片

    原 Java使用阿里云OSS对象存储上传图片 2017年03月27日 10:47:28 陌上桑花开花 阅读数 26804更多 分类专栏: 工作案例总结 版权声明:本文为博主原创文章,遵循CC 4.0 ...

  5. SpringBoot整合阿里云OSS对象存储实现文件上传

    1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...

  6. OSS对象存储

    OSS对象存储 当项目以微服务搭建时,多个服务往往运行在多台服务器上,此时针对存储文件的获取和保存,难以确定具体的位置: 针对这个问题,一般有两个办法: 搭建独立的文件存储服务器,用 FastDFS等 ...

  7. C# .net Ueditor实现图片上传到阿里云OSS 对象存储

    在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...

  8. 阿里云OSS对象存储 简单上传文件

    不得不说阿里云的命名比较让人摸不着头脑,开始以为是文件存储NAS,弄了半天什么文件系统,挂载点的搞不明白.后来才搞清楚原来 对象存储OSS才是我需要的. 其中EndPoint就是画红框的部分,但是要加 ...

  9. 阿里云Oss对象存储

    将文件保存到阿里云上. 1.添加对象存储OSS空间 (新建Bucket) 可以在阿里云后台对象存储里面添加,也可以通过api添加.添加之后设置权限. skd使用. 1安装 Aliyun.OSS.SDK ...

随机推荐

  1. 8点了解Java服务端单元测试

    一. 前言 单元测试并不只是为了验证你当前所写的代码是否存在问题,更为重要的是它可以很大程度的保障日后因业务变更.修复Bug或重构等引起的代码变更而导致(或新增)的风险. 同时将单元测试提前到编写正式 ...

  2. 【Go语言入门系列】(八)Go语言是不是面向对象语言?

    [Go语言入门系列]前面的文章: [Go语言入门系列](五)指针和结构体的使用 [Go语言入门系列](六)再探函数 [Go语言入门系列](七)如何使用Go的方法? 1. Go是面向对象的语言吗? 在[ ...

  3. 几个Graphics函数

    1.Graphics.Blit:Copies source texture into destination render texture with a shader 声明: 1.public sta ...

  4. Codeforces Round #571 (Div. 2)-D. Vus the Cossack and Numbers

    Vus the Cossack has nn real numbers aiai. It is known that the sum of all numbers is equal to 00. He ...

  5. SpringSecurity中的Authentication信息与登录流程

    目录 Authentication 登录流程 一.与认证相关的UsernamePasswordAuthenticationFilter 获取用户名和密码 构造UsernamePasswordAuthe ...

  6. 手把手教你 在Pytorch框架上部署和测试 关键点人脸检测项目DBFace,成功实现人脸检测效果

    这期教向大家介绍仅仅 1.3M 的轻量级高精度的关键点人脸检测模型DBFace,并手把手教你如何在自己的电脑端进行部署和测试运行,运行时bug解决. 01. 前言 前段时间DBFace人脸检测库横空出 ...

  7. Template DB MySQL学习总结

    Zabbix 5.0下如何应用Template DB MySQL来监控MySQL数据库呢?下面简单整理一下如何配置.应用Zabbix下自带的模板Template DB MySQL.其实非常简单. Te ...

  8. BIO应用-RPC框架

    为什么要有RPC?  我们最开始开发的时候,一个应用一台机器,将所有功能都写在一起,比如说比较常见的电商场景. 随着我们业务的发展,我们需要提示性能了,我们会怎么做?将不同的业务功能放到线程里来实现异 ...

  9. Composer 包版本的范围指定(版本约束)

    1. 包版本范围指定(自动下载版本约束范围中的最新版) 名称 实例 说明 不指定版本 根据当前Path环境变量中的php版本下载最合适的最新版 确切的版本 6.0.1 指定下载的具体版本号 范围 &g ...

  10. 超详细!盘点Python中字符串的常用操作

    在Python中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a = 'abc' b= "abc" c = '''abc''' d = " ...