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

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

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

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

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

下载应用服务器代码

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

进行上传测试。

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

使用微信小程序上传图片
使用 chooseImage API 进行图片选择,然后调用 uploadFile 进行文件上传

https://help.aliyun.com/product/31815.html?spm=a2c4g.11186623.6.540.155a7eaeW7iaPX

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_nametmp_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>&nbsp;</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>

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

跳转的按钮在子组件

this.$navigate({url:"content"})this.$parent.$navigate({url:"content"})wepy.navigateTo({
url: '/pages/content'
})

请点赞!因为你的鼓励是我写作的最大动力!

吹逼交流群:711613774

转载于:https://www.cnblogs.com/dashucoding/p/11140222.html

微信小程序环境下将文件上传到 OSS相关推荐

  1. 微信小程序聊天室+websocket+文件上传(发送图片)

    最近哥们在写微信小程序,其中有个需求是搭建一个聊天室,可多人聊天,可私聊,可发送图片.但是由于一直没有这方面相关的了解,于是慢慢的去看,去做,前期真的很困难,路子不好走,慢慢的再搭建. 先看看效果吧 ...

  2. 小程序录音上传服务器,微信小程序录音实现功能并上传(使用node解析接收)

    微信小程序录音实现功能并上传(使用node解析接收) 发布时间:2020-09-04 11:59:06 来源:脚本之家 阅读:97 作者:weixin_43188227 背景 我在开发小程序的时候,有 ...

  3. 微信小程序云开发如何实现上传视频 以及 图片

    微信小程序云开发如何实现上传视频 以及 图片 最基础的数据库增删改查,上传到云存储即可实现,附源码 wxml文件 <button bindtap="upload">上传 ...

  4. taro开发微信小程序-添加开发者预览,上传测试版本(十四)

    taro开发微信小程序,上传测试版本,如果需要访问网络需要打开调试模式,如果配置了https协议的服务,提示对应的服务器证书无效,那么必须正确配置ssl证书,可以在阿里云或者腾讯云申请. 添加开发者预 ...

  5. 微信小程序录音功能实现,并上传录音文件,使用node解析接收

    背景 我在开发小程序的时候,有需求要实现录音功能,并能上传给服务器.小程序录音功能我是使用的微信的wx.getRecorderManager()实现的,通过该方法创建实例,实例录音得到的文件是本地临时 ...

  6. 小程序上传视频的php接口处理,微信小程序[第十二篇] -- 上传视频

    通过上一篇的学习,我们可以成功将宝宝的照片传到指定相册了,但是可爱的宝宝岂能只有照片,小视频必须同步跟上,莫问题!咱这篇就来一个视频上传的实现. 俺家小核桃镇贴. 服务端 其实对于yii2程序而言,如 ...

  7. 小程序对七牛云文件上传删除批量删除生成token封装无需服务器一个小程序搞定

    微信小程序获取token接入七牛云上传删除批量删除图片封装亲测可用 小程序获取七牛云uptoken删除文件封装 在研究官方文档后自己用小程序生成uptoken上传凭证封装,其他资料都说要服务器我又没钱 ...

  8. Udesk对接微信小程序实现商品浏览轨迹上传

    作者:张振琦 Udesk提供了小程序专用的行为轨迹SDK,可以用来收集客户的商品浏览轨迹,并在客服对话窗口中访问轨迹处可以查看. 在开发之前,需要先完成两个操作: 确认Udesk客服系统内绑定的小程序 ...

  9. Java生成微信小程序二维码、上传至阿里云OSS

    依赖 <!-- 阿里云oss依赖 --><dependency><groupId>com.aliyun.oss</groupId><artifac ...

最新文章

  1. 干货回顾丨TensorFlow四种Cross Entropy算法的实现和应用
  2. 算法时间复杂度lg是多少_时间复杂度入门理解
  3. Apache 2,4版本 编译与安装 RedHat enterprises 6.2
  4. android recovery 模块知识需求汇总
  5. asp获取屏幕分辨率
  6. 三百元月薪的小资生活
  7. CSS文件可维护、可读性提高指南第2/2页
  8. Nginx 0.8.5版本access.log日志分析shell命令
  9. python代码雨_pygame实现烟雨蒙蒙下彩虹雨
  10. codevs 1017 乘积最大
  11. 「09」真损啊!——损失函数与极大似然估计
  12. matlab simulink汽车巡航时的速度模糊pid控制
  13. 通过 JavaMail 访问 Hotmail 邮箱(hotmail不提供smtp和pop3服务)
  14. 自动消防报警喷水灭火系统实训装置QY-LY154
  15. 银行数据仓库体系实践_【实战剖析】某国际性商业银行的数据仓库建设经验分享...
  16. 很有意思的几个考验知识广度的问题
  17. 为 Nexus 5 准备的 Sailfish 移植版本
  18. mybatis(java持久层框架)
  19. 搭建linux服务器网络代理
  20. 呼叫系统呼叫中心crm系统

热门文章

  1. python之FTP程序(支持多用户在线)
  2. 递归获取拉平存储的树每个节点到达的路径
  3. 10倍提升应用性能的10个建议
  4. 使用 Gitolite 搭建 Git 服务器
  5. 代码风格研究:左花括号 是否换行???
  6. 改变Tomcat的端口de方法
  7. Web前端JavaScript笔记(5)事件-拖拽
  8. 问题 H: Search Problem (V)
  9. shell变量(包含标准shell)
  10. svn服务器会用到哪些端口_“模切压痕”会用到哪些材料?