diff --git "a/product/\345\255\230\345\202\250\344\270\216CDN/\345\257\271\350\261\241\345\255\230\345\202\250 4.0/\346\234\200\344\275\263\345\256\236\350\267\265/\346\225\260\346\215\256\347\233\264\344\274\240/Web\347\253\257\347\233\264\344\274\240\345\256\236\350\267\265.md" "b/product/\345\255\230\345\202\250\344\270\216CDN/\345\257\271\350\261\241\345\255\230\345\202\250 4.0/\346\234\200\344\275\263\345\256\236\350\267\265/\346\225\260\346\215\256\347\233\264\344\274\240/Web\347\253\257\347\233\264\344\274\240\345\256\236\350\267\265.md" index e85cdd7d8043..e2a335943768 100644 --- "a/product/\345\255\230\345\202\250\344\270\216CDN/\345\257\271\350\261\241\345\255\230\345\202\250 4.0/\346\234\200\344\275\263\345\256\236\350\267\265/\346\225\260\346\215\256\347\233\264\344\274\240/Web\347\253\257\347\233\264\344\274\240\345\256\236\350\267\265.md" +++ "b/product/\345\255\230\345\202\250\344\270\216CDN/\345\257\271\350\261\241\345\255\230\345\202\250 4.0/\346\234\200\344\275\263\345\256\236\350\267\265/\346\225\260\346\215\256\347\233\264\344\274\240/Web\347\253\257\347\233\264\344\274\240\345\256\236\350\267\265.md" @@ -35,11 +35,9 @@ 如何计算签名可参考文档 [请求签名](https://cloud.tencent.com/document/product/436/7778)。 服务端使用 Nodejs 计算签名代码可参考 [Nodejs 示例](https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/sts.js)。 -### Web 端上传示例 - 以下代码同时举例了 [PUT Object ](https://cloud.tencent.com/document/product/436/7749) 接口(推荐使用)和[POST Object ](https://cloud.tencent.com/document/product/436/14690) 接口,操作指引如下: -#### 使用 AJAX PUT 上传 +### Web 端 PutObject 上传 AJAX 上传需要浏览器支持基本的 HTML5 特性,当前方案使用 [PUT Object ](https://cloud.tencent.com/document/product/436/7749) 文档,操作指引如下: @@ -192,7 +190,7 @@ AJAX 上传需要浏览器支持基本的 HTML5 特性,当前方案使用 [PUT 执行效果如下图: ![Ajax 上传](https://main.qcloudimg.com/raw/4bfc2883d71deddccc76b250ebb6a051.png) -#### 使用 AJAX POST 上传 +### Web 端 PostObject 上传 AJAX 上传需要浏览器支持基本的 HTML5 特性,当前方案使用 [Post Object ](https://cloud.tencent.com/document/product/436/14690) 接口。操作指引: @@ -365,7 +363,7 @@ AJAX 上传需要浏览器支持基本的 HTML5 特性,当前方案使用 [Pos 执行效果如下图: ![Ajax 上传](https://main.qcloudimg.com/raw/4bfc2883d71deddccc76b250ebb6a051.png) -#### 使用 Form 表单上传 +### Web 端 Form 表单上传 Form 表单上传支持低版本的浏览器的上传(如 IE8),当前方案使用 [Post Object ](https://cloud.tencent.com/document/product/436/14690) 接口。操作指引: @@ -403,7 +401,6 @@ Form 表单上传支持低版本的浏览器的上传(如 IE8),当前方 enctype="multipart/form-data" accept="*/*" > - ? 本文档内容基于 XML API 的 [PostObject 接口](https://cloud.tencent.com/document/product/436/14690)。 -> +本文档介绍如何不依赖 SDK,用简单的代码,在小程序直传文件到对象存储(Cloud Object Storage,COS)的存储桶。 + +> ! 本文档内容基于 XML 版本的 API。 + + + +## 前期条件 + +1. 登录 [对象存储控制台](https://console.cloud.tencent.com/cos5) ,创建存储桶,设置 BucketName(存储桶名称) 和 Region(地域名称),详情请参见 [创建存储桶](https://cloud.tencent.com/document/product/436/13309) 文档。 +2. 登录 [访问管理控制台](https://console.cloud.tencent.com/cam/capi),进入 API 密钥管理页面,获取您的项目 SecretId 和 SecretKey。 +3. 配置小程序域名白名单 + +小程序里请求 COS 需要登录到微信公众平台,在“开发”->“开发设置”中,配置域名白名单。SDK 用到了两个接口:wx.uploadFile 和 wx.request。 + +- cos.postObject 使用 wx.uploadFile 发送请求。 +- 其他方法使用 wx.request 发送请求。 + +两者都需要在对应白名单里,配置 COS 域名。白名单里配置的域名格式有两种: + +- 如果只用到一个存储桶,可以配置 Bucket 域名作为白名单域名,例如`examplebucket-1250000000.cos.ap-guangzhou.myqcloud.com`。 +- 如果用到多个存储桶,可以选择后缀式请求 COS,把 bucket 放在 pathname 里请求,这种方式需要配置地域域名作为白名单,例如`cos.ap-guangzhou.myqcloud.com`。具体可参考下文代码中的注释。 ## 方案说明 ### 执行过程 1. 在前端选择文件,前端将后缀发送给服务端。 -2. 服务端根据后缀,生成带时间的随机 COS 文件路径,并计算对应的 PostObject policy 签名,返回 URL 和签名信息给前端。 -3. 前端调用 [PostObject 接口](https://cloud.tencent.com/document/product/436/14690),直传文件到 COS。 +2. 服务端根据后缀,生成带时间的随机 COS 文件路径,并计算对应的签名,返回 URL 和签名信息给前端。 +3. 前端使用 PUT 或 POST 请求,直传文件到 COS。 ### 方案优势 -- 权限安全:使用 PostObject policy 签名可以有效限定安全的权限范围,只能用于上传指定的一个文件路径。 +- 权限安全:使用服务端签名可以有效限定安全的权限范围,只能用于上传指定的一个文件路径。 - 路径安全:由服务端决定随机的 COS 文件路径,可以有效避免已有文件被覆盖的问题和安全风险。 -- 兼容多端:使用 uni-app 提供的选文件、上传接口,可以一份代码多端可兼容(Web/小程序/App)。 +### 后缀式请求 -## 前提条件 +COS API 一般的请求格式都类似`POST http://examplebucket-1250000000.cos.ap-beijing.myqcloud.com/`,请求的域名是存储桶域名。这样如果在小程序里用到多个存储桶,则需要配置这个存储桶域名作为白名单域名。解决方法如下: -1. 登录 [COS 控制台](https://console.cloud.tencent.com/cos5) 并创建存储桶,得到 Bucket(存储桶名称) 和 Region(地域名称),详情请参见 [创建存储桶](https://cloud.tencent.com/document/product/436/13309) 文档。 -2. 登录 [访问管理控制台](https://console.cloud.tencent.com/cam/capi), 获取您的项目 SecretId 和 SecretKey。 -3. 进入刚创建的存储桶详情页面,在**安全管理 > 跨域访问CORS设置**页面,单击**添加规则**。配置示例如下图,详情请参见 [设置跨域访问](https://cloud.tencent.com/document/product/436/13318) 文档。 -![](https://main.qcloudimg.com/raw/86dc77bee6d3da13a91ab378c79d8a53.jpg) +COS 提供了后缀式请求格式`POST http://cos.ap-beijing.myqcloud.com/examplebucket-1250000000/`,请求的域名是地域域名,存储桶名称放在请求的路径里。在小程序里用到同一个地域多个存储桶,只需要配置一个域名`cos.ap-beijing.myqcloud.com`作为白名单域名。 +后缀式请求格式需要注意,签名时使用的路径要用以存储桶名称作为前缀的路径,例如`/examplebucket-1250000000/`。 ## 实践步骤 ->! 正式部署前,建议您在服务端加一层对网站本身的权限检验。 -> - -### 前端上传 - -1. 参考 [post-policy 示例](https://github.com/tencentyun/cos-demo/tree/main/server/post-policy/) 实现一个服务端接口,用于生成随机文件路径、计算签名,并返回给前端。 -2. 使用 HBuilderX 默认模板创建 uni-app 应用。 -创建后,该应用为一个基于 Vue 的项目。 -3. 复制以下代码替换 pages/index/index.vue 文件内容,并修改调用的 post-policy 接口链接,将其指向自己的服务端地址(即步骤1的服务端接口)。 -```html - - - - - + }, + }); + requestTask.onProgressUpdate(function (res) { + console.log('正在进度:', res); + }); + }, + }); + }; + + // 上传文件 + var uploadFile = function (filePath) { + var extIndex = filePath.lastIndexOf('.'); + var fileExt = extIndex >= -1 ? filePath.substr(extIndex + 1) : ''; + getAuthorization({ ext: fileExt }, function (AuthData) { + const prefix = 'https://' + AuthData.cosHost; + const key = AuthData.cosKey; + putFile({ prefix, filePath, key, AuthData }); + }); + }; + + // 选择文件 + wx.chooseMedia({ + count: 1, // 默认9 + sizeType: ['original'], // 可以指定是原图还是压缩图,这里默认用原图 + sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 + success: function (res) { + uploadFile(res.tempFiles[0].tempFilePath); + }, + }); +}; +``` + +## 上传时限制 + +### 限制上传文件后缀 + +#### 服务端签名限制 + +可参考服务端签名代码 [Nodejs 示例](https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/sts.js),对 extWhiteList 做处理。 + +#### 前端限制 + +参考上方 AJAX PUT 上传,只需要在选择文件时加一层判断即可。 + +```js +// 省略其他代码 +// 在选完文件后,上传前,限制文件后缀,只允许jpg png文件类型上传 +const allowExt = ['jpg', 'png']; +if (!allowExt.includes(fileExt)) { + wx.showToast({title: '只支持上传jpg、png文件', icon: 'error', duration: 3000}); + return; +} ``` -4. 在 HBuilderX 上,选择**运行 > 运行到浏览器 > Chrome**,即可在浏览器选择文件进行上传。 -执行效果如下图所示: - - 创建项目: -![uni-app 创建项目](https://qcloudimg.tencent-cloud.cn/raw/a11738411f47e1d1df51b1246ad92104.jpg) - - 直传效果: -![uni-app 直传效果](https://qcloudimg.tencent-cloud.cn/raw/01fd87f664cff606f9dfbad7783a06f8.jpg) -## Demo 代码地址 +### 限制上传文件大小 + +#### 服务端签名限制 + +可参考服务端签名代码 [Nodejs 示例](https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/sts.js)。 +POST 上传的 post-policy 签名可添加 conditions: ['content-length-range', 1, 5242880 ],代表上传文件大小范围为 1B - 5MB。 +或申请临时密钥时添加 condition: 'numeric_less_than_equal: { 'cos:content-length': 5242880 },代表上传文件最大为 5MB。 + +#### 前端限制 + +参考上方 AJAX PUT 上传,只需要在选择文件时加一层判断即可。 + +```js +// 省略其他代码 +// 在选完文件后,上传前,判断文件大小大于5MB就限制上传 +if (fileSize > 5 * 1024 * 1024) { + wx.showToast({title: '所选文件超过5MB,请重新选择', icon: 'error', duration: 3000}); + return; +} +``` -示例 Demo 下载地址:[upload-demo](https://github.com/tencentyun/cos-demo/tree/main/uni-app/upload-demo) +## 相关文档 +如需使用小程序 SDK,请参见小程序 SDK [快速入门](https://cloud.tencent.com/document/product/436/31953) 文档。 diff --git "a/product/\345\255\230\345\202\250\344\270\216CDN/\345\257\271\350\261\241\345\255\230\345\202\250 4.0/\346\234\200\344\275\263\345\256\236\350\267\265/\346\225\260\346\215\256\347\233\264\344\274\240/\345\260\217\347\250\213\345\272\217\347\233\264\344\274\240\345\256\236\350\267\265.md" "b/product/\345\255\230\345\202\250\344\270\216CDN/\345\257\271\350\261\241\345\255\230\345\202\250 4.0/\346\234\200\344\275\263\345\256\236\350\267\265/\346\225\260\346\215\256\347\233\264\344\274\240/\345\260\217\347\250\213\345\272\217\347\233\264\344\274\240\345\256\236\350\267\265.md" index d70826caebaf..5d5a59434187 100644 --- "a/product/\345\255\230\345\202\250\344\270\216CDN/\345\257\271\350\261\241\345\255\230\345\202\250 4.0/\346\234\200\344\275\263\345\256\236\350\267\265/\346\225\260\346\215\256\347\233\264\344\274\240/\345\260\217\347\250\213\345\272\217\347\233\264\344\274\240\345\256\236\350\267\265.md" +++ "b/product/\345\255\230\345\202\250\344\270\216CDN/\345\257\271\350\261\241\345\255\230\345\202\250 4.0/\346\234\200\344\275\263\345\256\236\350\267\265/\346\225\260\346\215\256\347\233\264\344\274\240/\345\260\217\347\250\213\345\272\217\347\233\264\344\274\240\345\256\236\350\267\265.md" @@ -52,11 +52,9 @@ COS 提供了后缀式请求格式`POST http://cos.ap-beijing.myqcloud.com/examp 如何计算签名可参考文档 [请求签名](https://cloud.tencent.com/document/product/436/7778)。 服务端使用 Nodejs 计算签名代码可参考 [Nodejs 示例](https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/sts.js)。 -### 小程序上传示例 - 以下代码同时举例了 [PUT Object ](https://cloud.tencent.com/document/product/436/7749) 接口(推荐使用)和[POST Object ](https://cloud.tencent.com/document/product/436/14690) 接口,操作指引如下: -#### 使用 POST 上传 +### 小程序 PostObject 上传 ```js var uploadFile = function () { @@ -169,7 +167,7 @@ var uploadFile = function () { }; ``` -#### 使用 PUT 上传 +### 小程序 PutObject 上传 ```js var uploadFile = function () { @@ -282,6 +280,49 @@ var uploadFile = function () { }; ``` +## 上传时限制 + +### 限制上传文件后缀 + +#### 服务端签名限制 + +可参考服务端签名代码 [Nodejs 示例](https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/sts.js),对 extWhiteList 做处理。 + +#### 前端限制 + +参考上方 AJAX PUT 上传,只需要在选择文件时加一层判断即可。 + +```js +// 省略其他代码 +// 在选完文件后,上传前,限制文件后缀,只允许jpg png文件类型上传 +const allowExt = ['jpg', 'png']; +if (!allowExt.includes(fileExt)) { + wx.showToast({title: '只支持上传jpg、png文件', icon: 'error', duration: 3000}); + return; +} +``` + +### 限制上传文件大小 + +#### 服务端签名限制 + +可参考服务端签名代码 [Nodejs 示例](https://github.com/tencentyun/cos-js-sdk-v5/blob/master/server/sts.js)。 +POST 上传的 post-policy 签名可添加 conditions: ['content-length-range', 1, 5242880 ],代表上传文件大小范围为 1B - 5MB。 +或申请临时密钥时添加 condition: 'numeric_less_than_equal: { 'cos:content-length': 5242880 },代表上传文件最大为 5MB。 + +#### 前端限制 + +参考上方 AJAX PUT 上传,只需要在选择文件时加一层判断即可。 + +```js +// 省略其他代码 +// 在选完文件后,上传前,判断文件大小大于5MB就限制上传 +if (fileSize > 5 * 1024 * 1024) { + wx.showToast({title: '所选文件超过5MB,请重新选择', icon: 'error', duration: 3000}); + return; +} +``` + ## 相关文档 如需使用小程序 SDK,请参见小程序 SDK [快速入门](https://cloud.tencent.com/document/product/436/31953) 文档。