{"componentChunkName":"component---src-templates-best-practice-detail-tsx","path":"/best-practice/2021-01-26-base-64","result":{"data":{"currentBlog":{"id":"9a17f860-11aa-5369-9940-3b91f3346e89","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/06f91ce743d71fce098149bc5c4c5d7b.jpg","authors":["吴宜展"],"categories":["best-practice"],"date":"2021-01-26T00:00:00.000Z","title":"Serverless 文件上传优化","description":"Base64 编码功能，支持全部触发和 Header 触发以满足不同场景的要求。","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","API 网关"],"keywords":null,"outdated":null},"wordCount":{"words":260,"sentences":41,"paragraphs":41},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-26-base-64.md","fields":{"slug":"/best-practice/2021-01-26-base-64/","keywords":["serverless","website","云函数","上传","触发","单击","文件","编码"]},"html":"<h2 id=\"前言\"><a href=\"#%E5%89%8D%E8%A8%80\" aria-label=\"前言 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>前言</h2>\n<p>当开发者需要搭建一个 Web 应用或移动端程序时，可以使用云函数作为后端服务，由 API 网关接收客户端请求，并触发云函数处理。这样的 Serverless 架构具备简单便捷、可弹性扩展、高可用等优势，正成为越来越多人的共同选择。</p>\n<p>但开发者在搭建应用时，难免会遇到上传文件的场景，如 App 上传用户头像、个人博客文章图片、网站评论图片，这些都需要上传文件到后端。如果您的业务托管在主机上，上传文件往往不受限制，可使用 multipart/form-data 方式直接上传文件；但在 Serverless架构下，由于 API 网关和云函数之间只支持传输 JSON 数据，使用传统方式上传文件较为困难，一般的解决方案是由客户端通过 Base64 等算法，先将文件从二进制转换为字符后再进行上传。</p>\n<p>近期腾讯云 Serverless 团队优化了上传文件体验，上线了 API 网关 Base64 编码功能，上传文件时原本由客户端做的 Base64 编码过程变为由 API 网关进行，这使得开发者无需改动客户端代码即可将二进制文件上传至云函数 SCF。同时，前端开发中一般可基于 Base64 格式完成图片的存储和展现，使得该功能对前端开发者来说非常友好。</p>\n<p>本文对 Serverless 和传统方式 multipart 上传多文件的过程进行了对比，并介绍了Base64 编码功能的配置方式。</p>\n<h2 id=\"请求过程对比\"><a href=\"#%E8%AF%B7%E6%B1%82%E8%BF%87%E7%A8%8B%E5%AF%B9%E6%AF%94\" aria-label=\"请求过程对比 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>请求过程对比</h2>\n<h3 id=\"传统方式上传文件过程\"><a href=\"#%E4%BC%A0%E7%BB%9F%E6%96%B9%E5%BC%8F%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E8%BF%87%E7%A8%8B\" aria-label=\"传统方式上传文件过程 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>传统方式上传文件过程</h3>\n<p>如果您的后端服务托管在云主机上，一般上传文件的请求过程如下：</p>\n<ul>\n<li>第一步：客户端可直接使用 multipart/form-data 方式上传文件；</li>\n<li>第二步：在后端服务中获取二进制文件。</li>\n</ul>\n<p>以下是一段客户端上传两张图片 pic-1.jpg 和 pic-2.jpg 到后端服务的 Python 3 参考代码：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"391199250498730500\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import requests\nfrom requests_toolbelt.multipart.encoder import MultipartEncoder\nfrom requests_toolbelt.multipart import decoder\n \nm = MultipartEncoder(\n    fields=[\n           ('files[]',('file.jpg', open('pic-2.jpg', 'rb'), 'image/jpeg')),\n           ('files[]',('file2.jpg', open('pic-1.jpg', 'rb'), 'image/jpeg')),\n           ]\n    )\n\nres = requests.post(url='https://yourwebsite.com/upload',\n                    data=m,\n                    headers={'Content-Type': m.content_type})\njson = res.json()\nprint(json)`, `391199250498730500`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> requests\n<span class=\"token keyword\">from</span> requests_toolbelt<span class=\"token punctuation\">.</span>multipart<span class=\"token punctuation\">.</span>encoder <span class=\"token keyword\">import</span> MultipartEncoder\n<span class=\"token keyword\">from</span> requests_toolbelt<span class=\"token punctuation\">.</span>multipart <span class=\"token keyword\">import</span> decoder\n \nm <span class=\"token operator\">=</span> MultipartEncoder<span class=\"token punctuation\">(</span>\n    fields<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span>\n           <span class=\"token punctuation\">(</span><span class=\"token string\">'files[]'</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span><span class=\"token string\">'file.jpg'</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">'pic-2.jpg'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'rb'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'image/jpeg'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n           <span class=\"token punctuation\">(</span><span class=\"token string\">'files[]'</span><span class=\"token punctuation\">,</span><span class=\"token punctuation\">(</span><span class=\"token string\">'file2.jpg'</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">'pic-1.jpg'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'rb'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'image/jpeg'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n           <span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">)</span>\n\nres <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span>post<span class=\"token punctuation\">(</span>url<span class=\"token operator\">=</span><span class=\"token string\">'https://yourwebsite.com/upload'</span><span class=\"token punctuation\">,</span>\n                    data<span class=\"token operator\">=</span>m<span class=\"token punctuation\">,</span>\n                    headers<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token string\">'Content-Type'</span><span class=\"token punctuation\">:</span> m<span class=\"token punctuation\">.</span>content_type<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\njson <span class=\"token operator\">=</span> res<span class=\"token punctuation\">.</span>json<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>json<span class=\"token punctuation\">)</span></code></pre></div>\n<h3 id=\"serverless-上传文件过程\"><a href=\"#serverless-%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E8%BF%87%E7%A8%8B\" aria-label=\"serverless 上传文件过程 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Serverless 上传文件过程</h3>\n<p><img src=\"https://main.qcloudimg.com/raw/6d6b21ac036cf57685a161f8212c894b.png\"></p>\n<p>如图是采用 API 网关结合云函数，开启 Base64 功能后上传文件的请求过程：</p>\n<ol>\n<li>客户端可直接使用 multipart/form-data 方式上传文件；</li>\n<li>在云函数中获取经过 Base64 编码的文本。</li>\n</ol>\n<h3 id=\"对比结论\"><a href=\"#%E5%AF%B9%E6%AF%94%E7%BB%93%E8%AE%BA\" aria-label=\"对比结论 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>对比结论</h3>\n<p>通过以上两种方式的对比，我们不难看出，Base64编码功能的最大优势在于使 Serverless 获得了和传统方式完全一致的上传文件体验，可直接使用传统方式的客户端代码进行上传。</p>\n<p>另外，在云函数中获取了经过 Base64 编码的文本后，您只需对 event.body 进行解码，就可以得到二进制文件了。以下是一段在云函数中解码多文件的 Python 3 参考代码：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"81363264820235260000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`# -*- coding: utf-8 -*-\n\nimport sys\nimport logging\nimport requests\nfrom requests_toolbelt.multipart.encoder import MultipartEncoder\nfrom requests_toolbelt.multipart import decoder\nimport base64\nimport json\n\nprint('Loading function')\n\nlogger = logging.getLogger()\n\ndef main_handler(event, context):\n    logger.info(&quot;start main handler&quot;)\n\n    content_type_header = event['headers']['content-type']\n    body = event['body']\n    is_me = base64.b64decode(body)\n    for part in decoder.MultipartDecoder(is_me, content_type_header).parts:\n        print(part.content)`, `81363264820235260000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># -*- coding: utf-8 -*-</span>\n\n<span class=\"token keyword\">import</span> sys\n<span class=\"token keyword\">import</span> logging\n<span class=\"token keyword\">import</span> requests\n<span class=\"token keyword\">from</span> requests_toolbelt<span class=\"token punctuation\">.</span>multipart<span class=\"token punctuation\">.</span>encoder <span class=\"token keyword\">import</span> MultipartEncoder\n<span class=\"token keyword\">from</span> requests_toolbelt<span class=\"token punctuation\">.</span>multipart <span class=\"token keyword\">import</span> decoder\n<span class=\"token keyword\">import</span> base64\n<span class=\"token keyword\">import</span> json\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Loading function'</span><span class=\"token punctuation\">)</span>\n\nlogger <span class=\"token operator\">=</span> logging<span class=\"token punctuation\">.</span>getLogger<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">main_handler</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    logger<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span><span class=\"token string\">\"start main handler\"</span><span class=\"token punctuation\">)</span>\n\n    content_type_header <span class=\"token operator\">=</span> event<span class=\"token punctuation\">[</span><span class=\"token string\">'headers'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'content-type'</span><span class=\"token punctuation\">]</span>\n    body <span class=\"token operator\">=</span> event<span class=\"token punctuation\">[</span><span class=\"token string\">'body'</span><span class=\"token punctuation\">]</span>\n    is_me <span class=\"token operator\">=</span> base64<span class=\"token punctuation\">.</span>b64decode<span class=\"token punctuation\">(</span>body<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">for</span> part <span class=\"token keyword\">in</span> decoder<span class=\"token punctuation\">.</span>MultipartDecoder<span class=\"token punctuation\">(</span>is_me<span class=\"token punctuation\">,</span> content_type_header<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>parts<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>part<span class=\"token punctuation\">.</span>content<span class=\"token punctuation\">)</span></code></pre></div>\n<blockquote>\n<p>注意：需要使用层或上传 zip 包的形式安装相关依赖。</p>\n</blockquote>\n<h2 id=\"实战配置\"><a href=\"#%E5%AE%9E%E6%88%98%E9%85%8D%E7%BD%AE\" aria-label=\"实战配置 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>实战配置</h2>\n<p>为满足不同场景的要求，Base64 编码功能还提供了“全部触发”和“Header 触发”两种触发方式供您选择：</p>\n<ul>\n<li>全部触发：API 开启全部触发后，每次请求的请求内容都会被 Base64 编码后再传递给云函数。</li>\n<li>Header 触发：API 开启 Header 触发后，必须配置触发规则。API 网关将根据触发规则对请求头进行校验，只有拥有特定 Content-Type 或 Accept 请求头的请求会被 Base64 编码后再传递给云函数，不满足条件的请求将不进行 Base64 编码，直接传递给云函数。</li>\n</ul>\n<p>以下将分别叙述两种触发方式的配置过程：</p>\n<h3 id=\"配置全部触发\"><a href=\"#%E9%85%8D%E7%BD%AE%E5%85%A8%E9%83%A8%E8%A7%A6%E5%8F%91\" aria-label=\"配置全部触发 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>配置全部触发</h3>\n<ol>\n<li>登录 <a href=\"https://console.cloud.tencent.com/apigateway/index?rid=1\">API 网关控制台</a> ，在左侧导航栏单击【服务】。</li>\n<li>在服务列表中，单击目标服务的服务 ID，查看 API 列表。</li>\n<li>单击【新建】，填写 API 前端配置，单击【下一步】。</li>\n<li>API 后端类型选择【云函数SCF】，勾选“Base64编码”，完成后续配置流程。此时创建的 API 已经开启了 Base64 编码，并默认为“全部触发”。</li>\n</ol>\n<p><img src=\"https://main.qcloudimg.com/raw/c116fc0017274148daf0290c8a20f445.png\"></p>\n<h3 id=\"配置-header-触发\"><a href=\"#%E9%85%8D%E7%BD%AE-header-%E8%A7%A6%E5%8F%91\" aria-label=\"配置 header 触发 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>配置 Header 触发</h3>\n<ol>\n<li>登录 <a href=\"https://console.cloud.tencent.com/apigateway/index?rid=1\">API 网关控制台</a> ，在左侧导航栏单击【服务】。</li>\n<li>在服务列表中，单击目标服务的服务 ID，查看 API 列表。</li>\n<li>在 API 列表中，单击目标 API 的 API ID（目标 API 必须是后端对接 SCF 的 API），即可查看 API 详情页。 在 API 详情页中，单击【基础配置】标签页，找到【Base64编码】配置项。</li>\n<li>单击\"Base64\"后的【编辑】，选择触发方式为【Header触发】。单击【添加触发规则】，选择参数并填写参数值。</li>\n<li>确认配置信息无误后，最后单击【保存】即可。</li>\n</ol>\n<p><img src=\"https://main.qcloudimg.com/raw/fedbf7b330ddfe846b39b48aaa7c2771.png\"></p>\n<hr>\n<hr>\n<div id='scf-deploy-iframe-or-md'></div>\n<hr>\n<blockquote>\n<p><strong>传送门：</strong></p>\n<ul>\n<li>GitHub: <a href=\"https://github.com/serverless/serverless/blob/master/README_CN.md\">github.com/serverless</a></li>\n<li>官网：<a href=\"https://serverless.com/\">serverless.com</a></li>\n</ul>\n</blockquote>\n<p>欢迎访问：<a href=\"https://serverlesscloud.cn/\">Serverless 中文网</a>，您可以在 <a href=\"https://serverlesscloud.cn/best-practice\">最佳实践</a> 里体验更多关于 Serverless 应用的开发！</p>","tableOfContents":"<ul>\n<li><a href=\"/best-practice/2021-01-26-base-64/#%E5%89%8D%E8%A8%80\">前言</a></li>\n<li>\n<p><a href=\"/best-practice/2021-01-26-base-64/#%E8%AF%B7%E6%B1%82%E8%BF%87%E7%A8%8B%E5%AF%B9%E6%AF%94\">请求过程对比</a></p>\n<ul>\n<li><a href=\"/best-practice/2021-01-26-base-64/#%E4%BC%A0%E7%BB%9F%E6%96%B9%E5%BC%8F%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E8%BF%87%E7%A8%8B\">传统方式上传文件过程</a></li>\n<li><a href=\"/best-practice/2021-01-26-base-64/#serverless-%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E8%BF%87%E7%A8%8B\">Serverless 上传文件过程</a></li>\n<li><a href=\"/best-practice/2021-01-26-base-64/#%E5%AF%B9%E6%AF%94%E7%BB%93%E8%AE%BA\">对比结论</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/best-practice/2021-01-26-base-64/#%E5%AE%9E%E6%88%98%E9%85%8D%E7%BD%AE\">实战配置</a></p>\n<ul>\n<li><a href=\"/best-practice/2021-01-26-base-64/#%E9%85%8D%E7%BD%AE%E5%85%A8%E9%83%A8%E8%A7%A6%E5%8F%91\">配置全部触发</a></li>\n<li><a href=\"/best-practice/2021-01-26-base-64/#%E9%85%8D%E7%BD%AE-header-%E8%A7%A6%E5%8F%91\">配置 Header 触发</a></li>\n</ul>\n</li>\n</ul>"},"previousBlog":{"id":"c21445e2-63c7-51ea-96b7-33274e34af3f","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/a0345eb9192c11afc25a1aceeb4e0e03.jpg","authors":["Susu"],"categories":["best-practice"],"date":"2021-01-28T00:00:00.000Z","title":"简单三步，通过工作流（ASW）快速完成订单数据处理","description":"本文介绍如何通过工作流 ASW 编排云函数，快速完成订单数据的处理","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","工作流 ASW"],"keywords":null,"outdated":null},"wordCount":{"words":198,"sentences":48,"paragraphs":48},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-28-asw-order.md","fields":{"slug":"/best-practice/2021-01-28-asw-order/","keywords":["go","serverless","云函数","状态机","创建","函数"]}},"nextBlog":{"id":"df2e6afb-84f0-5514-a3ce-6cfc79c81dc5","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/6c83b9144593a97244c83b61e515f906.jpg","authors":["Susu"],"categories":["best-practice"],"date":"2021-01-25T00:00:00.000Z","title":"简单三步，通过工作流（ASW）进行音频提取关键字操作","description":"本文介绍如何通过工作流 ASW 编排语音识别 AI 服务，进行关键字提取","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","工作流 ASW"],"keywords":null,"outdated":null},"wordCount":{"words":177,"sentences":38,"paragraphs":38},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2021-01-25-audio-extraction-keywords.md","fields":{"slug":"/best-practice/2021-01-25-audio-extraction-keywords/","keywords":["serverless","spa","状态机","语音","tencent","识别","asw","document"]}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"9a17f860-11aa-5369-9940-3b91f3346e89","previousBlogId":"c21445e2-63c7-51ea-96b7-33274e34af3f","nextBlogId":"df2e6afb-84f0-5514-a3ce-6cfc79c81dc5"}}}