{"id":58,"date":"2026-01-02T15:05:48","date_gmt":"2026-01-02T07:05:48","guid":{"rendered":"https:\/\/wjylovecx.xyz\/?p=58"},"modified":"2026-01-22T12:20:00","modified_gmt":"2026-01-22T04:20:00","slug":"%e9%98%bf%e9%87%8c%e4%ba%91oss%e5%ad%98%e5%82%a8%e5%be%ae%e4%bf%a1%e5%b0%8f%e7%a8%8b%e5%ba%8f%e5%9b%be%e7%89%87%e6%95%b0%e6%8d%ae","status":"publish","type":"post","link":"https:\/\/wjylovecx.xyz\/?p=58","title":{"rendered":"\u963f\u91cc\u4e91OSS\u5b58\u50a8\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u56fe\u7247\u6570\u636e"},"content":{"rendered":"\n<p>1.\u5bf9\u8c61\u5b58\u50a8\uff08Object Storage Service\uff09\u4ecb\u7ecd<br>OSS \u6307\u4e91\u5b58\u50a8\u670d\u52a1\u200c\uff0c\u7528\u4e8e\u6d77\u91cf\u6570\u636e\u7ba1\u7406\uff0c\u6838\u5fc3\u7279\u70b9\u5305\u62ec\uff1a<\/p>\n\n\n\n<p>\u9ad8\u53ef\u9760\u6027\u4e0e\u6269\u5c55\u6027\u200c\uff1a\u652f\u6301 99.9999999999% \u6570\u636e\u53ef\u9760\u6027\uff0c\u53ef\u5b58\u50a8\u4efb\u610f\u7c7b\u578b\u6587\u4ef6\uff08\u5982\u56fe\u7247\u3001\u89c6\u9891\uff09\uff0c\u5bb9\u91cf\u65e0\u4e0a\u9650\u3002\u200c<br>\u5e94\u7528\u573a\u666f\u200c\uff1a<br>\u5927\u6570\u636e\u5206\u6790\uff1a\u4f5c\u4e3a\u6570\u636e\u6e56\u5e95\u5ea7\uff0c\u652f\u6301 AI \u8bad\u7ec3\u548c\u5b9e\u65f6\u5904\u7406\u3002\u200c<br>\u4f01\u4e1a\u5907\u4efd\uff1a\u63d0\u4f9b\u7aef\u5230\u7aef\u52a0\u5bc6\u548c\u8de8\u533a\u57df\u707e\u5907\uff0c\u964d\u4f4e\u6570\u636e\u4e22\u5931\u98ce\u9669\u3002\u200c<br>\u6210\u672c\u4f18\u5316\u200c\uff1a\u63d0\u4f9b 5 \u79cd\u5b58\u50a8\u7c7b\u578b\uff08\u5982\u6807\u51c6\u578b\u3001\u4f4e\u9891\u8bbf\u95ee\u578b\uff09\uff0c\u6309\u4f7f\u7528\u91cf\u4ed8\u8d39\uff0c\u751f\u547d\u5468\u671f\u7ba1\u7406\u53ef\u964d\u672c 30%\u3002\u200c<\/p>\n\n\n\n<p>2.\u4f7f\u7528\u76ee\u7684<\/p>\n\n\n\n<p>\u670d\u52a1\u5668\u5e26\u5bbd\u4e3a3MB\uff0c\u524d\u7aef\u5c0f\u7a0b\u5e8f\u52a0\u8f7d\u56fe\u7247\u663e\u793a\u901f\u5ea6\u8f83\u6162\uff0c\u5347\u7ea7\u5e26\u5bbd\u8d39\u7528\u8f83\u9ad8\uff0c\u4f7f\u7528\u963f\u91cc\u4e91OSS\u670d\u52a1\u53ef\u4ee5\u63d0\u9ad8\u52a0\u8f7d\u901f\u5ea6\uff0c\u5e76\u4e14\u53ef\u4ee5\u6839\u636e\u7528\u6237id\uff08user_id\uff09\u5355\u72ec\u5efa\u7acb\u4e00\u4e2a\u6587\u4ef6\u5939\uff0c\u7528\u6765\u6839\u636e\u7528\u6237id\u5206\u7c7b\u5b58\u50a8\uff0c\u65b9\u4fbf\u7b80\u6d01<\/p>\n\n\n\n<p>3.\u4f7f\u7528\u6548\u679c<\/p>\n\n\n\n<p>\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u52a0\u8f7d\u56fe\u7247\u7684\u901f\u5ea6\u53d8\u5feb\uff0c\u6587\u4ef6\u7ed3\u6784\u66f4\u52a0\u6e05\u6670<\/p>\n\n\n\n<p>4.\u4e3a\u4ec0\u4e48\u901f\u5ea6\u53d8\u5feb<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>a: \u5c31\u8fd1\u8bbf\u95ee\uff1a\u7ed3\u5408CDN\/\u4f20\u8f93\u52a0\u901f\uff0c\u628a\u6570\u636e\u7f13\u5b58\u5230\u79bb\u7528\u6237\u6700\u8fd1\u7684\u8282\u70b9\uff0c\u4e0d\u7528\u8de8\u8fdc\u8def\u53d6\u6570\u636e\uff1b <\/li>\n\n\n\n<li>b. \u70ed\u70b9\u7f13\u5b58\uff1a\u9ad8\u9891\u8bbf\u95ee\u7684\u70ed\u6570\u636e\u4f1a\u5b58\u5728\u9ad8\u901f\u5b58\u50a8\uff08\u5982SSD\uff09\u6216\u672c\u5730\u7f13\u5b58\u91cc\uff0c\u8bfb\u53d6\u66f4\u9ad8\u6548\uff1b<\/li>\n\n\n\n<li> c. \u5206\u5e03\u5f0f\u67b6\u6784\uff1a\u6570\u636e\u5206\u6563\u5b58\u50a8\uff0c\u907f\u514d\u8bf7\u6c42\u624e\u5806\u62e5\u5835\uff0c\u9ad8\u5e76\u53d1\u4e0b\u4e5f\u80fd\u7a33\u5b9a\u5feb\u901f\u54cd\u5e94\u3002<\/li>\n<\/ul>\n\n\n\n<p>5.\u5982\u4f55\u4f7f\u7528<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u524d\u7aef<\/strong>\uff1a\u8bf7\u6c42\u540e\u7aef\u83b7\u53d6 OSS \u51ed\u8bc1 \u2192 \u9009\u62e9\u56fe\u7247 \u2192 \u538b\u7f29\u56fe\u7247 \u2192 \u8c03\u7528<code>uploadToOss<\/code>\u4e0a\u4f20\u5230 OSS \u2192 \u5f97\u5230 OSS \u6587\u4ef6 URL\u3002<\/li>\n\n\n\n<li><strong>\u540e\u7aef<\/strong>\uff1a\u63d0\u4f9b<code>getOssPolicy<\/code>\u63a5\u53e3\u751f\u6210\u51ed\u8bc1 \u2192 \u4e1a\u52a1\u63a5\u53e3\u63a5\u6536\u524d\u7aef\u63d0\u4ea4\u7684 OSS URL \u5e76\u5b58\u50a8\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e00\u3001\u540e\u7aef\uff08Node.js\uff09\u6838\u5fc3\u4ee3\u7801<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. \u914d\u7f6e\u6587\u4ef6\uff08<code>config\/oss.js<\/code>\uff09<\/h4>\n\n\n\n<p>javascript<\/p>\n\n\n\n<p>\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u963f\u91cc\u4e91OSS\u914d\u7f6e\nmodule.exports = {\n  region: \"\u4f60\u7684OSS\u533a\u57df\uff08\u5982oss-cn-hangzhou\uff09\",\n  accessKeyId: \"\u4f60\u7684AccessKeyId\",\n  accessKeySecret: \"\u4f60\u7684AccessKeySecret\",\n  bucket: \"\u4f60\u7684Bucket\u540d\u79f0\",\n  host: \"xxx\", \/\/ \u4f60\u7684OSS\u81ea\u5b9a\u4e49\u57df\u540d\n  maxSize: 10 * 1024 * 1024, \/\/ \u6700\u5927\u4e0a\u4f20\u5927\u5c0f\uff0810MB\uff09\n  expires: 3600, \/\/ Policy\u8fc7\u671f\u65f6\u95f4\uff08\u79d2\uff09\n};\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2. OSS \u51ed\u8bc1\u63a5\u53e3\uff08<code>controller\/ossController.js<\/code>\uff09<\/h4>\n\n\n\n<p>javascript<\/p>\n\n\n\n<p>\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const OSS = require(\"ali-oss\");\nconst ossConfig = require(\"..\/config\/oss\");\n\n\/\/ \u83b7\u53d6OSS\u4e0a\u4f20\u51ed\u8bc1\uff08Policy\uff09\nexports.getOssPolicy = async (req, res) =&gt; {\n  try {\n    const { user_id } = req.query;\n    if (!user_id) {\n      return res.status(400).json({ code: 400, message: \"\u7f3a\u5c11user_id\" });\n    }\n\n    \/\/ \u521d\u59cb\u5316OSS\u5ba2\u6237\u7aef\n    const client = new OSS({\n      region: ossConfig.region,\n      accessKeyId: ossConfig.accessKeyId,\n      accessKeySecret: ossConfig.accessKeySecret,\n      bucket: ossConfig.bucket,\n    });\n\n    \/\/ \u751f\u6210\u4e0a\u4f20\u8def\u5f84\u524d\u7f00\uff08\u6309\u7528\u6237\u9694\u79bb\uff09\n    const dir = `uploads\/${user_id}\/`;\n\n    \/\/ \u751f\u6210Policy\n    const policy = client.calculatePostPolicy(\n      {\n        expiration: new Date(Date.now() + ossConfig.expires * 1000),\n        conditions: &#91;\n          &#91;\"content-length-range\", 0, ossConfig.maxSize], \/\/ \u9650\u5236\u6587\u4ef6\u5927\u5c0f\n          &#91;\"starts-with\", \"$key\", dir], \/\/ \u9650\u5236\u4e0a\u4f20\u8def\u5f84\n        ],\n      },\n      {\n        accessKeyId: ossConfig.accessKeyId,\n        accessKeySecret: ossConfig.accessKeySecret,\n      }\n    );\n\n    \/\/ \u8fd4\u56de\u51ed\u8bc1\u7ed9\u524d\u7aef\n    res.json({\n      code: 200,\n      data: {\n        accessKeyId: ossConfig.accessKeyId,\n        policy: policy.policy,\n        signature: policy.signature,\n        host: ossConfig.host,\n        dir: dir,\n      },\n    });\n  } catch (err) {\n    console.error(\"\u83b7\u53d6OSS\u51ed\u8bc1\u5931\u8d25:\", err);\n    res.status(500).json({ code: 500, message: \"\u83b7\u53d6\u4e0a\u4f20\u51ed\u8bc1\u5931\u8d25\" });\n  }\n};\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3. \u8def\u7531\u914d\u7f6e\uff08<code>router\/ossRouter.js<\/code>\uff09<\/h4>\n\n\n\n<p>javascript<\/p>\n\n\n\n<p>\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const express = require(\"express\");\nconst router = express.Router();\nconst ossController = require(\"..\/controller\/ossController\");\n\n\/\/ \u83b7\u53d6OSS\u4e0a\u4f20\u51ed\u8bc1\nrouter.get(\"\/getOssPolicy\", ossController.getOssPolicy);\n\nmodule.exports = router;\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e8c\u3001\u524d\u7aef\uff08\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\uff09\u6838\u5fc3\u4ee3\u7801<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. OSS \u4e0a\u4f20\u5de5\u5177\u51fd\u6570\uff08<code>utils\/util.js<\/code>\uff09<\/h4>\n\n\n\n<p>javascript<\/p>\n\n\n\n<p>\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/**\n * \u4e0a\u4f20\u6587\u4ef6\u5230\u963f\u91cc\u4e91OSS\n * @param {string} filePath - \u672c\u5730\u6587\u4ef6\u4e34\u65f6\u8def\u5f84\n * @param {object} ossPolicy - \u540e\u7aef\u8fd4\u56de\u7684OSS\u51ed\u8bc1\n * @returns {Promise&lt;string&gt;} - OSS\u6587\u4ef6URL\n *\/\nexport const uploadToOss = (filePath, ossPolicy) =&gt; {\n  return new Promise((resolve, reject) =&gt; {\n    \/\/ \u751f\u6210\u552f\u4e00\u6587\u4ef6\u8def\u5f84\uff08\u907f\u514d\u8986\u76d6\uff09\n    const fileName = filePath.substr(filePath.lastIndexOf(\"\/\") + 1);\n    const key = `${ossPolicy.dir}${Date.now()}-${fileName}`;\n\n    \/\/ \u8c03\u7528\u5fae\u4fe1\u4e0a\u4f20\u63a5\u53e3\n    wx.uploadFile({\n      url: ossPolicy.host,\n      filePath: filePath,\n      name: \"file\",\n      formData: {\n        key: key,\n        policy: ossPolicy.policy,\n        OSSAccessKeyId: ossPolicy.accessKeyId,\n        signature: ossPolicy.signature,\n      },\n      success: (res) =&gt; {\n        if (res.statusCode === 204) {\n          const ossUrl = `${ossPolicy.host}\/${key}`;\n          resolve(ossUrl);\n        } else {\n          reject(new Error(\"OSS\u4e0a\u4f20\u5931\u8d25\"));\n        }\n      },\n      fail: (err) =&gt; reject(err),\n    });\n  });\n};\n\n\/\/ \u56fe\u7247\u538b\u7f29\uff08\u53ef\u9009\uff09\nexport const compressImage = (filePath) =&gt; {\n  return new Promise((resolve, reject) =&gt; {\n    wx.compressImage({\n      src: filePath,\n      quality: 80,\n      success: (res) =&gt; resolve(res.tempFilePath),\n      fail: (err) =&gt; reject(err),\n    });\n  });\n};\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2. \u9875\u9762\u4e0a\u4f20\u903b\u8f91\uff08<code>pages\/publish\/publish.js<\/code>\uff09<\/h4>\n\n\n\n<p>javascript<\/p>\n\n\n\n<p>\u8fd0\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const app = getApp();\nimport { compressImage, uploadToOss } from \"..\/..\/utils\/util.js\";\n\nPage({\n  data: {\n    goodsImgs: &#91;], \/\/ \u5b58\u50a8\u56fe\u7247\uff1a{localPath, serverUrl}\n    user_id: \"\",\n  },\n\n  onLoad() {\n    \/\/ \u521d\u59cb\u5316\u7528\u6237ID\n    this.setData({ user_id: app.globalData.userInfo.id });\n  },\n\n  \/\/ \u9009\u62e9\u5e76\u4e0a\u4f20\u56fe\u7247\n  async chooseImage() {\n    try {\n      \/\/ 1. \u83b7\u53d6OSS\u51ed\u8bc1\n      const policyRes = await app.get(\"\/goodsOss\/getOssPolicy\", {\n        user_id: this.data.user_id,\n      });\n      if (policyRes.code !== 200) throw new Error(\"\u83b7\u53d6\u51ed\u8bc1\u5931\u8d25\");\n      const ossPolicy = policyRes.data;\n\n      \/\/ 2. \u9009\u62e9\u56fe\u7247\n      const chooseRes = await wx.chooseImage({\n        count: 5,\n        sizeType: &#91;\"compressed\"],\n      });\n      const tempFilePaths = chooseRes.tempFilePaths;\n\n      \/\/ 3. \u5faa\u73af\u4e0a\u4f20\n      for (let i = 0; i &lt; tempFilePaths.length; i++) {\n        const compressedPath = await compressImage(tempFilePaths&#91;i]);\n        const ossUrl = await uploadToOss(compressedPath, ossPolicy);\n\n        \/\/ \u66f4\u65b0\u56fe\u7247\u5217\u8868\n        this.setData({\n          goodsImgs: &#91;\n            ...this.data.goodsImgs,\n            { localPath: tempFilePaths&#91;i], serverUrl: ossUrl },\n          ],\n        });\n      }\n      wx.showToast({ title: \"\u4e0a\u4f20\u6210\u529f\" });\n    } catch (err) {\n      wx.showToast({ title: \"\u4e0a\u4f20\u5931\u8d25\", icon: \"none\" });\n    }\n  },\n\n  \/\/ \u53d1\u5e03\u5546\u54c1\uff08\u5c06OSS\u56fe\u7247URL\u63d0\u4ea4\u5230\u540e\u7aef\uff09\n  async publish() {\n    const serverImgs = this.data.goodsImgs.map((img) =&gt; img.serverUrl);\n    const res = await app.post(\"\/goods\/publish\", {\n      imgs: serverImgs.join(\",\"),\n      \/\/ \u5176\u4ed6\u5546\u54c1\u4fe1\u606f...\n    });\n    if (res.code === 200) wx.showToast({ title: \"\u53d1\u5e03\u6210\u529f\" });\n  },\n});<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>1.\u5bf9\u8c61\u5b58\u50a8\uff08Object Storage Service\uff09\u4ecb\u7ecdOSS \u6307\u4e91\u5b58\u50a8\u670d\u52a1\u200c\uff0c\u7528\u4e8e\u6d77\u91cf\u6570\u636e\u7ba1\u7406\uff0c\u6838\u5fc3 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":73,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[8],"class_list":["post-58","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-7","tag-8"],"_links":{"self":[{"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=\/wp\/v2\/posts\/58","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=58"}],"version-history":[{"count":2,"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=\/wp\/v2\/posts\/58\/revisions"}],"predecessor-version":[{"id":61,"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=\/wp\/v2\/posts\/58\/revisions\/61"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=\/wp\/v2\/media\/73"}],"wp:attachment":[{"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wjylovecx.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}