1、介绍

  最近开发了一个项目,其中需要一个上传图片到阿里云的 oss 上面,就是上传图片到阿里云的 oss 上面。

  因为之前开发过 vue 的阿里云 oss 上传,所以直接复制粘 vue 的组件。

  因为我做的是 react 的项目,所以需要稍微修改。

  介于以后会经常用到,所以决定将它封装成组件,并且添加到 npm 包里面。

  xl_alioss_vue  :  这个是 vue 的 NPM 包

  xl_alioss_react : 这个是 react 的 NPM 包

2、项目的安装和预览

  xl_alioss_vue 的安装和应用

  安装:

yarn add xl_alioss_vue

  

  使用:

<template>
<FileUpload url="http://127.0.0.1:8081/common/upload/alioss/vue"
v-on:upLoadImgEnd="upLoadImgEnd"
v-on:upload="upload" >
<img v-if="imgUrl" :src="imgUrl" alt="">
<p v-if="!imgUrl">点击上传</p>
</FileUpload>
</template>
<script>
 // 引入 xl_alioss_vue
import FileUpload from 'xl_alioss_vue'
export default {
components: {
FileUpload
},
data() {
return {
imgUrl:''
}
},
methods:{
upLoadImgEnd(data){
this.imgUrl = data
},
upload(data,file,startLoad){
upload(Object.assign({},data,{file}))
}
},
created() { },
}
</script>

  

  这里可以看到 xl_alioss_vue 插件有三个属性:

  • url :这个url 是请求一些 alioss 认证的信息的。( 由开发后端提供,后面将alioss 时候,介绍下 ) 

  • upLoadImgEnd(data)  上传结束后函数,data 为返回的图片 url

  • upload (data,file,startLoad)   这里如果没有的这个属性的话,会直接上传,不需要startLoad

    • data : 是后端返回的 alioss 的认证信息

    • file :  上传文件

    • startLoad : 开始上传函数

  这里是上传时候数据结构。

  所有在这里添加了一个数据处理的函数 upload 进行中转,就是为了把数据处理为一下格式

data = {
accessid,
policy,
signature,
dir,
file,
}

 

   如果这里没有 upload 属性将不会去特意处理后端返回的 alioss 信息。

 直接去传入后端返回的 alioss 数据信息进行图片上传

 可以能会出现数据结构不正确而报错。

  预览效果:

  

    

  xl_alioss_react 的安装和应用

  安装:

yarn add xl_alioss_react

  

  使用:

import React from 'react';
import FileUpload from 'xl_alioss_react' export default class Main extends React.Component {
state = {
imgUlr:''
}
render() {
return (
<div style={{padding:30,fontSize:30}}>
<FileUpload
url='http://127.0.0.1:8088/common/upload/alioss/vue'
uploadEnd={(data) => {
this.setState({
imgUlr:data
})
}}
upload={(data, file, load) => {
load(Object.assign({}, data, {file}))
}}
>
上传
</FileUpload>
<div>
{this.state.imgUlr?
<img src={this.state.imgUlr} alt=""/>:''}
</div>
</div>
)
}
}

  

  这里的三个属性和 vue 组件是相同的,所以不做多的解释。

  预览效果:

  开发组件需要的知识:

  1、阿里云 oss 上传方法

  2、vue 和 react 的相关知识

3、阿里云 oss 对象存储  

  介绍

  阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。

  您可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过 Web 控制台对数据进行简单的管理。

  OSS 适合存放任意类型的文件,适合各种网站、开发企业及开发者使用

  我们可以把我们的静态资源存放在上面。

  并且 oss 有各种优势:

  方便、快捷的使用方式

  强大、灵活的安全机制

  丰富、强大的增值服务

  具体了解,请求浏览阿里云对象存储 : 对象存储

  上传图片相关知识介绍

  

  这里我们引用到的是阿里云 oss 的 web 端上传

  关于前端上传阿里云一共提供了四种方法:

  web 端直传

  Javascript 客户端签名直传

  服务器签名后直传

  服务器签名直传设置回调上传

  如果想了解更多的知识,可以自己浏览相关文章。

  本文章的组件都是基于 服务器签名后直传 的。

  服务器签名直传

  原理介绍:

  服务端签名后直传的逻辑图如下:

  流程如下:

  1. 用户发送上传Policy请求到应用服务器。

  2. 应用服务器返回上传Policy和签名给用户。

  3. 用户使用Plupload直接上传数据到OSS。

  因为我们是大前端,所以后端的我就不解释了。。

  后端的老板可以看案例,非常齐全

  在这里着重介绍一下后端返回的 Policy 信息

  返回的结构:

{
  accessid // 阿里云分配的 Access Key Id
  policy // 生产的认证信息
  signature // 计算处理的签名
}

  上面的数据是直传 oss 所需要的数据

  如下:

let curDate = new FormData()
const key = options.dir + new Date().getTime() + '_' + options.file.name
curDate.append("OSSAccessKeyId", options.accessid);
curDate.append("policy", options.policy);
curDate.append("Signature", options.signature);
curDate.append("key", key);
curDate.append("success_action_status", '200');
curDate.append('file', file)

  

  这是直传的时候需要的数据。

  阿里云 oss 相关的知识已经介绍完成。。

4、node 作为服务端生产 Policy

  预备知识:

  1、express  后端基于 node 的应用开发框架

  2、node - crypto  用于加密解密模块

  3、阿里云加密生产 Policy 的知识 ( 这个没有找到文档,我是通过 PHP 案例修改的 )

  开发及其详解

router.get('/alioss/vue', (req, res) => {
let time = new Date(new Date().getTime() + 30000).formatDate('yyyy-MM-ddThh:mm:ssZ')
let policyObj = JSON.stringify({
"expiration": time,
"conditions": [
// 文件大小
["content-length-range", 0, 1048576000], ["starts-with", "$key", dir]
]
})
let policy = new Buffer(policyObj).toString('base64');
let signature = crypto.createHmac('sha1', 'OEwkBpLfdoHCAbAoWXt5XFe4tiUwhX').update(policy).digest().toString('base64');
res.end(JSON.stringify(
{
accessid: 'LTAIhf0LGhtEKTe8',
host:aliossHost,
dir,
policy,
expire:time,
signature
}
));
})

  

  详解:

let time = new Date(new Date().getTime() + 30000).formatDate('yyyy-MM-ddThh:mm:ssZ')

  生成一个过期时间

  这里是用当前时间加上 30 秒,提供给 Policy 对象

let policyObj = JSON.stringify({
"expiration": time,
"conditions": [
// 文件大小
["content-length-range", 0, 1048576000], ["starts-with", "$key", dir]
]
})

  定义 Policy 对象

  expiration : 这个是过期时间

  conditions : 一些规则数组

  content-length-range : 文件的长度范围

  starts-with :  只能上传某一个目录,这里是 dir 目录

let policy = new Buffer(policyObj).toString('base64');

  将 Ploicy 对象转为 base64 字符串。

    let signature = crypto.createHmac('sha1', key ).update(policy).digest().toString('base64');

  这里由 policy 对象的 base64 的字符串 、阿里云oss 的 key 通过 crypto 进行 sha 加密,

  返回 base64 的加签字符串

res.end(JSON.stringify(
{
accessid: id,
host:aliossHost,
dir,
policy,
expire:time,
signature
}
));

  

  accessid : 阿里云提供的 AccessId

  host : 上传到阿里云到地址

  dir :要上传到目录

  policy : oss 需要到凭证

  expire : 过期时间

  signature : 加签到字符串  

  node 的加密模块基本完成,这里可以直接引用。

5、前端代码开发

  这里只会介绍 vue 的组件开发。

  组件的模版:

  介绍:

  <slot></slot> : 这里有一个 slot 插槽,是用来存放自组件的。这样我们点击该组件包裹的元素都是可以触发上传的

  input : 适用于来上传的 form 表单

  js 模块介绍

  介绍:

  uloadImg : 很显然这里的这个方法是触发上传动作的

  doUpload : 这里是和后端交互,获取 oss 上传的凭证

  uploadOss : 这里是得到 oss 上传凭证后,上传到 oss 上面。

  大概介绍了下...

  具体代码源码: vue/axios实现阿里云oss的图片上传组件

 小结巴巴博客园 https://www.cnblogs.com/jiebba/p/9597995.html

XiaoLong's Blog

阿里oss上传图片react组件alioss-react,vue组件alioss-vue (不用我先收藏着,后端看下前端处理方法)的更多相关文章

  1. vue系列---Vue组件化的实现原理(八)

    _ 阅读目录 一. 什么是Vue组件? 如何注册组件? 1.1 全局注册组件 1.2 局部注册组件 二:组件之间数据如何传递的呢? 1) props 2) $emit 3) 使用$ref实现通信 4) ...

  2. vue用阿里云oss上传图片使用分片上传只能上传100kb以内的解决办法

    首先,vue和阿里云oss上传图片结合参考了 这位朋友的 https://www.jianshu.com/p/645f63745abd 文章,成功的解决了我用阿里云oss上传图片前的一头雾水. 该大神 ...

  3. ElementUI(vue UI库)、iView(vue UI库)、ant design(react UI库)中组件的区别

    ElementUI(vue UI库).iView(vue UI库).ant design(react UI库)中组件的区别: 事项 ElementUI iView ant design 全局加载进度条 ...

  4. Web应用界面好帮手!DevExtreme React和Vue组件全新功能上线

    行业领先的.NET界面控件DevExpress 正式发布了v19.1版本,本文将主要介绍DevExtremev19.1中React组件响应式应用程序布局模板及CLI工具.本地React图表,和Vue组 ...

  5. react第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能)

    第十一单元(受控组件和非受控组件-实现类似于vue双向绑定的功能) #课程目标 理解因为react的单向数据流 理解表单组件会因为react数据流变的不好维护 理解受控组件与非受控组件的实质区别 理解 ...

  6. c#版阿里云oss上传——基于layui、pupload的oss 后端web端直传的vue组件

    废话前言 去年,做项目用到oss上传,度娘上逛了一圈写了个前后端代码结合的c#版oss上传. 今年又要用到oss上传时发现很难复用,复用改动的范围太大,显然这个轮子不合格.于是想了下,花了一天的时间( ...

  7. React的JSX语法及组件

    最近一个同事很急没有做任何交接就请了陪产假,然后我来维护.说实在的我一开始是一脸懵逼的.因为MV*项目里用的最多的还是Vue:React听说也了解过,但毕竟不熟... 不过不管如何这也是工作:同事也恭 ...

  8. React(17)异步组件

    26.异步组件当在React里使用异步组件时,核心知识是两个: webpack 如何异步加载其他模块:通过 require(['xxx'], function(module){})来实现:React ...

  9. React后台管理系统-添加商品组件

    引入了CategorySelector 二级联动组件.FileUploader图片上传组件和RichEditor富文本编辑组件 import React from 'react'; import MU ...

随机推荐

  1. iTOP-iMX6开发板Android系统下LVDS和HDMI双屏异显方法

    迅为iMX6 开发板 android 系统下 LVDS 和 HDMI 双屏异显的使用过程. 注意,iTOP-iMX6 开发板的 android 系统想要实现对 LVDS 和 HDMI 双屏异显功能的支 ...

  2. mysql 表锁死的问题

    select * from information_schema.innodb_trx; kill 34863;kill 34856;kill 34860;kill 34859;kill 34845; ...

  3. easyui实现增删改查

    陈旧的开发模式 美工(ui工程师:出一个项目模型) java工程师:将原有的html转成jsp,动态展示数据 缺点: 客户需要调节前端的展示效果 解决:由美工去重新排版,重新选色. 前后端分离: 前端 ...

  4. Microsoft Windows Server 部署

    Microsoft Windows Server 部署 多重引导 计算机可以被设置多重引导,即在一台计算机上安装多个操作系统..在安装多重引导的操作系统时,还要注意版本的类型,一般应先安装版本低的,再 ...

  5. 微信小程序入口场景的问题整理与相关解决方案

    前言 最近一段时间都在做小程序. 虽然是第二次开发小程序,但是上次做小程序已经是一年前的事了,所以最终还是被坑得死去活来. 这次是从零开始开发一个小程序,其实除了一些莫名其妙的兼容性问题,大多数坑点都 ...

  6. java文件上传,自动判断文件类型

    public enum FileType { /** * JEPG. */ JPEG("FFD8FF"), /** * PNG. */ PNG("89504E47&quo ...

  7. 利用JS动态生成隔行换色HTML表格

    用JS生成动态生成表格,行.列由用户输入,并使表格隔行换色 方法一. 代码: <!DOCTYPE html> 2 <html> 3 <head> 4 <tit ...

  8. CF993E Nikita and Order Statistics 多项式卷积 快速傅里叶变换

    题意: 给你一个数组a1~an,对于k=0~n,求出有多少个数组上的区间满足:区间内恰好有k个数比x小.x为一个给定的数.n<=10^5.值域没有意义. 分析: 大神们都说这道题是一个套路题,真 ...

  9. python基础知识07-函数作用域和匿名函数

    1.匿名函数 list(filter(lamda a:a>3,[1,2,3,4,5])) 一般和过滤器一起使用 2.函数的作用域 a = 123 def test(): a = 666 a = ...

  10. Crossed Ladders 求街道宽度 (二分法)

    Description A narrow street is lined with tall buildings. An x foot long ladder is rested at the bas ...