demo-post-policy.js 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. var config = require('./config');
  2. var uploadFile = function () {
  3. // 对更多字符编码的 url encode 格式
  4. var camSafeUrlEncode = function (str) {
  5. return encodeURIComponent(str)
  6. .replace(/!/g, '%21')
  7. .replace(/'/g, '%27')
  8. .replace(/\(/g, '%28')
  9. .replace(/\)/g, '%29')
  10. .replace(/\*/g, '%2A');
  11. };
  12. // 获取临时密钥
  13. var getCredentials = function (options, callback) {
  14. wx.request({
  15. method: 'GET',
  16. url: 'http://127.0.0.1:3000/post-policy?ext=' + options.ext, // 服务端签名,参考 server 目录下的两个签名例子
  17. dataType: 'json',
  18. success: function (result) {
  19. var data = result.data;
  20. if (data) {
  21. callback(data);
  22. } else {
  23. wx.showModal({title: '临时密钥获取失败', content: JSON.stringify(data), showCancel: false});
  24. }
  25. },
  26. error: function (err) {
  27. wx.showModal({title: '临时密钥获取失败', content: JSON.stringify(err), showCancel: false});
  28. }
  29. });
  30. };
  31. // 上传文件
  32. var uploadFile = function (filePath) {
  33. var extIndex = filePath.lastIndexOf('.');
  34. var fileExt = extIndex >= -1 ? filePath.substr(extIndex + 1) : '';
  35. getCredentials({ext: fileExt}, function (credentials) {
  36. // 请求用到的参数
  37. // var prefix = 'https://cos.' + config.Region + '.myqcloud.com/' + config.Bucket + '/'; // 这个是后缀式,签名也要指定 Pathname: '/' + config.Bucket + '/'
  38. var prefix = 'https://' + credentials.bucket + '.cos.' + credentials.region + '.myqcloud.com/';
  39. var key = credentials.key; // 让服务端来决定文件名更安全
  40. var formData = {
  41. 'key': key,
  42. 'success_action_status': 200,
  43. 'Content-Type': '',
  44. 'q-sign-algorithm': credentials.qSignAlgorithm,
  45. 'q-ak': credentials.qAk,
  46. 'q-key-time': credentials.qKeyTime,
  47. 'q-signature': credentials.qSignature,
  48. 'policy': credentials.policy,
  49. };
  50. if (credentials.securityToken) formData['x-cos-security-token'] = credentials.securityToken;
  51. var requestTask = wx.uploadFile({
  52. url: prefix,
  53. name: 'file',
  54. filePath: filePath,
  55. formData: formData,
  56. success: function (res) {
  57. var url = prefix + camSafeUrlEncode(key).replace(/%2F/g, '/');
  58. if (res.statusCode === 200) {
  59. wx.showModal({title: '上传成功', content: url, showCancel: false});
  60. } else {
  61. wx.showModal({title: '上传失败', content: JSON.stringify(res), showCancel: false});
  62. }
  63. console.log(res.header['x-cos-request-id']);
  64. console.log(res.statusCode);
  65. console.log(url);
  66. },
  67. fail: function (res) {
  68. wx.showModal({title: '上传失败', content: JSON.stringify(res), showCancel: false});
  69. }
  70. });
  71. requestTask.onProgressUpdate(function (res) {
  72. console.log('正在进度:', res);
  73. });
  74. });
  75. };
  76. // 选择文件
  77. wx.chooseImage({
  78. count: 1, // 默认9
  79. sizeType: ['original'], // 可以指定是原图还是压缩图,这里默认用原图
  80. sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
  81. success: function (res) {
  82. uploadFile(res.tempFiles[0].path);
  83. }
  84. })
  85. };
  86. module.exports = uploadFile;