引入七牛云 js 上传

本贴最后更新于 2633 天前,其中的信息可能已经沧海桑田

云存储有很多种方式,这里介绍前端页面直接通过 js 上传的方式,应为这种方式页面友好,对浏览器压力也小

云存储也有很多好处:

1、释放服务器磁盘空间

2、减轻服务器磁盘 IO 压力

3、减轻服务器带宽压力

4、服务器故障无影响

遇到的坑:

1、bad uptoken

2、error:incorrect zone, please use up-z2.qiniu.com

3、怎样获取文件名

4、怎样设置上传路径

5、怎样获取外部链接

6、怎样获取上传进度

bad uptoken:

在官方文档里面,七牛要求服务器返回 uptoken 格式为

|

1

2

3

|

{

"uptoken"``: ``"0MLvWPnyya1WtPnXFy9KLyGHyFPNdZceomL..."

}

|

但是这很模糊,试了几次都提示 bad token,最终在 uploader 的 uptoken 里应该直接写入字符串格式,如果是服务器返回的的 uptoken 请去掉两端的双引号,否则报错

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

|

function getTokenMessage() {

var token;

$.ajax({

url:``"http://localhost:8080/LRVideo/appservice/basic/getJSUpToken"``,

async:``false``,

success:``function (data) {

token = data;

}

})

return token;

}

var token = getTokenMessage();

uptoken = token.substring(token.indexOf(``"\""``)+1,token.lastIndexOf(``"\""``));

|

error:incorrect zone, please use up-z2.qiniu.com:

七牛官方 js 默认上传地区为华东地区,如果不是华东的则需要修改官方 js

怎样获取文件名

|

1

2

3

4

5

6

7

8

|

'Key'``: ``function``(up, file) {

// 若想在前端对每个文件的key进行个性化处理,可以配置该函数

// 该配置必须要在unique_names: false,save_key: false时才生效

var Date = getNowFormatDate();

var fileName = file.name;

console.log(``"filename" + file.name);

return key

}

|

怎样设置上传路径:

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

|

function getNowFormatDate() {

var myDate = ``new Date();

var year = myDate.getFullYear();

var month = myDate.getMonth() + 1;

var day = myDate.getDate();

var hour = myDate.getHours();

var min = myDate.getMinutes();

var second = myDate.getSeconds();

if (month >= 0 && month <= 9) {

month = ``"0" + month;

}

if (day >= 0 && day <= 9) {

day = ``"0" + day;

}

if (hour >= 0 && hour <= 9) {

hour = ``"0" + hour;

}

if (min >= 0 && min <= 9) {

min = ``"0" + min;

}

if (second >= 0 && second <= 9) {

second = ``"0" + second;

}

var currentdate = year + ``"/" + month + ``"/" + day + ``"/" + hour + ``"/" + min + ``"/" + second;

return currentdate;

}

'Key'``: ``function``(up, file) {

// 若想在前端对每个文件的key进行个性化处理,可以配置该函数

// 该配置必须要在unique_names: false,save_key: false时才生效

var Date = getNowFormatDate();

var fileName = file.name;

var key = getNowFormatDate() + ``"/" + file.name;

// do something with key here

return key

}

|

怎样获取外部链接:

这里首先需要将 uploader 的 domain 设置一下:

|

1

|

domain: ``'http://onsoxm2o9.bkt.clouddn.com'``, // bucket域名,下载资源时用到,必需

|

请参照该存储空间的外链默认域名,可自行修改

|

1

2

3

4

5

6

7

8

9

10

11

12

13

|

'FileUploaded'``: ``function``(up, file, info) {

// 每个文件上传成功后,处理相关的事情

// 其中info是文件上传成功后,服务端返回的json,形式如:

// {

// "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",

// "key": "gogopher.jpg"

// }

// 查看简单反馈

var domain = up.getOption(``'domain'``);

var res = JSON.parse(info);

sourceLink = domain +``"/"``+ res.key; ``//获取上传成功后的文件的Url

console.log(``"sourceLink:" + sourceLink);

},

|

怎样获取上传进度:

|

1

2

3

4

5

6

|

'UploadProgress'``: ``function``(up, file) {

var progress = ``new FileProgress(file, ``'fsUploadProgress'``);

var chunk_size = plupload.parseSize(``this``.getOption(``'chunk_size'``));

progress.setProgress(file.percent + ``"%"``, file.speed, chunk_size);

console.log(``"Progress:" + file.percent + ``"%"``);

},

|

这里用到了 new FileProgress 函数,需要引入官方文档 demo 里的 ui.js 文件

QiniuUtils

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

|

package com.utils.qiniu;

import java.io.IOException;

import com.qiniu.common.QiniuException;

import com.qiniu.common.Zone;

import com.qiniu.http.Response;

import com.qiniu.storage.Configuration;

import com.qiniu.storage.UploadManager;

import com.qiniu.util.Auth;

import com.qiniu.util.StringMap;

/**

* 七牛上传工具

*

*/

public class QiniuUtils {

//设置好账号的ACCESS_KEY和SECRET_KEY

String ACCESS_KEY = ``"EybSUWG7TpxDnHze3FeYG5Dk9YzceUnITeAUIkQH"``;

String SECRET_KEY = ``"IcyUqBR2Jm5oAoeAkeMNN_hG4IRclDkRL0TMYGdv"``;

//要上传的空间

String bucketname = ``"cczb"``;

String bucketname2 = ``"cczb-video"``;

//密钥配置

Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);

///////////////////////指定上传的Zone的信息//////////////////

//第一种方式: 指定具体的要上传的zone

//注:该具体指定的方式和以下自动识别的方式选择其一即可

//要上传的空间(bucket)的存储区域为华东时

// Zone z = Zone.zone0();

//要上传的空间(bucket)的存储区域为华北时

// Zone z = Zone.zone1();

//要上传的空间(bucket)的存储区域为华南时

//Zone z = Zone.zone2();

//第二种方式: 自动识别要上传的空间(bucket)的存储区域是华东、华北、华南。

Zone z = Zone.autoZone();

Configuration c = ``new Configuration(z);

//创建上传对象

UploadManager uploadManager = ``new UploadManager(c);

//简单上传,使用默认策略,只需要设置上传的空间名就可以了

public String getUpToken() {

return auth.uploadToken(bucketname);

}

//js上传

//scope通过 bucket、key间接设置,deadline 通过 expires 间接设置

public String getJSUpToken() {

return auth.uploadToken(bucketname2);

}

public static void main(String[] args) {

StringMap policy = ``new StringMap().put(``"deadline"``, ``1491159381``).put(``"saveKey"``, ``"qiangge.jpg"``);

Auth auth = Auth.create(``"EybSUWG7TpxDnHze3FeYG5Dk9YzceUnITeAUIkQH"``, ``"IcyUqBR2Jm5oAoeAkeMNN_hG4IRclDkRL0TMYGdv"``);

System.err.println(auth.uploadToken(``"cczb-video:aaaaaaaa.jpg"``, ``"qiange2.jpg"``, ``3600``, policy));

}

/**

* 上传文件

* @author WangQiang 2017年2月10日 下午1:09:00

* @version 出彩V直播2.0

* @param FilePath 上传文件的真实路径

* @param key 上传到七牛后保存的文件名(可以包含路径),如 /test/test.png

* @return

*/

public boolean uploadFIle(String FilePath ,String key){

boolean flag = ``false``;

try {

//调用put方法上传

Response res = uploadManager.put(FilePath, key, getUpToken());

//上传成功

if``(res.statusCode == ``200``){

flag = ``true``;

System.out.println(``"七牛上传文件成功:" + res.bodyString());

}``else``{

flag = ``false``;

System.out.println(``"七牛上传文件失败(七牛原因或者七牛的配置原因):" + res.bodyString());

}

} ``catch (QiniuException e) {

Response r = e.response;

// 请求失败时打印的异常的信息

System.out.println(``"七牛上传文件失败(自己原因):" + r.toString());

try {

//响应的文本信息

System.out.println(r.bodyString());

} ``catch (QiniuException e1) {

//ignore

}

}

return flag;

}

//上传测试

public void uploadTest(String FilePath , String key) ``throws IOException {

try {

//调用put方法上传

Response res = uploadManager.put(FilePath, key, getUpToken());

//打印返回的信息

System.out.println(res.bodyString());

System.out.println(res.statusCode);

// System.out.println(res.toString());

if``(res.statusCode == ``200``){

System.out.println(``"上传成功"``);

}``else {

System.out.println(``"上传失败:" + res.bodyString());

}

} ``catch (QiniuException e) {

Response r = e.response;

// 请求失败时打印的异常的信息

System.out.println(r.toString());

try {

//响应的文本信息

System.out.println(r.bodyString());

} ``catch (QiniuException e1) {

//ignore

}

}

}

}

|

获取 uptoken

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

|

@RequestMapping``(value = ``"/uploadFile"``)

@ResponseBody

public Object uploadFile(HttpServletRequest request, HttpServletResponse response,

@RequestParam``(value = ``"file"``, required = ``false``) MultipartFile file) ``throws IOException {

// TODO 文件上传接口

String fileName = file.getOriginalFilename();

Map m = ``new HashMap();

BufferedOutputStream outputStream = ``null``;

try {

InputStream fileInputStream = file.getInputStream();

String datefolder = ``"/" + DateUtil.dateToString(``new Date(), ``"yyyy"``) + ``"/"

+ DateUtil.dateToString(``new Date(), ``"MM"``) + ``"/"

+ DateUtil.dateToString(``new Date(), ``"dd" + ``"/" + (Integer.parseInt(DateUtil.dateToString(``new Date(), ``"hh"``))+``0``) )

+ DateUtil.dateToString(``new Date(), ``"mm" + DateUtil.dateToString(``new Date(), ``"ss"``));``// 日期命名的文件夹

String webParentPath = ``new File(request.getSession().getServletContext().getRealPath(``"/"``)).getParent()

.replace(``"\\"``, ``"/"``);``// 当前WEB环境的上层目录

String realPath = webParentPath + ``"/gcrcsUploadFile" + datefolder;``// 文件上传到服务器的真实路径

File up = ``new File(realPath);

if (!up.exists()) {

up.mkdirs();

}

String newFileName = fileName;

String filePath = ``"/gcrcsUploadFile" + datefolder + ``"/" + newFileName;

outputStream = ``new BufferedOutputStream(``new FileOutputStream(``new File(realPath, newFileName)));

IOUtils.copy(fileInputStream, outputStream);

//这两个流一定要关闭,不然接下来上传到七牛上文件会缺失

fileInputStream.close();

outputStream.close();

logger.error(``"文件在服务器的绝对路径:"``+ ``new File(realPath, newFileName).toString());

logger.error(``"文件在服务器的相对路径:" + filePath);

// ++++++++上传文件到七牛 +++++++++

boolean flag = ``new QiniuUtils().uploadFIle( ``new File(realPath, newFileName).toString().replace(``"\\"``, ``"/"``) , filePath);

Map data = ``new HashMap();

// 保存附件

data.put(``"picUrl"``, filePath);

data.put(``"videoUrl"``, filePath);

m.put(``"status"``, ``0``);

m.put(``"msg"``, ``"上传成功"``);

m.put(``"data"``, data);

if``(flag){

logger.error(``"++++++++++ 上传文件" + filePath + ``"到七牛【成功】 ++++++++++"``);

//后期上传到云 成功 后把上传到本地的删除

}``else``{

m.put(``"status"``, ``1``);

m.put(``"msg"``, ``"上传失败"``);

m.put(``"data"``, data);

logger.error(``"++++++++++ 上传文件到七牛【失败】 ++++++++++"``);

}

} ``catch (Exception e) {

logger.error(``"error on deploy process, because of file input stream"``, e);

} ``finally {

outputStream.flush();

outputStream.close();

}

return m;

}

/**

* 七牛云上传获得uptoken

* @author wanningxi

* @return

*/

@ResponseBody

@RequestMapping``(``"/getJSUpToken"``)

public Object getJSUpToken() {

logger.error(``"获取七牛UpToken"``);

Map map = ``new HashMap();

try {

return new QiniuUtils().getJSUpToken();

} ``catch (Exception e) {

e.printStackTrace();

logger.error(``"Exception : " + e);

return ResultMapUtils.systemError(e);

}

}

|

qiniuTest.jsp

|

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

|

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">`

<``html``>

<``head``>

<``meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<``title``>七牛云测试

<%-- 引入qiniu扩展 --%>

<``script src="${pageContext.request.contextPath}/resources/js/qiniu/jquery.min.js" type="text/javascript" charset="utf-8">

<%-- <``script src="${pageContext.request.contextPath}/resources/js/qiniu/moxie.js" type="text/javascript" charset="utf-8"> --%>

<%-- <``script src="${pageContext.request.contextPath}/resources/js/qiniu/plupload.full.min.js" type="text/javascript" charset="utf-8"> --%>

<%-- <``script src="${pageContext.request.contextPath}/resources/js/qiniu/qiniu.js" type="text/javascript" charset="utf-8"> --%>

<``script type="text/javascript" src="https://cdn.staticfile.org/plupload/2.1.8/plupload.full.min.js">

<``script type="text/javascript" src="https://cdn.staticfile.org/plupload/2.1.9/moxie.min.js">

<``script type="text/javascript" src="https://cdn.staticfile.org/qiniu-js-sdk/1.0.14-beta/qiniu.min.js">

<``script src="${pageContext.request.contextPath}/resources/js/qiniu/ui.js" type="text/javascript" charset="utf-8">

``

<``body``>

<``p class="tip1">本demo实现的图片预览功能需要浏览器支持data URL,IE8+以及其他标准浏览器都是支持的

<``div id="container">

<``a class="btn btn-default btn-lg " id="pickfiles" style="width:160px" href="#" >

<``i class="glyphicon glyphicon-plus">

<``span``>选择文件

``

``

``

``

<``script type="text/javascript">

var time = getNowFormatDate();

var token = getTokenMessage();

uptoken = token.substring(token.indexOf("\"")+1,token.lastIndexOf("\""));

var uploader = Qiniu.uploader({

runtimes: 'html5,flash,html4', // 上传模式,依次退化

browse_button: 'pickfiles', // 上传选择的点选按钮,必需

// 在初始化时,uptoken,uptoken_url,uptoken_func三个参数中必须有一个被设置

// 切如果提供了多个,其优先级为uptoken > uptoken_url > uptoken_func

// 其中uptoken是直接提供上传凭证,uptoken_url是提供了获取上传凭证的地址,如果需要定制获取uptoken的过程则可以设置uptoken_func

uptoken : uptoken, // uptoken是上传凭证,由其他程序生成

// uptoken_url: 'http://localhost:8080/LRVideo/appservice/basic/getJSUpToken', // Ajax请求uptoken的Url,强烈建议设置(服务端提供)

// uptoken_func: function(file){ // 在需要获取uptoken时,该方法会被调用

// // do something

// return uptoken;

// },

get_new_uptoken: false, // 设置上传文件的时候是否每次都重新获取新的uptoken

// downtoken_url: '/downtoken',

// Ajax请求downToken的Url,私有空间时使用,JS-SDK将向该地址POST文件的key和domain,服务端返回的JSON必须包含url字段,url值为该文件的下载地址

// unique_names: true, // 默认false,key为文件名。若开启该选项,JS-SDK会为每个文件自动生成key(文件名)

// save_key: true, // 默认false。若在服务端生成uptoken的上传策略中指定了sava_key,则开启,SDK在前端将不对key进行任何处理

domain: 'http://onsoxm2o9.bkt.clouddn.com', // bucket域名,下载资源时用到,必需

container: 'container', // 上传区域DOM ID,默认是browser_button的父元素

max_file_size: '100000mb', // 最大文件体积限制

flash_swf_url: 'path/of/plupload/Moxie.swf', //引入flash,相对路径

max_retries: 3, // 上传失败最大重试次数

dragdrop: true, // 开启可拖曳上传

drop_element: 'container', // 拖曳上传区域元素的ID,拖曳文件或文件夹后可触发上传

chunk_size: '0mb', // 分块上传时,每块的体积

auto_start: true, // 选择文件后自动上传,若关闭需要自己绑定事件触发上传

//x_vars : {

// 查看自定义变量

// 'time' : function(up,file) {

// var time = (new Date()).getTime();

// do something with 'time'

// return time;

// },

// 'size' : function(up,file) {

// var size = file.size;

// do something with 'size'

// return size;

// }

//},

init: {

'FilesAdded': function(up, files) {

plupload.each(files, function(file) {

// 文件添加进队列后,处理相关的事情

});

},

'BeforeUpload': function(up, file) {

// 每个文件上传前,处理相关的事情

},

'UploadProgress': function(up, file) {

var progress = new FileProgress(file, 'fsUploadProgress');

var chunk_size = plupload.parseSize(this.getOption('chunk_size'));

progress.setProgress(file.percent + "%", file.speed, chunk_size);

console.log("Progress:" + file.percent + "%");

},

'FileUploaded': function(up, file, info) {

// 每个文件上传成功后,处理相关的事情

// 其中info是文件上传成功后,服务端返回的json,形式如:

// {

// "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",

// "key": "gogopher.jpg"

// }

// 查看简单反馈

var domain = up.getOption('domain');

var res = JSON.parse(info);

sourceLink = domain +"/"+ res.key; //获取上传成功后的文件的Url

console.log("sourceLink:" + sourceLink);

},

'Error': function(up, err, errTip) {

//上传出错时,处理相关的事情

},

'UploadComplete': function() {

//队列文件处理完毕后,处理相关的事情

},

'Key': function(up, file) {

// 若想在前端对每个文件的key进行个性化处理,可以配置该函数

// 该配置必须要在unique_names: false,save_key: false时才生效

var Date = getNowFormatDate();

var fileName = file.name;

var key = getNowFormatDate() + "/" + file.name;

// do something with key here

return key

}

}

});

// domain为七牛空间对应的域名,选择某个空间后,可通过 空间设置->基本设置->域名设置 查看获取

// uploader为一个plupload对象,继承了所有plupload的方法

function getTokenMessage() {

var token;

$.ajax({

url:"http://localhost:8080/LRVideo/appservice/basic/getJSUpToken",

async:false,

success:function (data) {

token = data;

}

})

return token;

}

function getNowFormatDate() {

var myDate = new Date();

var year = myDate.getFullYear();

var month = myDate.getMonth() + 1;

var day = myDate.getDate();

var hour = myDate.getHours();

var min = myDate.getMinutes();

var second = myDate.getSeconds();

if (month >= 0 && month <= 9) {

month = "0" + month;

}

if (day >= 0 && day <= 9) {

day = "0" + day;

}

if (hour >= 0 && hour <= 9) {

hour = "0" + hour;

}

if (min >= 0 && min <= 9) {

min = "0" + min;

}

if (second >= 0 && second <= 9) {

second = "0" + second;

}

var currentdate = year + "/" + month + "/" + day + "/" + hour + "/" + min + "/" + second;

return currentdate;

}

``

|

  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    713 引用 • 1174 回帖 • 119 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 288 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 610 关注
  • 创业

    你比 99% 的人都优秀么?

    83 引用 • 1398 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 24 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 506 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    332 引用 • 619 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 429 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 711 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 11 关注
  • OnlyOffice
    4 引用 • 16 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 483 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    379 引用 • 1221 回帖 • 589 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 455 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 2 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 148 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 192 关注
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 510 回帖
  • 反馈

    Communication channel for makers and users.

    124 引用 • 907 回帖 • 209 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 18 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    86 引用 • 896 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 31 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖 • 1 关注