微信小程序环境下将文件上传到OSS的方法步骤


Posted in Javascript onMay 31, 2019

步骤 1: 配置 Bucket 跨域

客户端进行表单直传到 OSS 时,会从浏览器向 OSS 发送带有 Origin 的请求消息。OSS 对带有 Origin 头的请求消息会进行跨域规则(CORS)的验证。因此需要为 Bucket 设置跨域规则以支持 Post 方法。

微信小程序环境下将文件上传到OSS的方法步骤

步骤 2:配置外网域名到小程序的上传域名白名单中

通过 OSS 控制台查看外网域名。

微信小程序环境下将文件上传到OSS的方法步骤

登录微信小程序平台,配置小程序的上传域名白名单。

微信小程序环境下将文件上传到OSS的方法步骤

步骤 3:使用 Web 端直传实践方案 Demo 进行上传测试

下载应用服务器代码

修改 Demo 中 upload.js 的密钥和地址。

微信小程序环境下将文件上传到OSS的方法步骤

进行上传测试。

微信小程序环境下将文件上传到OSS的方法步骤

微信小程序环境下将文件上传到OSS的方法步骤

微信小程序环境下将文件上传到OSS的方法步骤

获取上传需要的签名(signature)和加密策略(policy)

使用微信小程序上传图片

使用 chooseImage API 进行图片选择,然后调用 uploadFile 进行文件上传

微信小程序环境下将文件上传到OSS的方法步骤

帮助文档

upload.js

accessid= '';
accesskey= '';
host = '';

g_dirname = ''
g_object_name = ''
g_object_name_type = ''
now = timestamp = Date.parse(new Date()) / 1000; 

var policyText = {
  "expiration": "2020-01-01T12:00:00.000Z", //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了
  "conditions": [
  ["content-length-range", 0, 1048576000] // 设置上传文件的大小限制
  ]
};

var policyBase64 = Base64.encode(JSON.stringify(policyText))
message = policyBase64
var bytes = Crypto.HMAC(Crypto.SHA1, message, accesskey, { asBytes: true }) ;
var signature = Crypto.util.bytesToBase64(bytes);

function check_object_radio() {
  var tt = document.getElementsByName('myradio');
  for (var i = 0; i < tt.length ; i++ )
  {
    if(tt[i].checked)
    {
      g_object_name_type = tt[i].value;
      break;
    }
  }
}

function get_dirname()
{
  dir = document.getElementById("dirname").value;
  if (dir != '' && dir.indexOf('/') != dir.length - 1)
  {
    dir = dir + '/'
  }
  //alert(dir)
  g_dirname = dir
}

function random_string(len) {
len = len || 32;

var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';  

var maxPos = chars.length;

var pwd = '';

for (i = 0; i < len; i++) {
  
pwd += chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return pwd;
}

function get_suffix(filename) {
  pos = filename.lastIndexOf('.')
  suffix = ''
  if (pos != -1) {
    suffix = filename.substring(pos)
  }
  return suffix;
}

function calculate_object_name(filename)
{
  if (g_object_name_type == 'local_name')
  {
    g_object_name += "${filename}"
  }
  else if (g_object_name_type == 'random_name')
  {
    suffix = get_suffix(filename)
    g_object_name = g_dirname + random_string(10) + suffix
  }
  return ''
}

function get_uploaded_object_name(filename)
{
  if (g_object_name_type == 'local_name')
  {
    tmp_name = g_object_name
    tmp_name = tmp_name.replace("${filename}", filename);
    return tmp_name
  }
  else if(g_object_name_type == 'random_name')
  {
    return g_object_name
  }
}

function set_upload_param(up, filename, ret)
{
  g_object_name = g_dirname;
  if (filename != '') {
    suffix = get_suffix(filename)
    calculate_object_name(filename)
  }
  new_multipart_params = {
    'key' : g_object_name,
    'policy': policyBase64,
    'OSSAccessKeyId': accessid, 
    'success_action_status' : '200', //让服务端返回200,不然,默认会返回204
    'signature': signature,
  };

  up.setOption({
    'url': host,
    'multipart_params': new_multipart_params
  });

  up.start();
}

var uploader = new plupload.Uploader({
  runtimes : 'html5,flash,silverlight,html4',
  browse_button : 'selectfiles', 
  //multi_selection: false,
  container: document.getElementById('container'),
  flash_swf_url : 'lib/plupload-2.1.2/js/Moxie.swf',
  silverlight_xap_url : 'lib/plupload-2.1.2/js/Moxie.xap',
  url : 'http://oss.aliyuncs.com',

  init: {
    PostInit: function() {
      document.getElementById('ossfile').innerHTML = '';
      document.getElementById('postfiles').onclick = function() {
      set_upload_param(uploader, '', false);
      return false;
      };
    },

    FilesAdded: function(up, files) {
      plupload.each(files, function(file) {
        document.getElementById('ossfile').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ')<b></b>'
        +'<div class="progress"><div class="progress-bar" style="width: 0%"></div></div>'
        +'</div>';
      });
    },

    BeforeUpload: function(up, file) {
      check_object_radio();
      get_dirname();
      set_upload_param(up, file.name, true);
    },

    UploadProgress: function(up, file) {
      var d = document.getElementById(file.id);
      d.getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
      var prog = d.getElementsByTagName('div')[0];
      var progBar = prog.getElementsByTagName('div')[0]
      progBar.style.width= 2*file.percent+'px';
      progBar.setAttribute('aria-valuenow', file.percent);
    },

    FileUploaded: function(up, file, info) {
      if (info.status == 200)
      {
        document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = 'upload to oss success, object name:' + get_uploaded_object_name(file.name);
      }
      else
      {
        document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = info.response;
      } 
    },

    Error: function(up, err) {
      document.getElementById('console').appendChild(document.createTextNode("\nError xml:" + err.response));
    }
  }
});

uploader.init();

index.html

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
  <title>OSS web直传</title>
  <link rel="stylesheet" type="text/css" href="style.css"/>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
</head>
<body>

<h2>OSS web直传---直接在JS签名</h2>
<ol>
<li>基于plupload封装 </li>
<li>支持html5,flash,silverlight,html4 等协议上传</li>
<li>可以运行在PC浏览器,手机浏览器,微信</li>
<li>可以选择多文件上传</li>
<li>显示上传进度条</li>
<li>可以控制上传文件的大小</li>
<li>最关键的是,让你10分钟之内就能移植到你的系统,实现以上牛逼的功能!</li>
<li>注意一点,bucket必须设置了Cors(Post打勾),不然没有办法上传</li>
<li>注意一点,把upload.js 里面的host/accessid/accesskey改成您上传所需要的信息即可</li>
<li>此方法是直接在前端签名,有accessid/accesskey泄漏的风险, 线上生产请使用后端签名例子<a href="https://help.aliyun.com/document_detail/oss/practice/pc_web_upload/js_php_upload.html">点击查看详细文档</a></li>
</ol>
<br>
<form name=theform>
<input type="radio" name="myradio" value="local_name" checked=true/> 上传文件名字保持本地文件名字
<input type="radio" name="myradio" value="random_name" /> 上传文件名字是随机文件名
<br/>
上传到指定目录:<input type="text" id='dirname' placeholder="如果不填,默认是上传到根目录" size=50>
</form>

<h4>您所选择的文件列表:</h4>
<div id="ossfile">你的浏览器不支持flash,Silverlight或者HTML5!</div>

<br/>

<div id="container">
  <a id="selectfiles" href="javascript:void(0);" class='btn'>选择文件</a>
  <a id="postfiles" href="javascript:void(0);" class='btn'>开始上传</a>
</div>

<pre id="console"></pre>

<p> </p>

</body>
<script type="text/javascript" src="lib/crypto1/crypto/crypto.js"></script>
<script type="text/javascript" src="lib/crypto1/hmac/hmac.js"></script>
<script type="text/javascript" src="lib/crypto1/sha1/sha1.js"></script>
<script type="text/javascript" src="lib/base64.js"></script>
<script type="text/javascript" src="lib/plupload-2.1.2/js/plupload.full.min.js"></script>
<script type="text/javascript" src="upload.js"></script>
</html>

实现点击按钮选择图片后显示图片并且可以预览该图片

微信小程序环境下将文件上传到OSS的方法步骤

微信小程序环境下将文件上传到OSS的方法步骤

微信小程序环境下将文件上传到OSS的方法步骤

微信小程序环境下将文件上传到OSS的方法步骤

跳转的按钮在子组件

this.$navigate({url:"content"})

this.$parent.$navigate({url:"content"})

wepy.navigateTo({
url: '/pages/content'
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript Select标记中options操作方法集合
Oct 22 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
Oct 24 Javascript
js滚动条回到顶部的代码
Dec 06 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
Jan 03 Javascript
JavaScript实现表格排序方法
Jun 14 Javascript
jquery $(document).ready()和window.onload的区别浅析
Feb 04 Javascript
浅谈javascript中的Function和Arguments
Aug 30 Javascript
用Vue.extend构建消息提示组件的方法实例
Aug 08 Javascript
js中如何完美的解析数据
Mar 18 Javascript
在小程序开发中使用npm的方法
Oct 17 Javascript
浅谈Vue中render中的h箭头函数
Nov 07 Javascript
javascript操作元素的常见方法小结
Nov 13 Javascript
Vue Router history模式的配置方法及其原理
May 30 #Javascript
vue-cli3+ts+webpack实现多入口多出口功能
May 30 #Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
May 30 #Javascript
了解JavaScript函数中的默认参数
May 30 #Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
May 30 #Javascript
轻松学习JavaScript函数中的 Rest 参数
May 30 #Javascript
细说Vue组件的服务器端渲染的过程
May 30 #Javascript
You might like
PHP4实际应用经验篇(6)
2006/10/09 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
如何使用php实现评委评分器
2015/07/31 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
js继承的实现代码
2010/08/05 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
jquery+javascript编写国籍控件
2015/02/12 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
vue自定义组件实现双向绑定
2021/01/13 Vue.js
在Python中操作字典之update()方法的使用
2015/05/22 Python
简单解析Django框架中的表单验证
2015/07/17 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
Django数据库表反向生成实例解析
2018/02/06 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
python set集合使用方法解析
2019/11/05 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
Python调用Redis的示例代码
2020/11/24 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
火山动力Java笔试题
2014/06/26 面试题
学生安全责任书
2014/04/15 职场文书
地球一小时宣传标语
2014/06/24 职场文书
工作证明格式及范本
2014/09/12 职场文书
贷款承诺书
2015/01/20 职场文书
违纪检讨书
2015/01/27 职场文书
工厂无线对讲系统解决方案
2022/02/18 无线电