引入七牛云 js 上传

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

云存储有很多种方式,这里介绍前端页面直接通过 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 网页增加动态功能。

    729 引用 • 1327 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 355 关注
  • webpack

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

    41 引用 • 130 回帖 • 261 关注
  • CodeMirror
    1 引用 • 2 回帖 • 129 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22352 引用 • 89434 回帖 • 1 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 462 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 1 关注
  • 音乐

    你听到信仰的声音了么?

    60 引用 • 511 回帖
  • 小薇

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

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

    34 引用 • 467 回帖 • 742 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    123 引用 • 74 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 385 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 629 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 3 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 2 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 1 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 530 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    944 引用 • 943 回帖
  • 旅游

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

    90 引用 • 899 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    166 引用 • 595 回帖 • 1 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 629 关注