108 lines
4.1 KiB
JavaScript
108 lines
4.1 KiB
JavaScript
|
var CosAuth = require('./lib/cos-auth');
|
||
|
var config = require('./config');
|
||
|
|
||
|
var uploadFile = function () {
|
||
|
// 请求用到的参数
|
||
|
// var prefix = 'https://cos.' + config.Region + '.myqcloud.com/' + config.Bucket + '/'; // 这个是后缀式,签名也要指定 Pathname: '/' + config.Bucket + '/'
|
||
|
var prefix = 'https://' + config.Bucket + '.cos.' + config.Region + '.myqcloud.com/';
|
||
|
|
||
|
// 对更多字符编码的 url encode 格式
|
||
|
var camSafeUrlEncode = function (str) {
|
||
|
return encodeURIComponent(str)
|
||
|
.replace(/!/g, '%21')
|
||
|
.replace(/'/g, '%27')
|
||
|
.replace(/\(/g, '%28')
|
||
|
.replace(/\)/g, '%29')
|
||
|
.replace(/\*/g, '%2A');
|
||
|
};
|
||
|
|
||
|
// 获取临时密钥
|
||
|
var stsCache;
|
||
|
var getCredentials = function (callback) {
|
||
|
if (stsCache && Date.now() / 1000 + 30 < stsCache.expiredTime) {
|
||
|
callback(stsCache.credentials);
|
||
|
return;
|
||
|
}
|
||
|
wx.request({
|
||
|
method: 'GET',
|
||
|
url: config.stsUrl, // 服务端签名,参考 server 目录下的两个签名例子
|
||
|
dataType: 'json',
|
||
|
success: function (result) {
|
||
|
var data = result.data;
|
||
|
var credentials = data.credentials;
|
||
|
if (credentials) {
|
||
|
stsCache = data
|
||
|
} else {
|
||
|
wx.showModal({title: '临时密钥获取失败', content: JSON.stringify(data), showCancel: false});
|
||
|
}
|
||
|
callback(stsCache && stsCache.credentials);
|
||
|
},
|
||
|
error: function (err) {
|
||
|
wx.showModal({title: '临时密钥获取失败', content: JSON.stringify(err), showCancel: false});
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// 计算签名
|
||
|
var getAuthorization = function (options, callback) {
|
||
|
getCredentials(function (credentials) {
|
||
|
callback({
|
||
|
XCosSecurityToken: credentials.sessionToken,
|
||
|
Authorization: CosAuth({
|
||
|
SecretId: credentials.tmpSecretId,
|
||
|
SecretKey: credentials.tmpSecretKey,
|
||
|
Method: options.Method,
|
||
|
Pathname: options.Pathname,
|
||
|
})
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// 上传文件
|
||
|
var uploadFile = function (filePath) {
|
||
|
var Key = filePath.substr(filePath.lastIndexOf('/') + 1); // 这里指定上传的文件名
|
||
|
getAuthorization({Method: 'POST', Pathname: '/'}, function (AuthData) {
|
||
|
var requestTask = wx.uploadFile({
|
||
|
url: prefix,
|
||
|
name: 'file',
|
||
|
filePath: filePath,
|
||
|
formData: {
|
||
|
'key': Key,
|
||
|
'success_action_status': 200,
|
||
|
'Signature': AuthData.Authorization,
|
||
|
'x-cos-security-token': AuthData.XCosSecurityToken,
|
||
|
'Content-Type': '',
|
||
|
},
|
||
|
success: function (res) {
|
||
|
var url = prefix + camSafeUrlEncode(Key).replace(/%2F/g, '/');
|
||
|
if (res.statusCode === 200) {
|
||
|
wx.showModal({title: '上传成功', content: url, showCancel: false});
|
||
|
} else {
|
||
|
wx.showModal({title: '上传失败', content: JSON.stringify(res), showCancel: false});
|
||
|
}
|
||
|
console.log(res.statusCode);
|
||
|
console.log(url);
|
||
|
},
|
||
|
fail: function (res) {
|
||
|
wx.showModal({title: '上传失败', content: JSON.stringify(res), showCancel: false});
|
||
|
}
|
||
|
});
|
||
|
requestTask.onProgressUpdate(function (res) {
|
||
|
console.log('正在进度:', res);
|
||
|
});
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// 选择文件
|
||
|
wx.chooseImage({
|
||
|
count: 1, // 默认9
|
||
|
sizeType: ['original'], // 可以指定是原图还是压缩图,这里默认用原图
|
||
|
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
|
||
|
success: function (res) {
|
||
|
uploadFile(res.tempFiles[0].path);
|
||
|
}
|
||
|
})
|
||
|
};
|
||
|
|
||
|
module.exports = uploadFile;
|