curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS,

t

h

i

s

>

j

s

o

n

2

s

t

r

(

this->json2str(

this−>json2str(params));

r

e

s

u

l

t

=

c

u

r

l

e

x

e

c

(

result = curl_exec(

result=curle​xec(ch);

if(curl_errno($ch))

r

e

s

u

l

t

=

c

u

r

l

e

r

r

o

r

(

result = curl_error(

result=curle​rror(ch);

curl_close($ch);

r

e

s

u

l

t

=

j

s

o

n

d

e

c

o

d

e

(

result = json_decode(

result=jsond​ecode(result, 1);

if (isset($result[‘Response’])) {

$result = $result[‘Response’];

$result[‘startTime’] = $result[‘ExpiredTime’] - $config[‘durationSeconds’];

}

$result =

t

h

i

s

>

b

a

c

k

w

a

r

d

C

o

m

p

a

t

(

this->backwardCompat(

this−>backwardCompat(result);

return $result;

}

// get policy

function getPolicy($scopes){

if (!is_array($scopes)){

return null;

}

$statements = array();

for($i=0,

c

o

u

n

t

s

=

c

o

u

n

t

(

counts=count(

counts=count(scopes); $i < $counts; $i++){

$actions=array();

$resources = array();

array_push($actions,

s

c

o

p

e

s

[

scopes[

scopes[i]->get_action());

array_push($resources,

s

c

o

p

e

s

[

scopes[

scopes[i]->get_resource());

$principal = array(

‘qcs’ => array(‘*’)

);

$statement = array(

‘actions’ => $actions,

‘effect’ => ‘allow’,

‘principal’ => $principal,

‘resource’ => $resources

);

array_push($statements, $statement);

}

$policy = array(

‘version’ => ‘2.0’,

‘statement’ => $statements

);

return $policy;

}

}

class Scope{

var $action;

var $bucket;

var $region;

var $resourcePrefix;

function __construct($action, $bucket, $region, $resourcePrefix){

$this->action = $action;

$this->bucket = $bucket;

$this->region = $region;

$this->resourcePrefix = $resourcePrefix;

}

function get_action(){

return $this->action;

}

function get_resource(){

i

n

d

e

x

=

s

t

r

r

i

p

o

s

(

index = strripos(

index=strripos(this->bucket, ‘-’);

b

u

c

k

e

t

N

a

m

e

=

s

u

b

s

t

r

(

bucketName = substr(

bucketName=substr(this->bucket, 0, $index);

a

p

p

i

d

=

s

u

b

s

t

r

(

appid = substr(

appid=substr(this->bucket, $index + 1);

if(!(strpos($this->resourcePrefix, ‘/’) === 0)){

$this->resourcePrefix = ‘/’ . $this->resourcePrefix;

}

return ‘qcs::cos:’ . $this->region . ‘:uid/’ . $appid . ‘:prefix//’ . $appid . ‘/’ . $bucketName . $this->resourcePrefix;

}

}

?>

4、下载cos-wx-sdk-v5.js

下载地址:https://github.com/tencentyun/cos-wx-sdk-v5/blob/master/demo/lib/cos-wx-sdk-v5.js

5、微信小程序创建config.js,用于保存对象存储参数,代码如下:

module.exports = {

stsUrl: ‘https://后端网址/car/getSts.html’,//后端获取签名

Bucket: ‘myfaka-1256433534’,//存储桶名称

Region: ‘ap-guangzhou’,//所属地域

};

把cos-wx-sdk-v5.js和config.js都放到项目里:

6、index.wxml代码:

特别说明:这里使用的是vant-weapp的文件上传组件,vant框架地址:https://github.com/youzan/vant-weapp

7、index.js代码:

//获取应用实例

const app = getApp()

var COS = require(‘./cos-wx-sdk-v5’)

var config = require(‘./config’);

var toastMsg = ‘’;

//初始化COS对象

var cos = new COS({

// 获取签名

getAuthorization: function(options, callback) {

wx.request({

url: config.stsUrl, // 服务端获取签名

dataType: ‘json’,

success: function(result) {

var data = result.data;

var credentials = data.credentials;

callback({

TmpSecretId: credentials.tmpSecretId,

TmpSecretKey: credentials.tmpSecretKey,

XCosSecurityToken: credentials.sessionToken,

ExpiredTime: data.expiredTime,

});

}

});

}

});

Page({

/**

页面的初始数据

*/

data: {

fileList: [],

date: ‘’

},

/**

生命周期函数–监听页面加载

*/

onLoad: function(options) {

//获取时间,作为图片文件夹名,如20191207

this.setData({

date: app.globalData.util.dateFormat(new Date(), “YMD”)

});

//清除缓存

//wx.removeStorageSync(‘fileList’);

//获取缓存中的地址

this.updateData();

},

afterRead(event) {

toastMsg = “上传”;

var that = this;

// 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式

/* 单个上传 */

/*

const { file } = event.detail;

var filePath = file.path;

var filename = new Date().getTime() + ‘.’+ filePath.substr(filePath.lastIndexOf(‘.’) + 1);

//文件相对路径名

var relativePath = ‘upload/’ + that.data.date + ‘/’ + filename;

cos.postObject({

Bucket: config.Bucket,

Region: config.Region,

Key: relativePath,

FilePath: filePath,

onProgress: function (info) {

}

}, requestCallback);

//添加到预览中

var img = {

id: i,

url: app.globalData.cosUrl + relativePath,

name: filename

}

//读取缓存

let list = wx.getStorageSync(‘fileList’);

if (list) {

list.push(img);

} else {

list = [img];

}

//存入缓存

wx.setStorageSync(‘fileList’, list);

//延迟更新数据

setTimeout(function () {

that.updateData();

}, 5000);

*/

/* 批量上传 */

var files = event.detail.file; //数组

for (var i = 0; i < files.length; i++) {

var filePath = files[i].path;

var filename = new Date().getTime() + ‘.’ + filePath.substr(filePath.lastIndexOf(‘.’) + 1);

//文件相对路径名

var relativePath = ‘upload/’ + that.data.date + ‘/’ + filename;

cos.postObject({

Bucket: config.Bucket,

Region: config.Region,

Key: relativePath,

FilePath: filePath,

onProgress: function(info) {

}

}, requestCallback);

//添加到预览中

var img = {

id: i,

url: app.globalData.cosUrl + relativePath,

name: filename

}

//读取缓存

let list = wx.getStorageSync(‘fileList’);

if (list) {

list.push(img);

} else {

list = [img];

}

//存入缓存

wx.setStorageSync(‘fileList’, list);

}

//延迟更新数据

setTimeout(function () {

that.updateData();

}, 5000);

},

delFile(event) {

toastMsg = “删除”;

var that = this;

wx.showModal({

title: ‘提示’,

content: ‘确定要删除这张图片吗?’,

success(res) {

if (res.confirm) {

var index = event.detail.index;

//读取缓存

let list = wx.getStorageSync(‘fileList’);

var filename = list[index].name;

//更新fileList中的数据

for (let i = 0; i < list.length; i++) {

//如果item是选中的话,就删除它。

if (filename == list[i].name) {

// 删除对应的索引

list.splice(i, 1);

break;

}

}

//更新缓存

wx.setStorageSync(‘fileList’, list);

//更新数据

that.updateData();

//删除cos对象存储中的图片

cos.deleteObject({

Bucket: config.Bucket,

Region: config.Region,

Key: ‘upload/’ + that.data.date + ‘/’ + filename,

}, requestCallback);

} else if (res.cancel) {

//console.log(‘用户点击取消’)

}

}

})

},

//更新数据

updateData() {

this.setData({

fileList: wx.getStorageSync(‘fileList’)

});

},

})

// 回调函数

var requestCallback = function(err, data) {

//console.log(err || data);

if (err && err.error) {

wx.showModal({

title: ‘返回错误’,

content: ‘请求失败:’ + (err.error.Message || err.error) + ‘;状态码:’ + err.statusCode,

showCancel: false

});

} else if (err) {

wx.showModal({

title: ‘返回错误’,

content: ‘请求出错:’ + err + ‘;状态码:’ + err.statusCode,

showCancel: false

});

} else {

wx.showToast({

title: toastMsg + ‘成功’,

icon: ‘success’,

duration: 3000

});

}

};

上面以当天日期为目录是用了工具类的,附加util.js时间格式化的代码:

const formatTime = date => {

const year = date.getFullYear()

const month = date.getMonth() + 1

const day = date.getDate()

const hour = date.getHours()

const minute = date.getMinutes()

const second = date.getSeconds()

return [year, month, day].map(formatNumber).join(‘/’) + ’ ’ + [hour, minute, second].map(formatNumber).join(‘:’)

}

const formatNumber = n => {

n = n.toString()

return n[1] ? n : ‘0’ + n

}

/**

时间戳转化为年 月 日 时 分 秒 number: 传入时间戳 format:返回格式,支持自定义,但参数必须与formateArr里保持一致

*/

function dateFormat(number, format) {

var formateArr = [‘Y’, ‘M’, ‘D’, ‘h’, ‘m’, ‘s’];

var returnArr = [];

var date = new Date(number);

returnArr.push(date.getFullYear());

returnArr.push(formatNumber(date.getMonth() + 1));

returnArr.push(formatNumber(date.getDate()));

returnArr.push(formatNumber(date.getHours()));

returnArr.push(formatNumber(date.getMinutes()));

returnArr.push(formatNumber(date.getSeconds()));

for (var i in returnArr) {

format = format.replace(formateArr[i], returnArr[i]);

}

return format;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结尾

如何才能让我们在面试中对答如流呢?

答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?为此我整理了一份Android学习资料路线:

这里是一份BAT大厂面试资料专题包:

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

0782452)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结尾

如何才能让我们在面试中对答如流呢?

答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?为此我整理了一份Android学习资料路线:

[外链图片转存中…(img-YOH8TwtE-1712410782452)]

这里是一份BAT大厂面试资料专题包:

[外链图片转存中…(img-yIqRqole-1712410782452)]

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: