打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
文件操作 · 知晓云平台开发文档 2.0

文件操作

实例化一个 BaaS.File 对象,以下操作都是在该对象上进行操作,如下进行实例化:

let MyFile = new wx.BaaS.File()

let MyFile = new qq.BaaS.File()

let MyFile = new BaaS.File()

let MyFile = new my.BaaS.File()

let MyFile = new swan.BaaS.File()

文件上传

MyFile.upload(fileParams, metaData)

fileParams 参数说明(必须)

参数类型必填说明
fileParams.filePathStringY本地资源路径
fileParams.fileObjStringY文件对象(在 Web 端上传时提供该参数)
fileParams.fileTypeStringY文件类型,image / video / audio(在支付宝端上传时提供该参数)

metaData 参数说明(可选)

参数类型必填说明
metaData.categoryIDStringN要上传的文件分类 ID
metaData.categoryNameStringN要上传的文件分类名

请勿同时填写 categoryID 和 categoryName,默认只使用 categoryID

返回参数说明

res.data:

参数类型说明
statusString成功返回 'ok'
pathString上传后的文件地址
fileObject包含文件详细信息,详见以下

file 参数说明:

参数类型说明
pathString上传后的文件地址 (v2.2.0 版本新增)
cdn_pathString文件在 cdn 上的路径
created_atString文件上传时间
idObject文件 ID
mime_typeString文件媒体类型
nameString文件名
sizeNumber以字节为单位

示例代码

wx.chooseImage({ success: function(res) { let MyFile = new wx.BaaS.File() let fileParams = {filePath: res.tempFilePaths[0]} let metaData = {categoryName: 'SDK'} MyFile.upload(fileParams, metaData).then(res => { // 上传成功 let data = res.data // res.data 为 Object 类型 }, err => { // HError 对象 }) }})

监听上传进度变化事件和中断上传任务 (仅限微信小程序)

在 1.1.2 版本的基础上,1.8.0 版本中增加了对 UploadTask 的支持, upload API 返回的 Promise 对象上增加了 onProgressUpdateabort 方法,使文件上传增加了以下两个特性:

  • 监听上传进度:onProgressUpdate(callback)
  • 中断上传任务:abort()

callback 接收一个对象类型的参数,其结构如下:

参数类型说明
progressNumber上传进度百分比
totalBytesSentNumber已经上传的数据长度,单位 Bytes
totalBytesExpectedToSendNumber预期需要上传的数据总长度,单位 Bytes

示例代码

wx.chooseImage({  success: function(res) {    let MyFile = new wx.BaaS.File()    let fileParams = {filePath: res.tempFilePaths[0]}    let metaData = {categoryName: 'SDK'}    // upload API 返回一个 Promise,1.8.0 后返回值增加了 onProgressUpdate 和 abort 方法    let uploadTask =  MyFile.upload(fileParams, metaData)    // 文件成功上传的回调    uploadTask.then(res=>{    })    // 监听上传进度    uploadTask.onProgressUpdate(e => {      console.log(e)    })    // 600 毫秒后中断上传    setTimeout(()=> uploadTask.abort(), 600)  }})

onProgressUpdate 接收参数示例

{ 'progress':80, 'totalBytesSent':1507328, 'totalBytesExpectedToSend':1883803}
<input type='file' id='file'>
var f = document.getElementById('file')f.addEventListener('change', function(e) { let File = new BaaS.File() let fileParams = {fileObj: e.target.files[0]} File.upload(fileParams).then(res => { console.log(res) }, err => { // HError })})
my.chooseImage({  success: function(res) {    let MyFile = new wx.BaaS.File()    let fileParams = {      filePath: res.apFilePaths[0],      fileType: 'image',    }    let metaData = {categoryName: 'SDK'}    MyFile.upload(fileParams, metaData).then(res => {      // 上传成功      let data = res.data  // res.data 为 Object 类型    }, err => {      // HError 对象    })  }})

HError 对象结构请参考错误码和 HError 对象

file 字段可用于含有 file 类型的数据表的数据操作,详细见 新增数据项

获取文件详情

MyFile.get(fileID)

参数说明

参数类型必填说明
fileIDStringY文件 id

返回参数说明

res.data:

参数类型说明
categoryObject包含文件分类信息,详见以下
created_atString文件上传时间
idObject文件 ID
mime_typeString文件媒体类型
nameString文件名
pathString文件在 cdn 上的路径
cdn_pathStringcdn 中保存的路径 (v2.2.0 新增)
sizeNumber以字节为单位

category 参数说明:

参数类型说明
idString分类 ID
nameString分类名

示例代码

let MyFile = new wx.BaaS.File()MyFile.get('5a2fe93308443e313a428c4f').then((res) => { // success}, err => { // HError 对象})
let MyFile = new qq.BaaS.File()MyFile.get('5a2fe93308443e313a428c4f').then((res) => {  // success}, err => {  // HError 对象})
let MyFile = new BaaS.File()MyFile.get('5a2fe93308443e313a428c4f').then((res) => { // success}, err => { // HError 对象})
let MyFile = new my.BaaS.File()MyFile.get('5a2fe93308443e313a428c4f').then((res) => {  // success}, err => {  // HError 对象})
let MyFile = new swan.BaaS.File()MyFile.get('5a2fe93308443e313a428c4f').then((res) => { // success}, err => { // HError 对象})

HError 对象结构请参考错误码和 HError 对象

返回示例

{  'category': {    'id': '5a2fe91508443e3123dbe1cb',    'name': '科技'  },  'created_at': 1507822469,  'id': '5a2fe93308443e313a428c4f',  'mime_type': 'image/png',  'name': 'sdk-test-minapp2.png',  'path': 'https://cloud-minapp-7894.cloud.ifanrusercontent.com/1eOledhCbvjgaCSE.png',  'size': 3879}

删除文件

MyFile.delete(fileID)

参数说明

参数类型必填说明
fileIDString or String ArrayY文件 id (可为数组)

示例代码

let MyFile = new wx.BaaS.File()MyFile.delete('5a2fe93308443e313a428c4f').then()MyFile.delete(['5a2fe93308443e313a428c4c', '5a2fe93308443e313a428c4d']).then()
let MyFile = new qq.BaaS.File()MyFile.delete('5a2fe93308443e313a428c4f').then()MyFile.delete(['5a2fe93308443e313a428c4c', '5a2fe93308443e313a428c4d']).then()
let MyFile = new BaaS.File()MyFile.delete('5a2fe93308443e313a428c4f').then()MyFile.delete(['5a2fe93308443e313a428c4c', '5a2fe93308443e313a428c4d']).then()
let MyFile = new my.BaaS.File()MyFile.delete('5a2fe93308443e313a428c4f').then()MyFile.delete(['5a2fe93308443e313a428c4c', '5a2fe93308443e313a428c4d']).then()
let MyFile = new swan.BaaS.File()MyFile.delete('5a2fe93308443e313a428c4f').then()MyFile.delete(['5a2fe93308443e313a428c4c', '5a2fe93308443e313a428c4d']).then()

删除单个文件,如果权限不足,会返回 401;删除多个文件,如果权限不足,则直接跳过该文件

获取符合条件的文件总数

BaaS.File#count()

SDK v3.0 新增

文件查询与数据表查询方法一致,但只支持以下指定字段的筛选

支持字段类型说明
idString文件 id
nameString文件名
sizeNumber文件大小,以字节为单位
category_idString文件分类 id
category_nameString文件分类名
created_atInteger创建时间 (格式为 unix 时间戳)
let MyFile = new wx.BaaS.File()let query = new wx.BaaS.Query()query.compare('category_name', '=', categoryName)query.contains('name', substr)MyFile.setQuery(query).count().then(num => {  // success  console.log(num)  // 10}, err => {  // err})
let MyFile = new qq.BaaS.File()let query = new qq.BaaS.Query()query.compare('category_name', '=', categoryName)query.contains('name', substr)MyFile.setQuery(query).count().then(num => { // success console.log(num) // 10}, err => { // err})
let MyFile = new BaaS.File()let query = new BaaS.Query()query.compare('category_name', '=', categoryName)query.contains('name', substr)MyFile.setQuery(query).count().then(num => {  // success  console.log(num)  // 10}, err => {  // err})
let MyFile = new my.BaaS.File()let query = new my.BaaS.Query()query.compare('category_name', '=', categoryName)query.contains('name', substr)MyFile.setQuery(query).count().then(num => { // success console.log(num) // 10}, err => { // err})
let MyFile = new swan.BaaS.File()let query = new swan.BaaS.Query()query.compare('category_name', '=', categoryName)query.contains('name', substr)MyFile.setQuery(query).count().then(num => {  // success  console.log(num)  // 10}, err => {  // err})

查询,获取文件列表

BaaS.File#find(options)

参数说明

options:

参数类型必填默认说明
withCountbooleanfalse (SDK v3.x) / true (SDK v2.x)是否返回 total_count

当数据条目多时,可通过不返回 total_count 提高响应速度。

SDK v2.x 无法配置是否返回 total_count。

SDK v3.x 新增了 withCount 字段来配置是否返回 total_count,默认为 false

SDK v3.x 还新增了 count 方法,用来查询列表的数量。

文件查询与数据表查询方法一致,但只支持以下指定字段的筛选

支持字段类型说明
idString文件 id
nameString文件名
sizeNumber文件大小,以字节为单位
category_idString文件分类 id
category_nameString文件分类名
created_atInteger创建时间 (格式为 unix 时间戳)

文件查询与数据表查询方法一致,但只支持以下指定字段的筛选

支持字段类型说明
idString文件 id
nameString文件名
sizeInteger文件大小,以字节为单位
category_idString文件分类 id
category_nameString文件分类名
created_atInteger创建时间 (格式为 unix 时间戳)

示例代码

let MyFile = new wx.BaaS.File()// 查找所有文件MyFile.find()let query = new wx.BaaS.Query()// 查询某一文件分类下的所有文件query.compare('category_name', '=', categoryName)// 查询文件名包含指定字符串的文件query.contains('name', substr)MyFile.setQuery(query).find()
let MyFile = new qq.BaaS.File()// 查找所有文件MyFile.find()let query = new qq.BaaS.Query()// 查询某一文件分类下的所有文件query.compare('category_name', '=', categoryName)// 查询文件名包含指定字符串的文件query.contains('name', substr)MyFile.setQuery(query).find()
let MyFile = new BaaS.File()// 查找所有文件MyFile.find()let query = new BaaS.Query()// 查询某一文件分类下的所有文件query.compare('category_name', '=', categoryName)// 查询文件名包含指定字符串的文件query.contains('name', substr)MyFile.setQuery(query).find()
let MyFile = new my.BaaS.File()// 查找所有文件MyFile.find()let query = new my.BaaS.Query()// 查询某一文件分类下的所有文件query.compare('category_name', '=', categoryName)// 查询文件名包含指定字符串的文件query.contains('name', substr)MyFile.setQuery(query).find()
let MyFile = new swan.BaaS.File()// 查找所有文件MyFile.find()let query = new swan.BaaS.Query()// 查询某一文件分类下的所有文件query.compare('category_name', '=', categoryName)// 查询文件名包含指定字符串的文件query.contains('name', substr)MyFile.setQuery(query).find()
let MyFile = new wx.BaaS.File()// 查找所有文件MyFile.find()// 按创建时间范围查询: 2018年10月24日17时10分57秒 至今上传的文件let query = wx.BaaS.Query.and(new wx.BaaS.Query().compare('created_at', '<=', Math.ceil(Date.now() / 1000)), new wx.BaaS.Query().compare('created_at', '>=', 1540372257))MyFile.setQuery(query).find()
let MyFile = new qq.BaaS.File()// 查找所有文件MyFile.find()// 按创建时间范围查询: 2018年10月24日17时10分57秒 至今上传的文件let query = qq.BaaS.Query.and(new qq.BaaS.Query().compare('created_at', '<=', Math.ceil(Date.now() / 1000)), new qq.BaaS.Query().compare('created_at', '>=', 1540372257))MyFile.setQuery(query).find()
let MyFile = new BaaS.File()// 查找所有文件MyFile.find()// 按创建时间范围查询: 2018年10月24日17时10分57秒 至今上传的文件let query = BaaS.Query.and(new BaaS.Query().compare('created_at', '<=', Math.ceil(Date.now() / 1000)), new BaaS.Query().compare('created_at', '>=', 1540372257))MyFile.setQuery(query).find()
let MyFile = new my.BaaS.File()// 查找所有文件MyFile.find()// 按创建时间范围查询: 2018年10月24日17时10分57秒 至今上传的文件let query = my.BaaS.Query.and(new my.BaaS.Query().compare('created_at', '<=', Math.ceil(Date.now() / 1000)), new my.BaaS.Query().compare('created_at', '>=', 1540372257))MyFile.setQuery(query).find()
let MyFile = new swan.BaaS.File()// 查找所有文件MyFile.find()// 按创建时间范围查询: 2018年10月24日17时10分57秒 至今上传的文件let query = swan.BaaS.Query.and(new swan.BaaS.Query().compare('created_at', '<=', Math.ceil(Date.now() / 1000)), new swan.BaaS.Query().compare('created_at', '>=', 1540372257))MyFile.setQuery(query).find()

排序

文件查询排序与数据表排序方法一致,但只支持对以下指定字段进行排序

支持字段类型说明
nameString文件名
sizeNumber文件大小,以字节为单位
created_atNumber文件上传时间

示例代码

let MyFile = new wx.BaaS.File()MyFile.orderBy('-created_at').find().then()
let MyFile = new qq.BaaS.File()MyFile.orderBy('-created_at').find().then()
let MyFile = new BaaS.File()MyFile.orderBy('-created_at').find().then()
let MyFile = new my.BaaS.File()MyFile.orderBy('-created_at').find().then()
let MyFile = new swan.BaaS.File()MyFile.orderBy('-created_at').find().then()

分页

文件查询排序与数据表分页方法一致

示例代码

let MyFile = new wx.BaaS.File()MyFile.limit(10).offset(5).find().then()
let MyFile = new qq.BaaS.File()MyFile.limit(10).offset(5).find().then()
let MyFile = new BaaS.File()MyFile.limit(10).offset(5).find().then()
let MyFile = new my.BaaS.File()MyFile.limit(10).offset(5).find().then()
let MyFile = new swan.BaaS.File()MyFile.limit(10).offset(5).find().then()

返回示例

成功时 res 结构如下

{ 'meta': { 'limit': 20, 'next': '/dserve/v1.3/uploaded-file/?limit=20&offset=20&where=%7B%22%24and%22%3A%5B%7B%22category_name%22%3A%7B%22%24eq%22%3A%22%E5%9B%BE%E7%89%87%22%7D%7D%5D%7D', 'offset': 0, 'previous': null, 'total_count': 36 }, 'objects': [{ 'category': {'id': '5b73f36f2a4f56246e76b7b3', 'name': '图片'}, 'created_at': 1534823603, 'id': '5b7b8cb3839c611ab4eb2599', 'mime_type': 'image/jpeg', 'name': 'wxc6b86e382a1e3294.o6zAJs5dCuYRqqJOq0MwNPlGiFVM.CGLDGRT03IsI7fa51717abe74ed34e0c9cc77dbe7079.jpg', 'path': 'https://cloud-minapp-11033.cloud.ifanrusercontent.com/1frxjPBNFAOrQtOS.jpg', 'size': 11189 }]}

图片云处理

利用 CDN 图片云处理,可以快速便捷地完成图片缩放、裁切、打水印等操作,示例如下:

// 缩放图片至 400x400https://cloud-minapp-7894.cloud.ifanrusercontent.com/1eRuaPvwdleauqyZ.jpg!/both/400x400// 在图片右下角添加 “知晓云” 文字水印https://cloud-minapp-7894.cloud.ifanrusercontent.com/1eiuEUuISgOstoVZ.png!/watermark/align/southeast/text/55+l5pmT5LqRCg==

具体用法和更多功能可查看文档:如何通过图片 URL 进行图片云处理?

视频截图

SDK 版本要求 >= 1.16.0

MyFile.genVideoSnapshot(params)

params参数说明

参数类型必填说明
sourceStringY视频文件的 id
save_asStringY截图保存的文件名
pointStringY截图时间格式,格式:HH:MM:SS
category_idStringN文件所属类别 ID
random_file_linkBooleanN是否使用随机字符串作为文件的下载地址,不随机可能会覆盖之前的文件,默认为 true
sizeStringN截图尺寸,格式为 宽 x 高,默认是视频尺寸
formatStringN截图格式,可选值为 jpg,png, webp, 默认根据 save_as 的后缀生成

返回参数说明

res:

参数类型说明
created_atInteger创建时间 (格式为 unix 时间戳)
pathString路径
created_byInteger创建者 id
mime_typeStringmime_type 类型
media_typeString媒体类型
sizeInteger文件大小
nameString文件名
statusString文件状态
referenceString引用
cdn_pathStringcdn 中保存的路径
updated_atInteger更新时间 (格式为 unix 时间戳)
categoriesString文件所属类别
_idString本条记录 ID

示例代码

let MyFile = new wx.BaaS.File()let params = { 'source': 'xxxxxxxxxx', 'save_as': 'hello.png', 'point': '00:00:10', 'category_id': '5c18bc794e1e8d20dbfcddcc', 'random_file_link': false}MyFile.genVideoSnapshot(params).then((res) => { // success}, err => { // HError 对象})

HError 对象结构请参考错误码和 HError 对象

返回示例

{  'created_at': 1547461561,  'path': null,  'created_by_id': 16042162,  'mime_type': 'image/png',  'media_type': 'image',  'size': 99391,  'name': '1gizRRuY71ZUcSZX.png',  'status': 'success',  'reference': '',  'cdn_path': '1gizRRRdklnf7gCD.png',  'updated_at': 1547461561,  'categories': [],  '_id': '5c3c63b9d1606e0b3fc7acb7'}

M3U8 视频拼接

SDK 版本要求 >= 1.16.0

MyFile.videoConcat(params)

params参数说明

参数类型必填说明
m3u8sArrayY视频文件的 id 列表,按提交的顺序进行拼接
save_asStringY截图保存的文件名
category_idStringN文件所属类别 ID
random_file_linkBooleanN是否使用随机字符串作为文件的下载地址,不随机可能会覆盖之前的文件,默认为 true

返回参数说明

res:

参数类型说明
created_atInteger创建时间 (格式为 unix 时间戳)
pathString路径
created_byInteger创建者 id
mime_typeStringmime_type 类型
media_typeString媒体类型
sizeInteger文件大小
nameString文件名
statusString文件状态
referenceString引用
cdn_pathStringcdn 中保存的路径
updated_atInteger更新时间 (格式为 unix 时间戳)
categoriesString文件所属类别
_idString本条记录 ID

示例代码

let MyFile = new wx.BaaS.File()let params = { 'm3u8s': ['xxxxxxxxxx', 'xxxxxxxxxx'], 'save_as': 'hello.m3u8', 'category_id': '5c18bc794e1e8d20dbfcddcc', 'random_file_link': false,}MyFile.videoConcat(params).then((res) => { // success}, err => { // HError 对象})

HError 对象结构请参考错误码和 HError 对象

返回示例

{  'created_at': 1547461561,  'path': null,  'created_by_id': 16042162,  'mime_type': '',  'media_type': '',  'size': '',  'name': 'hello.m3u8',  'status': 'pengding',  'reference': '',  'cdn_path': '1gizRRRdklnf7gCD.m3u8',  'updated_at': 1547461561,  'categories': [],  '_id': '5c3c63b9d1606e0b3fc7acb7'}

M3U8 视频剪辑

SDK 版本要求 >= 1.16.0

MyFile.videoClip(params)

params参数说明

参数类型必填说明
m3u8StringY视频文件的 id
save_asStringY截图保存的文件名
category_idStringN文件所属类别 ID
random_file_linkBooleanN是否使用随机字符串作为文件的下载地址,不随机可能会覆盖之前的文件,默认为 true
includeArrayN包含某段内容的开始结束时间,单位是秒。当 index 为 false 时,为开始结束分片序号
excludeArrayN不包含某段内容的开始结束时间,单位是秒。当 index 为 false 时,为开始结束分片序号
indexBooleanNinclude 或者 exclude 中的值是否为 ts 分片序号,默认为 false

返回参数说明

res:

参数类型说明
created_atInteger创建时间 (格式为 unix 时间戳)
pathString路径
created_byInteger创建者 id
mime_typeStringmime_type 类型
media_typeString媒体类型
sizeInteger文件大小
nameString文件名
statusString文件状态
referenceString引用
cdn_pathStringcdn 中保存的路径
updated_atInteger更新时间 (格式为 unix 时间戳)
categoriesString文件所属类别
_idString本条记录 ID

示例代码

let MyFile = new wx.BaaS.File()let params = { 'm3u8': 'xxxxxxxxxx', 'include': [0, 20], 'save_as': '0s_20s.m3u8', 'category_id': '5c18bc794e1e8d20dbfcddcc', 'random_file_link': false}MyFile.videoClip(params).then((res) => { // success}, err => { // HError 对象})

HError 对象结构请参考错误码和 HError 对象

返回示例

{  'created_at': 1547461561,  'path': null,  'created_by_id': 16042162,  'mime_type': '',  'media_type': '',  'size': '',  'name': 'hello.m3u8',  'status': 'pending',  'reference': '',  'cdn_path': '1gizRRRdklnf7gCD.m3u8',  'updated_at': 1547461561,  'categories': [],  '_id': '5c3c63b9d1606e0b3fc7acb7'}

M3U8 时长和分片信息

SDK 版本要求 >= 1.16.0

MyFile.videoMeta(params)

params参数说明

参数类型必填说明
m3u8StringY视频文件的 id

返回参数说明

res:

参数类型说明
status_codeInteger状态码
messageString返回信息
metaObject详见以下

meta 参数说明:

参数类型说明
duartionNumberm3u8 时长
pointsArray时间点

示例代码

let MyFile = new wx.BaaS.File()let params = { 'm3u8': 'xxxxxxxxxx'}MyFile.videoMeta(params).then((res) => { // success}, err => { // HError 对象})

HError 对象结构请参考错误码和 HError 对象

返回示例

{  'status_code': 200,  'message': 'ok',  'meta': {    'duration': 2850.2974559999984,    'points': [      11.277933,      23.7237,      34.6346,      42.008632999999996,      50.483765999999996,      64.764699,      70.80406599999999,      82.31556599999999,      92.892799,      100.200099,      114.74796599999999,      123.92379899999999,      131.09763199999998,      140.97416499999997,      158.32483199999996,      160.05989899999994,      172.70586599999996,      181.04753299999996,      191.79159999999996    ]  }}

音视频的元信息

SDK 版本要求 >= 1.16.0

MyFile.videoAudioMeta(params)

params参数说明

参数类型必填说明
sourceStringY文件的 id

返回参数说明

res:

参数类型说明
formatObject音视频格式信息,详见以下
streamsArraystream 列表,详见以下

format 参数说明:

参数类型说明
bitrateInteger比特率
durationNumber时长
formatString容器格式
fullnameString容器格式全称

streams 参数说明:

参数类型说明
indexInteger表示第几路流
typeString一般情况下, video 或 audio
bitrateInteger流码率
codecString流编码
codec_descString流编码说明
durationNumber流时长
video_fpsNumber(视频流)视频帧数
video_heightInteger(视频流)视频高度
video_widthInteger(视频流)视频宽度
audio_channelsInteger(音频流)音频通道数
audio_samplerateInteger(音频流)音频采样率

示例代码

let MyFile = new wx.BaaS.File()let params = { 'source': 'xxxxxxxxxx'}MyFile.videoAudioMeta(params).then((res) => { // success}, err => { // HError 对象})

HError 对象结构请参考错误码和 HError 对象

返回示例

{  'streams': [    {      'index': 0,      'type': 'video',      'video_fps': 25,      'video_height': 236,      'video_width': 426,      'codec_desc': 'H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10',      'codec': 'h264',      'bitrate': 99608,      'duration': 184.8,      'metadata': {        'handler_name': 'VideoHandler',        'language': 'und'      }    },    {      'index': 1,      'type': 'audio',      'audio_channels': 2,      'audio_samplerate': 44100,      'codec_desc': 'AAC (Advanced Audio Coding)',      'codec': 'aac',      'bitrate': 48005,      'duration': 184.855011,      'metadata': {        'handler_name': 'SoundHandler',        'language': 'und'      }    }  ],  'format': {    'duration': 184.902,    'fullname': 'QuickTime / MOV',    'bitrate': 154062,    'filesize': 3560797,    'format': 'mov,mp4,m4a,3gp,3g2,mj2'  }}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Delphi 7.0常用函数速查手册
AutoIt自动化编程(1)
Retrofit请求参数注解字段说明 | Android | LoongWind
Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程五
nginx防止sql注入
C# LINQ学习笔记三:LINQ to OBJECT之操作字符串
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服