在搞OSS对象存储中发现了自身的一些不足
最近在搞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对象存储中发现了自身的一些不足的更多相关文章
- 22.Java面试学习平台-整合OSS对象存储
SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...
- iOS使用阿里云OSS对象存储 (SDK 2.1.1)
最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所 ...
- 架构师小跟班:教你从零开始申请和配置七牛云免费OSS对象存储(不能再详细了)
背景 之前为了练习Linux系统使用,在阿里云上低价买了一台服务器(网站首页有活动链接,传送门),心里想反正闲着也是闲着,就放了一个网站上去.现在随着数据越来越多,服务器空间越来越吃紧,我就考虑使用七 ...
- Java使用阿里云OSS对象存储上传图片
原 Java使用阿里云OSS对象存储上传图片 2017年03月27日 10:47:28 陌上桑花开花 阅读数 26804更多 分类专栏: 工作案例总结 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- SpringBoot整合阿里云OSS对象存储实现文件上传
1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...
- OSS对象存储
OSS对象存储 当项目以微服务搭建时,多个服务往往运行在多台服务器上,此时针对存储文件的获取和保存,难以确定具体的位置: 针对这个问题,一般有两个办法: 搭建独立的文件存储服务器,用 FastDFS等 ...
- C# .net Ueditor实现图片上传到阿里云OSS 对象存储
在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...
- 阿里云OSS对象存储 简单上传文件
不得不说阿里云的命名比较让人摸不着头脑,开始以为是文件存储NAS,弄了半天什么文件系统,挂载点的搞不明白.后来才搞清楚原来 对象存储OSS才是我需要的. 其中EndPoint就是画红框的部分,但是要加 ...
- 阿里云Oss对象存储
将文件保存到阿里云上. 1.添加对象存储OSS空间 (新建Bucket) 可以在阿里云后台对象存储里面添加,也可以通过api添加.添加之后设置权限. skd使用. 1安装 Aliyun.OSS.SDK ...
随机推荐
- 元素的生于死(python里元素获取与删除)
今天被个元素烦着了,找了下网上也没啥直接详细的方法 就总结了下今天找过的方法,分享些简单的方法 直接放干货 删除篇 要删除列表元素的首次出现,只需要list.remove >>> a ...
- 快速构建一个完整的Selenium框架
今天跟大家细讲如何构建一个完整的selenium框架,当你学会了这一篇你就也可以说自己会selenium自动化测试了. 1.新建项目,结构如图: 注意:整个项目除了最外层的是文件夹,其他的都是包(pa ...
- 23种设计模式 - 对象创建(FactoryMethod - AbstractFactory - Prototype - Builder)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象创建 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦 ...
- 【Spring注解驱动开发】二狗子让我给他讲讲@EnableAspectJAutoProxy注解
写在前面 最近,二狗子入职了新公司,新入职的那几天确实有点飘.不过慢慢的,他发现他身边的人各个身怀绝技啊,有Spring源码的贡献者,有Dubbo源码的贡献者,有MyBatis源码的贡献者,还有研究A ...
- Queries for Number of Palindromes(区间dp)
You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. There a ...
- 2019HNCPC C Distinct Substrings 后缀自动机
题意 给定一个长度为n字符串,字符集大小为m(1<=n,m<=1e6),求\(\bigoplus_{c = 1}^{m}\left(h(c) \cdot 3^c \bmod (10^9+7 ...
- 不支持原子性的 Redis 事务也叫事务吗?
文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 假设现在有这样一个业务,用户获取的某些数据来自第三方接口信息,为避免频繁请求第三方接口,我们往往会加一层缓存,缓存肯定要 ...
- Mybatis实例增删改查(二)
创建实体类: package com.test.mybatis.bean; public class Employee { private Integer id; private String las ...
- nginx模块化结构
NGINX是一个免费.开源.高性能.轻量级的HTTP和反向代理服务器,也是一个电子邮件(IMAP/POP3)代理服务器 特点: 占有内存少,并发能力强 Nginx的优点: 模块化.事件驱动.异步.非阻 ...
- hyperledger fabric 智能合约开发
开发步奏: 1.创建教育联盟 2.区块链服务平台自动生成通道id 3.区块链网络服务人员通过命令行在区块链网络中创建对应通道 4.创建相关教育组织 5.邀请相关组织加入联盟 6.区块链网络管理人员通过 ...