QingCloud 文档 – SDK - kaiyun官方网站下载手机网页 /storage/object-storage/sdk/ Recent content in SDK on QingCloud 文档 Hugo -- gohugo.io Fri, 28 Feb 2020 10:08:56 +0900 Storage: Python SDK /storage/object-storage/sdk/python/ Fri, 28 Feb 2020 10:08:56 +0900 /storage/object-storage/sdk/python/ <p>QingStor 对象存储的新版 Python SDK,已在 GitHub 开源。本文为简要使用文档,更多详细信息请参见 <a href="https://github.com/qingstor/qingstor-sdk-python">GitHub 项目</a> 和 <a href="https://qingstor-sdk-python.readthedocs.io/en/latest/">Python SDK API 文档</a>。</p> <p>Python SDK 使用 <a href="https://github.com/yunify/snips">Snips</a> 工具生成,各接口的调用均与 QingStor 对象存储的 API 相对应。其返回码、请求头、错误码等规定请参照具体的 <a href="/storage/object-storage/api/">Qingstor Restful API 文档</a>。</p> <p>使用 SDK 之前请先在 <a href="https://console.qingcloud.com/access_keys/">管理控制台</a> 申请 Access key。</p> <h2 id="安装">安装</h2> <p>qingstor-sdk 自 v2.3.0 后,仅支持 python v3.6 及以上的版本。</p> <p>故,安装 qingstor-sdk 时,需确认当前环境中的 python 版本是否满足要求。若 python 版本低于 v3.6,则在使用该 SDK 的过程中,会出错。</p> <p>使用 Pip 安装:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; pip install qingstor-sdk </span></span></code></pre></div><h2 id="初始化服务">初始化服务</h2> <p>发起请求前需要初始化服务。以下代码初始化了一个 QingStor Service。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> qingstor.sdk.service.qingstor <span style="color:#f92672">import</span> QingStor </span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> qingstor.sdk.config <span style="color:#f92672">import</span> Config </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>config <span style="color:#f92672">=</span> Config(<span style="color:#e6db74">&#39;ACCESS_KEY_ID_EXAMPLE&#39;</span>, <span style="color:#e6db74">&#39;SECRET_ACCESS_KEY_EXAMPLE&#39;</span>) </span></span><span style="display:flex;"><span>qingstor <span style="color:#f92672">=</span> QingStor(config) </span></span></code></pre></div><h2 id="代码示例">代码示例</h2> <h3 id="获取账户下的-bucket-列表">获取账户下的 Bucket 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># List all buckets.</span> </span></span><span style="display:flex;"><span>output <span style="color:#f92672">=</span> qingstor<span style="color:#f92672">.</span>list_buckets() </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print HTTP status code.</span> </span></span><span style="display:flex;"><span>print(output<span style="color:#f92672">.</span>status_code) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print the buckets.</span> </span></span><span style="display:flex;"><span>print(output[<span style="color:#e6db74">&#39;buckets&#39;</span>]) </span></span></code></pre></div><h3 id="创建-bucket">创建 Bucket</h3> <p>初始化并创建 Bucket, 需要指定 Bucket 名称和所在 Zone:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>bucket <span style="color:#f92672">=</span> qingstor<span style="color:#f92672">.</span>Bucket(<span style="color:#e6db74">&#39;test-bucket&#39;</span>, <span style="color:#e6db74">&#39;pek3a&#39;</span>) </span></span><span style="display:flex;"><span>output <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span>put() </span></span></code></pre></div><h3 id="获取-bucket-中存储的-object-列表">获取 Bucket 中存储的 Object 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>output <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span>list_objects() </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print the HTTP status code.</span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Example: 200</span> </span></span><span style="display:flex;"><span>print(output<span style="color:#f92672">.</span>status_code) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print the key count.</span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Example: 7</span> </span></span><span style="display:flex;"><span>print(output[<span style="color:#e6db74">&#39;keys&#39;</span>]) </span></span></code></pre></div><h3 id="创建一个-object">创建一个 Object</h3> <p>上传一个文件:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;/tmp/sdk_bin&#39;</span>, <span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> f: </span></span><span style="display:flex;"><span> output <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span>put_object( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#39;example_key&#39;</span>, body<span style="color:#f92672">=</span>f </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print the HTTP status code.</span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Example: 201</span> </span></span><span style="display:flex;"><span>print(output<span style="color:#f92672">.</span>status_code) </span></span></code></pre></div><h3 id="删除一个-object">删除一个 Object</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>output <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span>delete_object(<span style="color:#e6db74">&#39;example_key&#39;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print the HTTP status code.</span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Example: 204</span> </span></span><span style="display:flex;"><span>print(output<span style="color:#f92672">.</span>status_code) </span></span></code></pre></div><h3 id="设置-bucket-acl">设置 Bucket ACL</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>output <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span>put_acl(acl<span style="color:#f92672">=</span>[ </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#39;grantee&#39;</span>: { </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#39;type&#39;</span>: <span style="color:#e6db74">&#39;group&#39;</span>, </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#39;name&#39;</span>: <span style="color:#e6db74">&#39;QS_ALL_USERS&#39;</span> </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#39;permission&#39;</span>: <span style="color:#e6db74">&#39;FULL_CONTROL&#39;</span> </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>]) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print the HTTP status code.</span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Example: 200</span> </span></span><span style="display:flex;"><span>print(output<span style="color:#f92672">.</span>status_code) </span></span></code></pre></div> Storage: Go SDK /storage/object-storage/sdk/go/ Wed, 25 Nov 2020 10:08:56 +0900 /storage/object-storage/sdk/go/ <p>QingStor 对象存储的 Go SDK 已在 GitHub 开源,本文为简要使用文档。更多详细信息请参见 <a href="https://github.com/qingstor/qingstor-sdk-go">GitHub 项目</a> 和 <a href="https://godoc.org/github.com/qingstor/qingstor-sdk-go">Godoc</a>。</p> <p>使用 SDK 之前请先在 <a href="https://console.qingcloud.com/access_keys/">管理控制台</a> 申请 Access key。</p> <h2 id="安装">安装</h2> <p>可以直接访问 GitHub 的 <a href="https://github.com/qingstor/qingstor-sdk-go/releases">release 页面</a> 下载压缩包进行安装,也可通过如下步骤进行安装:</p> <ol> <li>执行如下命令行,使用 <code>go get</code> 安装:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; go get -u github.com/qingstor/qingstor-sdk-go </span></span></code></pre></div><ol start="2"> <li>安装完成后,可执行如下命令行查看相关文档</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; godoc github.com/qingstor/qingstor-sdk-go </span></span></code></pre></div><p><strong>备注:</strong></p> <ul> <li>要求使用 Go 1.5 或以上的 Go 版本。</li> <li>若版本为 1.5 还需设置 <code>GO15VENDOREXPERIMENT=1</code>。</li> <li>从 Go SDK v3.0 版本起,Go SDK 也支持 go module 引入,可以在项目中的 <code>go.mod</code> 文件中引入指定版本的 SDK 即可。</li> </ul> <h2 id="初始化服务">初始化服务</h2> <p>发起请求前需要初始化服务。以下代码初始化了一个 QingStor Service。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#f92672">import</span> ( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;github.com/qingstor/qingstor-sdk-go/config&#34;</span> </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">qs</span> <span style="color:#e6db74">&#34;github.com/qingstor/qingstor-sdk-go/service&#34;</span> </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">qsErrors</span> <span style="color:#e6db74">&#34;github.com/qingstor/qingstor-sdk-go/request/errors&#34;</span> </span></span><span style="display:flex;"><span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">configuration</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">config</span>.<span style="color:#a6e22e">New</span>(<span style="color:#e6db74">&#34;ACCESS_KEY_ID&#34;</span>, <span style="color:#e6db74">&#34;SECRET_ACCESS_KEY&#34;</span>) </span></span><span style="display:flex;"><span><span style="color:#a6e22e">qsService</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">Init</span>(<span style="color:#a6e22e">configuration</span>) </span></span></code></pre></div><h2 id="代码示例">代码示例</h2> <h3 id="获取账户下的-bucket-列表">获取账户下的 Bucket 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">qsOutput</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">qsService</span>.<span style="color:#a6e22e">ListBuckets</span>(<span style="color:#66d9ef">nil</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the HTTP status code. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: 200 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">IntValue</span>(<span style="color:#a6e22e">qsOutput</span>.<span style="color:#a6e22e">StatusCode</span>)) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the bucket count. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: 5 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">IntValue</span>(<span style="color:#a6e22e">qsOutput</span>.<span style="color:#a6e22e">Count</span>)) </span></span></code></pre></div><h3 id="创建-bucket">创建 Bucket</h3> <p>初始化并创建 Bucket, 需要指定 Bucket 名称和所在 Zone:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">bucket</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">qsService</span>.<span style="color:#a6e22e">Bucket</span>(<span style="color:#e6db74">&#34;test-bucket&#34;</span>, <span style="color:#e6db74">&#34;pek3a&#34;</span>) </span></span><span style="display:flex;"><span><span style="color:#a6e22e">putBucketOutput</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">Put</span>() </span></span></code></pre></div><h3 id="取-bucket-中存储的-object-列表">取 Bucket 中存储的 Object 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">bOutput</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">ListObjects</span>(<span style="color:#66d9ef">nil</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the HTTP status code. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: 200 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">IntValue</span>(<span style="color:#a6e22e">bOutput</span>.<span style="color:#a6e22e">StatusCode</span>)) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the key count. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: 0 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(len(<span style="color:#a6e22e">bOutput</span>.<span style="color:#a6e22e">Keys</span>)) </span></span></code></pre></div><h3 id="创建一个-object">创建一个 Object</h3> <p>例如上传一张屏幕截图:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#75715e">// Open file </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">if</span> <span style="color:#a6e22e">file</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">Open</span>(<span style="color:#e6db74">&#34;/tmp/Screenshot.jpg&#34;</span>); <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> { </span></span><span style="display:flex;"><span> panic(<span style="color:#a6e22e">err</span>) </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span><span style="color:#66d9ef">defer</span> <span style="color:#a6e22e">file</span>.<span style="color:#a6e22e">Close</span>() </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Put object </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">oOutput</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">PutObject</span>(<span style="color:#e6db74">&#34;Screenshot.jpg&#34;</span>, <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">PutObjectInput</span>{<span style="color:#a6e22e">Body</span>: <span style="color:#a6e22e">file</span>}) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// 所有 &gt;= 400 的 HTTP 返回码都被视作错误 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> { </span></span><span style="display:flex;"><span> <span style="color:#75715e">// Example: QingStor Error: StatusCode 403, Code &#34;permission_denied&#34;... </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">err</span>) </span></span><span style="display:flex;"><span>} <span style="color:#66d9ef">else</span> { </span></span><span style="display:flex;"><span> <span style="color:#75715e">// Print the HTTP status code. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// Example: 201 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">IntValue</span>(<span style="color:#a6e22e">oOutput</span>.<span style="color:#a6e22e">StatusCode</span>)) </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><h3 id="下载一个文件">下载一个文件</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">getOutput</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">GetObject</span>( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;Screenshot.jpg&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">GetObjectInput</span>{}, </span></span><span style="display:flex;"><span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> { </span></span><span style="display:flex;"><span> <span style="color:#75715e">// Example: QingStor Error: StatusCode 404, Code &#34;object_not_exists&#34;... </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">err</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">qsErr</span>, <span style="color:#a6e22e">ok</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">err</span>.(<span style="color:#f92672">*</span><span style="color:#a6e22e">qsErrors</span>.<span style="color:#a6e22e">QingStorError</span>); <span style="color:#a6e22e">ok</span> { </span></span><span style="display:flex;"><span> println(<span style="color:#a6e22e">qsErr</span>.<span style="color:#a6e22e">StatusCode</span>, <span style="color:#a6e22e">qsErr</span>.<span style="color:#a6e22e">Code</span>) </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>} <span style="color:#66d9ef">else</span> { </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">defer</span> <span style="color:#a6e22e">getOutput</span>.<span style="color:#a6e22e">Close</span>() <span style="color:#75715e">// 一定记得关闭GetObjectOutput, 否则容易造成链接泄漏 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">f</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">OpenFile</span>(<span style="color:#e6db74">&#34;download_screenshot.jpg&#34;</span>, <span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">O_CREATE</span>|<span style="color:#a6e22e">os</span>.<span style="color:#a6e22e">O_WRONLY</span>, <span style="color:#ae81ff">0600</span>) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> { </span></span><span style="display:flex;"><span> panic(<span style="color:#a6e22e">err</span>) </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">defer</span> <span style="color:#a6e22e">f</span>.<span style="color:#a6e22e">Close</span>() </span></span><span style="display:flex;"><span> <span style="color:#75715e">// Download with 32k temporary buffer </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">err</span> = <span style="color:#a6e22e">io</span>.<span style="color:#a6e22e">CopyBuffer</span>(<span style="color:#a6e22e">f</span>, <span style="color:#a6e22e">getOutput</span>.<span style="color:#a6e22e">Body</span>, make([]<span style="color:#66d9ef">byte</span>, <span style="color:#ae81ff">32</span><span style="color:#f92672">*</span><span style="color:#ae81ff">1024</span>)) </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> { </span></span><span style="display:flex;"><span> panic(<span style="color:#a6e22e">err</span>) </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><h3 id="删除一个-object">删除一个 Object</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">oOutput</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">DeleteObject</span>(<span style="color:#e6db74">&#34;Screenshot.jpg&#34;</span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the HTTP status code. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: 204 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">IntValue</span>(<span style="color:#a6e22e">oOutput</span>.<span style="color:#a6e22e">StatusCode</span>)) </span></span></code></pre></div><h3 id="设置-bucket-acl">设置 Bucket ACL</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">bACLOutput</span>, <span style="color:#a6e22e">_</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">PutACL</span>(<span style="color:#f92672">&amp;</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">PutBucketACLInput</span>{ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">ACL</span>: []<span style="color:#f92672">*</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">ACLType</span>{ </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">Grantee</span>: <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">GranteeType</span>{ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">Type</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#e6db74">&#34;user&#34;</span>), </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">ID</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#e6db74">&#34;usr-xxxxxxxx&#34;</span>), </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">Permission</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#e6db74">&#34;FULL_CONTROL&#34;</span>), </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span>}) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the HTTP status code. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: 200 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">IntValue</span>(<span style="color:#a6e22e">bACLOutput</span>.<span style="color:#a6e22e">StatusCode</span>)) </span></span></code></pre></div><h3 id="分段上传">分段上传</h3> <h4 id="初始化分段上传">初始化分段上传</h4> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">initOutput</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">InitiateMultipartUpload</span>( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;QingCloudInsight.mov&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">InitiateMultipartUploadInput</span>{ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">ContentType</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#e6db74">&#34;video/quicktime&#34;</span>), </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the HTTP status code. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: 200 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">IntValue</span>(<span style="color:#a6e22e">initOutput</span>.<span style="color:#a6e22e">StatusCode</span>)) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the upload ID. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: &#34;9d37dd6ccee643075ca4e597ad65655c&#34; </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">StringValue</span>(<span style="color:#a6e22e">initOutput</span>.<span style="color:#a6e22e">UploadID</span>)) </span></span></code></pre></div><h4 id="上传两个分段">上传两个分段</h4> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">uploadOutput</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">UploadMultipart</span>( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;QingCloudInsight.mov&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">UploadMultipartInput</span>{ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">UploadID</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#a6e22e">initOutput</span>.<span style="color:#a6e22e">UploadID</span>), </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">PartNumber</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">Int</span>(<span style="color:#ae81ff">0</span>), </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">ContentMD5</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#a6e22e">md5String0</span>), </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">Body</span>: <span style="color:#a6e22e">file0</span>, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the HTTP status code. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: 201 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">IntValue</span>(<span style="color:#a6e22e">uploadOutput</span>.<span style="color:#a6e22e">StatusCode</span>)) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">uploadOutput</span>, <span style="color:#a6e22e">err</span> = <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">UploadMultipart</span>( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;QingCloudInsight.mov&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">UploadMultipartInput</span>{ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">UploadID</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#a6e22e">initOutput</span>.<span style="color:#a6e22e">UploadID</span>), </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">PartNumber</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">Int</span>(<span style="color:#ae81ff">1</span>), </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">ContentMD5</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#a6e22e">md5String1</span>), </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">Body</span>: <span style="color:#a6e22e">file1</span>, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span>) </span></span></code></pre></div><h4 id="完成分段上传">完成分段上传</h4> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">completeOutput</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">CompleteMultipartUpload</span>( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;QingCloudInsight.mov&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">CompleteMultipartUploadInput</span>{ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">UploadID</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#a6e22e">initOutput</span>.<span style="color:#a6e22e">UploadID</span>), </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">ObjectParts</span>: []<span style="color:#f92672">*</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">ObjectPart</span>{ </span></span><span style="display:flex;"><span> {<span style="color:#a6e22e">PartNumber</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">Int</span>(<span style="color:#ae81ff">0</span>)}, </span></span><span style="display:flex;"><span> {<span style="color:#a6e22e">PartNumber</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">Int</span>(<span style="color:#ae81ff">1</span>)}, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the HTTP status code. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: 200 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">IntValue</span>(<span style="color:#a6e22e">completeOutput</span>.<span style="color:#a6e22e">StatusCode</span>)) </span></span></code></pre></div><h4 id="取消分段上传">取消分段上传</h4> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">abrtOutput</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">AbortMultipartUpload</span>( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;QingCloudInsight.mov&#34;</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">&amp;</span><span style="color:#a6e22e">service</span>.<span style="color:#a6e22e">AbortMultipartUploadInput</span>{ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">UploadID</span>: <span style="color:#a6e22e">qs</span>.<span style="color:#a6e22e">String</span>(<span style="color:#a6e22e">initOutput</span>.<span style="color:#a6e22e">UploadID</span>), </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the error message. </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// Example: QingStor Error: StatusCode 400, Code... </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">err</span>) </span></span></code></pre></div> Storage: Ruby SDK /storage/object-storage/sdk/ruby/ Wed, 25 Nov 2020 10:08:56 +0900 /storage/object-storage/sdk/ruby/ <p>QingStor 对象存储的 Ruby SDK 已在 GitHub 开源,本文为简要使用文档。更多详细信息请参见 <a href="https://github.com/qingstor/qingstor-sdk-ruby">GitHub 项目</a>。</p> <p>使用 SDK 之前请先在 <a href="https://console.qingcloud.com/access_keys/">管理控制台</a> 申请 Access key。</p> <h2 id="安装">安装</h2> <p>QingStor 对象存储提供两个安装方式,用户可根据需求选用。</p> <p><strong>方式一:</strong> 直接 Ruby Gem 安装:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; gem install qingstor-sdk </span></span></code></pre></div><p><strong>方式二:</strong> 从源码安装:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; git clone git@github.com:qingstor/qingstor-sdk-ruby.git </span></span><span style="display:flex;"><span>&gt; cd qingstor-sdk-ruby </span></span><span style="display:flex;"><span>&gt; bundle install </span></span><span style="display:flex;"><span>&gt; bundle exec rake install </span></span></code></pre></div><h2 id="初始化服务">初始化服务</h2> <p>发起请求前需要初始化服务。以下代码初始化了一个 QingStor Service。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>require <span style="color:#e6db74">&#39;qingstor/sdk&#39;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>config <span style="color:#f92672">=</span> <span style="color:#66d9ef">QingStor</span><span style="color:#f92672">::</span><span style="color:#66d9ef">SDK</span><span style="color:#f92672">::</span><span style="color:#66d9ef">Config</span><span style="color:#f92672">.</span>init <span style="color:#e6db74">&#39;ACCESS_KEY_ID&#39;</span>, <span style="color:#e6db74">&#39;SECRET_ACCESS_KEY&#39;</span> </span></span><span style="display:flex;"><span>qs_service <span style="color:#f92672">=</span> <span style="color:#66d9ef">QingStor</span><span style="color:#f92672">::</span><span style="color:#66d9ef">SDK</span><span style="color:#f92672">::</span><span style="color:#66d9ef">Service</span><span style="color:#f92672">.</span>new config </span></span></code></pre></div><h2 id="代码示例">代码示例</h2> <h3 id="获取账户下的-bucket-列表">获取账户下的 Bucket 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>result <span style="color:#f92672">=</span> qs_service<span style="color:#f92672">.</span>list_buckets </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print HTTP status code</span> </span></span><span style="display:flex;"><span>puts result<span style="color:#f92672">[</span><span style="color:#e6db74">:status_code</span><span style="color:#f92672">]</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print bucket count</span> </span></span><span style="display:flex;"><span>puts result<span style="color:#f92672">[</span><span style="color:#e6db74">:buckets</span><span style="color:#f92672">].</span>length </span></span></code></pre></div><h3 id="创建-bucket">创建 Bucket</h3> <p>初始化并创建 Bucket, 需要指定 Bucket 名称和所在 Zone:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>bucket <span style="color:#f92672">=</span> qs_service<span style="color:#f92672">.</span>bucket <span style="color:#e6db74">&#39;test-bucket&#39;</span>, <span style="color:#e6db74">&#39;pek3a&#39;</span> </span></span><span style="display:flex;"><span>putBucketOutput <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span>put </span></span></code></pre></div><h3 id="获取-bucket-中存储的-object-列表">获取 Bucket 中存储的 Object 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>result <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span>list_objects </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print HTTP status code</span> </span></span><span style="display:flex;"><span>puts result<span style="color:#f92672">[</span><span style="color:#e6db74">:status_code</span><span style="color:#f92672">]</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print keys count</span> </span></span><span style="display:flex;"><span>puts result<span style="color:#f92672">[</span><span style="color:#e6db74">:keys</span><span style="color:#f92672">].</span>length </span></span></code></pre></div><h3 id="创建一个-object">创建一个 Object</h3> <p>例如上传一张屏幕截图:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span>file_path <span style="color:#f92672">=</span> <span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>expand_path <span style="color:#e6db74">&#39;~/Desktop/Screenshot.jpg&#39;</span> </span></span><span style="display:flex;"><span>result <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span>put_object <span style="color:#e6db74">&#39;Screenshot.jpg&#39;</span>, <span style="color:#e6db74">body</span>: <span style="color:#66d9ef">File</span><span style="color:#f92672">.</span>open(file_path) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e"># Print HTTP status code.</span> </span></span><span style="display:flex;"><span>puts result<span style="color:#f92672">[</span><span style="color:#e6db74">:status_code</span><span style="color:#f92672">]</span> </span></span></code></pre></div> Storage: C/C++ SDK /storage/object-storage/sdk/cpp/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/sdk/cpp/ <p>QingStor 对象存储的 C/C++ SDK 已在 GitHub 开源,本文为简要使用文档。更多详细信息请参见 <a href="https://github.com/yunify/qingstor-sdk-cpp">GitHub 项目</a>。</p> <p>本 SDK 使用 <a href="https://github.com/yunify/snips">Snips</a> 工具生成,各接口的调用均与 QingStor 对象存储的 API 相对应。其返回码、请求头、错误码等规定请参照具体的 <a href="/storage/object-storage/api/">Qingstor Restful API 文档</a>。</p> <p>本SDK提供了 C 和 C++ 两套接口,这两套接口在使用上方式上有所差别,请您阅读相应的使用说明文档,了解具体细节。</p> <h2 id="安装">安装</h2> <p>本 SDK 目前仅支持源码编译安装方式,详细操作如下:</p> <h3 id="安装依赖">安装依赖</h3> <ul> <li> <p>需在本地安装 Visual Studio 2013 或更高版本,或者 GCC 编译器 4.1.2 或更高版本。</p> </li> <li> <p>若用户使用 Linux 平台进行编译,还需安装 SDK 依赖的第三方库:libcurl 和 libopenssl。可以参照以下操作步骤:</p> <p>在 Debian/Ubuntu 系列系统请使用一下命令安装</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; sudo apt-get install libcurl4-openssl-dev libssl-dev </span></span></code></pre></div><p>在 Redhat/Fedora 系列系统请使用一下命令安装</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; sudo yum install libcurl-devel openssl-devel </span></span></code></pre></div></li> </ul> <h3 id="获取源码">获取源码</h3> <p>qingstor-sdk 目前正在 GitHub 上活跃开发中,代码开源在 <a href="https://github.com/yunify/qingstor-sdk-cpp">此处</a>。您也可以 Clone 这个公开的仓库:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; git clone https://github.com/yunify/qingstor-sdk-cpp.git </span></span></code></pre></div><h3 id="编译步骤">编译步骤</h3> <ol> <li> <p>安装 CMake 工具。若您当前使用的 CMake 工具版本低于 2.8,请参照 <a href="https://cmake.org/install/">CMake 的官方安装指导</a> 下载安装最新版本, 或通过源码编译安装。</p> </li> <li> <p>创建 build 目录:</p> </li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; cd BUILD_DIR </span></span><span style="display:flex;"><span>&gt; cmake &lt;path-to-root-of-this-source-code&gt; </span></span></code></pre></div><ol start="3"> <li>若用户需要编译 Release 版本,请执行以下 CMake 命令:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; cmake -DCMAKE_BUILD_TYPE<span style="color:#f92672">=</span>Release &lt;path-to-root-of-this-source-code&gt; </span></span><span style="display:flex;"><span>&gt; make </span></span><span style="display:flex;"><span>&gt; sudo make install </span></span></code></pre></div><h3 id="编译标准c接口">编译标准C接口</h3> <p>SDK 默认编译不生成标准 C 接口,若用户希望编译包含标准 C 接口的 SDK,请执行以下 CMake 命令:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; cmake -DBUILD_C_STYLE_INTERFACE<span style="color:#f92672">=</span>ON &lt;path-to-root-of-this-source-code&gt; </span></span></code></pre></div><h2 id="快速开始">快速开始</h2> <ul> <li><a href="c/">qingstor-sdk 标准 C 接口使用快速指南</a></li> <li><a href="cpp/">qingstor-sdk 标准 C++ 接口使用快速指南</a></li> </ul> Storage: Java SDK /storage/object-storage/sdk/java/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/sdk/java/ <p>QingStor 对象存储的 Java SDK 已在 GitHub 开源,本文为简要使用文档。更多详细信息请参见 <a href="https://github.com/yunify/qingstor-sdk-java">GitHub 项目</a> 和 <a href="https://github.com/qingstor/qingstor-sdk-java/blob/master/README_zh-CN.md">Java SDK API 文档</a>。</p> <p>Java SDK 使用 <a href="https://github.com/yunify/snips">Snips</a> 工具生成,各接口调用的均与 QingStor 对象存储的 API 相对应。其返回码、请求头、错误码等规定请参照具体的 <a href="/storage/object-storage/api/">Qingstor Restful API 文档</a>。</p> <p>SDK 示例请参见 <a href="https://github.com/qingstor/qingstor-sdk-java/blob/master/docs/examples_zh-CN.md">SDK Example</a>。</p> <p>使用 SDK 之前请先在 <a href="https://console.qingcloud.com/access_keys/">管理控制台</a> 申请 Access key。</p> <h2 id="安装">安装</h2> <ol> <li>可以直接访问 GitHub 的 <a href="https://github.com/qingstor/qingstor-sdk-java/releases">Release 页面</a> 下载压缩包,也可以执行如下命令行下载源码:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; git clone git@github.com:qingstor/qingstor-sdk-java.git </span></span></code></pre></div><ol start="2"> <li>在 gradle/maven 中将版本替换为您需要的版本,QingStor 对象存储推荐使用最新的版本。</li> </ol> <p>Gradle:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-gradle" data-lang="gradle"><span style="display:flex;"><span>dependencies <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> implementation <span style="color:#e6db74">&#39;com.yunify:qingstor.sdk.java:2.5.1&#39;</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">}</span> </span></span></code></pre></div><p>Maven:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;dependency&gt;</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">&lt;groupId&gt;</span>com.yunify<span style="color:#f92672">&lt;/groupId&gt;</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">&lt;artifactId&gt;</span>qingstor.sdk.java<span style="color:#f92672">&lt;/artifactId&gt;</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">&lt;version&gt;</span>2.5.1<span style="color:#f92672">&lt;/version&gt;</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/dependency&gt;</span> </span></span></code></pre></div><h2 id="初始化服务">初始化服务</h2> <p>发起请求前需要初始化服务。以下代码初始化了一个 QingStor Service。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">import</span> com.qingstor.sdk.config.EnvContext<span style="color:#f92672">;</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> com.qingstor.sdk.service.*<span style="color:#f92672">;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>EvnContext env <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> EnvContext<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;ACCESS_KEY_ID&#34;</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;SECRET_ACCESS_KEY&#34;</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span>QingStor stor <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> QingStor<span style="color:#f92672">(</span>env<span style="color:#f92672">);</span> </span></span></code></pre></div><p><strong>说明:</strong></p> <ul> <li>代码行中的 <code>env</code> 承载了用户的认证信息及 SDK 配置;</li> <li>代码行中的 <code>stor</code> 用于操作 QingStor 对象存储服务,如调用 Service 级别的 API 或创建指定的 Bucket 对象来调用 Bucket 和 Object 级别的 API。</li> </ul> <h2 id="代码示例">代码示例</h2> <h3 id="获取账户下的-bucket-列表">获取账户下的 Bucket 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span>ListBucketsOutput listOutput <span style="color:#f92672">=</span> stor<span style="color:#f92672">.</span><span style="color:#a6e22e">listBuckets</span><span style="color:#f92672">(</span><span style="color:#66d9ef">null</span><span style="color:#f92672">);</span> </span></span></code></pre></div><h3 id="创建-bucket">创建 Bucket</h3> <p>初始化并创建 Bucket,需要指定 Bucket 名称和所在 Zone:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#75715e">// 您要在哪个 zone 创建/操作 bucket. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>String zoneName <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pek3b&#34;</span><span style="color:#f92672">;</span> </span></span><span style="display:flex;"><span>Bucket bucket <span style="color:#f92672">=</span> stor<span style="color:#f92672">.</span><span style="color:#a6e22e">getBucket</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;您的 bucket 名字&#34;</span><span style="color:#f92672">,</span> zoneName<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span>Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutBucketOutput</span> output <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">put</span><span style="color:#f92672">();</span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>output<span style="color:#f92672">.</span><span style="color:#a6e22e">getStatueCode</span><span style="color:#f92672">()</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">201</span><span style="color:#f92672">)</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">// Created </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;Put Bucket: Created.&#34;</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">}</span> </span></span></code></pre></div><h3 id="获取-bucket-中存储的-object-列表">获取 Bucket 中存储的 Object 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span>Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">ListjavaObjectsOutput</span> listObjectsOutput <span style="color:#f92672">=</span> Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">listObjects</span><span style="color:#f92672">(</span><span style="color:#66d9ef">null</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span>List<span style="color:#f92672">&lt;</span>KeyModel<span style="color:#f92672">&gt;</span> objectKeys <span style="color:#f92672">=</span> listObjectsOutput<span style="color:#f92672">.</span><span style="color:#a6e22e">getKeys</span><span style="color:#f92672">();</span> </span></span></code></pre></div><h3 id="创建一个-object">创建一个 Object</h3> <h4 id="上传一个文件">上传一个文件</h4> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span>String objKey <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;object_name&#34;</span><span style="color:#f92672">;</span> </span></span><span style="display:flex;"><span>Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectInput</span> input <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectInput</span><span style="color:#f92672">();</span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// input 可以设置 File, Stream 等作为要上传的内容. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>File f <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> File<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;test_file.txt&#34;</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span>input<span style="color:#f92672">.</span><span style="color:#a6e22e">setBodyInputFile</span><span style="color:#f92672">(</span>f<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// 可选设置. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>input<span style="color:#f92672">.</span><span style="color:#a6e22e">setContentType</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;text/plain&#34;</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span>input<span style="color:#f92672">.</span><span style="color:#a6e22e">setContentLength</span><span style="color:#f92672">(</span>f<span style="color:#f92672">.</span><span style="color:#a6e22e">length</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span>Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectOutput</span> putObjectOutput <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">putObject</span><span style="color:#f92672">(</span>objKey<span style="color:#f92672">,</span> input<span style="color:#f92672">);</span> </span></span></code></pre></div><h4 id="上传一个流式文件">上传一个流式文件</h4> <p>流式上传前计算流的 MD5 值,详细内容如下:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span> <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">put</span><span style="color:#f92672">(</span>String key<span style="color:#f92672">,</span> InputStream body<span style="color:#f92672">)</span> <span style="color:#66d9ef">throws</span> QSException <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectInput</span> input <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectInput</span><span style="color:#f92672">();</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> MessageDigest md5 <span style="color:#f92672">=</span> MessageDigest<span style="color:#f92672">.</span><span style="color:#a6e22e">getInstance</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;MD5&#34;</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">// 这里只起示例作用, 如果 body size 有可能非常大, 按一定 size 做拆分以分段 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// 上传形式来分 part 计算 md5 上传才是比较经济的方式. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#66d9ef">byte</span><span style="color:#f92672">[]</span> data <span style="color:#f92672">=</span> body<span style="color:#f92672">.</span><span style="color:#a6e22e">readAllBytes</span><span style="color:#f92672">();</span> </span></span><span style="display:flex;"><span> String contentMD5 <span style="color:#f92672">=</span> Base64<span style="color:#f92672">.</span><span style="color:#a6e22e">getEncoder</span><span style="color:#f92672">().</span><span style="color:#a6e22e">encodeToString</span><span style="color:#f92672">(</span>md5<span style="color:#f92672">.</span><span style="color:#a6e22e">digest</span><span style="color:#f92672">(</span>data<span style="color:#f92672">));</span> </span></span><span style="display:flex;"><span> input<span style="color:#f92672">.</span><span style="color:#a6e22e">setContentMD5</span><span style="color:#f92672">(</span>contentMD5<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">// 此时 stream 已经被 consume 掉, 但对象存储 server side 也需要读取 body 内容, </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// 所以在 setBodyInputStream 之前, 可以通过: </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// 1. 流已经读取为 bytes array, 直接构造 ByteArrayInputStream 即可; </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// body = new ByteArrayInputStream(data); </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// 2. 如果流支持 markSupported(), 可以重设到流的开始. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// 下面是方式 2 的示例: </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> body<span style="color:#f92672">.</span><span style="color:#a6e22e">reset</span><span style="color:#f92672">();</span> </span></span><span style="display:flex;"><span> input<span style="color:#f92672">.</span><span style="color:#a6e22e">setBodyInputStream</span><span style="color:#f92672">(</span>body<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">}</span> <span style="color:#66d9ef">catch</span> <span style="color:#f92672">(</span>NoSuchAlgorithmException <span style="color:#f92672">|</span> IOException e<span style="color:#f92672">)</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">throw</span> <span style="color:#66d9ef">new</span> QSException<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;&#34;</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">}</span> </span></span><span style="display:flex;"><span> Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectOutput</span> output <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">putObject</span><span style="color:#f92672">(</span>key<span style="color:#f92672">,</span> input<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span>output<span style="color:#f92672">.</span><span style="color:#a6e22e">getStatueCode</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>output<span style="color:#f92672">.</span><span style="color:#a6e22e">getStatueCode</span><span style="color:#f92672">()</span> <span style="color:#f92672">==</span> <span style="color:#ae81ff">201</span><span style="color:#f92672">)</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span>output<span style="color:#f92672">.</span><span style="color:#a6e22e">getETag</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">}</span> <span style="color:#66d9ef">else</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span>output<span style="color:#f92672">.</span><span style="color:#a6e22e">getCode</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span>output<span style="color:#f92672">.</span><span style="color:#a6e22e">getMessage</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">}</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span>output<span style="color:#f92672">.</span><span style="color:#a6e22e">getRequestId</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">}</span> </span></span></code></pre></div><h3 id="删除一个-object">删除一个 Object</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span>Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">DeleteObjectOutput</span> deleteObjectOutput <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">deleteObject</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;test_file&#34;</span><span style="color:#f92672">);</span> </span></span></code></pre></div><h3 id="本地时间和网络时间不同步">本地时间和网络时间不同步</h3> <p>如果用户本地时间与网络时间不同步会因签名原因造成请求失败。用户还需要从服务端获取网络时间。</p> <ol> <li>获取服务端时间:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span>Calendar instance <span style="color:#f92672">=</span> Calendar<span style="color:#f92672">.</span><span style="color:#a6e22e">getInstance</span><span style="color:#f92672">(</span>TimeZone<span style="color:#f92672">.</span><span style="color:#a6e22e">getTimeZone</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;Asia/Beijing&#34;</span><span style="color:#f92672">));</span> </span></span><span style="display:flex;"><span>String gmtTime <span style="color:#f92672">=</span> QSSignatureUtil<span style="color:#f92672">.</span><span style="color:#a6e22e">formatGmtDate</span><span style="color:#f92672">(</span>instance<span style="color:#f92672">.</span><span style="color:#a6e22e">getTime</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">return</span> gmtTime<span style="color:#f92672">;</span> </span></span></code></pre></div><ol start="2"> <li>将获取到的服务端时间设置到 SDK 中:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span>reqHandler<span style="color:#f92672">.</span><span style="color:#a6e22e">getBuilder</span><span style="color:#f92672">().</span><span style="color:#a6e22e">setHeader</span><span style="color:#f92672">(</span>QSConstant<span style="color:#f92672">.</span><span style="color:#a6e22e">HEADER_PARAM_KEY_DATE</span><span style="color:#f92672">,</span> gmtTime<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span>reqHandler<span style="color:#f92672">.</span><span style="color:#a6e22e">sendAsync</span><span style="color:#f92672">();</span> </span></span></code></pre></div><h3 id="使用服务端签名">使用服务端签名</h3> <p>以上传文件为例:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">javaSdkSendDemo</span><span style="color:#f92672">()</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">try</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">//引入jar包后先把相关导入按照IDE提示一一导入 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">//创建EvnContext </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> EnvContext env <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> EnvContext<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;your_access_key&#34;</span><span style="color:#f92672">,</span> <span style="color:#e6db74">&#34;your_secret_key&#34;</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">//你的bucket所在的zone,比如pek3a </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> String zoneName <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pek3a&#34;</span><span style="color:#f92672">;</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">//bucket名称,如果没有创建先从控制台或者api创建bucket </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> String bucketName <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;demo_bucket&#34;</span><span style="color:#f92672">;</span> </span></span><span style="display:flex;"><span> Bucket bucket <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Bucket<span style="color:#f92672">(</span>env<span style="color:#f92672">,</span> zoneName<span style="color:#f92672">,</span> bucketName<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">//最终上传到对象存储的文件显示的文件名称 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> String objectKey <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;myfile&#34;</span><span style="color:#f92672">;</span> </span></span><span style="display:flex;"><span> Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectInput</span> input <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectInput</span><span style="color:#f92672">();</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">//要上传的本地文件的路径 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> File f <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> File<span style="color:#f92672">(</span><span style="color:#e6db74">&#34;/your_file_path.txt&#34;</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> input<span style="color:#f92672">.</span><span style="color:#a6e22e">setBodyInputFile</span><span style="color:#f92672">(</span>f<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> input<span style="color:#f92672">.</span><span style="color:#a6e22e">setContentLength</span><span style="color:#f92672">(</span>f<span style="color:#f92672">.</span><span style="color:#a6e22e">length</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> RequestHandler reqHandler <span style="color:#f92672">=</span> bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">putObjectAsyncRequest</span><span style="color:#f92672">(</span>objectKey<span style="color:#f92672">,</span> input<span style="color:#f92672">,</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">new</span> ResponseCallBack<span style="color:#f92672">&lt;</span>Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectOutput</span><span style="color:#f92672">&gt;()</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">onAPIResponse</span><span style="color:#f92672">(</span>Bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">PutObjectOutput</span> output<span style="color:#f92672">)</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">if</span> <span style="color:#f92672">(</span>output<span style="color:#f92672">.</span><span style="color:#a6e22e">getStatueCode</span><span style="color:#f92672">()</span> <span style="color:#f92672">!=</span> <span style="color:#ae81ff">201</span><span style="color:#f92672">)</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;Message = &#34;</span> <span style="color:#f92672">+</span> output<span style="color:#f92672">.</span><span style="color:#a6e22e">getMessage</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;RequestId = &#34;</span> <span style="color:#f92672">+</span> output<span style="color:#f92672">.</span><span style="color:#a6e22e">getRequestId</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;Code = &#34;</span> <span style="color:#f92672">+</span> output<span style="color:#f92672">.</span><span style="color:#a6e22e">getCode</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;StatueCode = &#34;</span> <span style="color:#f92672">+</span> output<span style="color:#f92672">.</span><span style="color:#a6e22e">getStatueCode</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">out</span><span style="color:#f92672">.</span><span style="color:#a6e22e">println</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;Url = &#34;</span> <span style="color:#f92672">+</span> output<span style="color:#f92672">.</span><span style="color:#a6e22e">getUrl</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">}</span> </span></span><span style="display:flex;"><span> System<span style="color:#f92672">.</span><span style="color:#a6e22e">exit</span><span style="color:#f92672">(</span><span style="color:#ae81ff">0</span><span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">}</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">});</span> </span></span><span style="display:flex;"><span> Calendar instance <span style="color:#f92672">=</span> Calendar<span style="color:#f92672">.</span><span style="color:#a6e22e">getInstance</span><span style="color:#f92672">(</span>TimeZone<span style="color:#f92672">.</span><span style="color:#a6e22e">getTimeZone</span><span style="color:#f92672">(</span><span style="color:#e6db74">&#34;Asia/Shanghai&#34;</span><span style="color:#f92672">));</span> </span></span><span style="display:flex;"><span> String gmtTime <span style="color:#f92672">=</span> QSSignatureUtil<span style="color:#f92672">.</span><span style="color:#a6e22e">formatGmtDate</span><span style="color:#f92672">(</span>instance<span style="color:#f92672">.</span><span style="color:#a6e22e">getTime</span><span style="color:#f92672">());</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">//验证需要这个Date header </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> reqHandler<span style="color:#f92672">.</span><span style="color:#a6e22e">getBuilder</span><span style="color:#f92672">().</span><span style="color:#a6e22e">setHeader</span><span style="color:#f92672">(</span>QSConstant<span style="color:#f92672">.</span><span style="color:#a6e22e">HEADER_PARAM_KEY_DATE</span><span style="color:#f92672">,</span> gmtTime<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> String strToSignature <span style="color:#f92672">=</span> reqHandler<span style="color:#f92672">.</span><span style="color:#a6e22e">getStringToSignature</span><span style="color:#f92672">();</span> </span></span><span style="display:flex;"><span> String serverAuthorization <span style="color:#f92672">=</span> QSSignatureUtil<span style="color:#f92672">.</span><span style="color:#a6e22e">generateSignature</span><span style="color:#f92672">(</span>env<span style="color:#f92672">.</span><span style="color:#a6e22e">getAccessSecret</span><span style="color:#f92672">(),</span> </span></span><span style="display:flex;"><span> strToSignature<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> reqHandler<span style="color:#f92672">.</span><span style="color:#a6e22e">setSignature</span><span style="color:#f92672">(</span>env<span style="color:#f92672">.</span><span style="color:#a6e22e">getAccessKey</span><span style="color:#f92672">(),</span> serverAuthorization<span style="color:#f92672">);</span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">//异步发送 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> reqHandler<span style="color:#f92672">.</span><span style="color:#a6e22e">sendAsync</span><span style="color:#f92672">();</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">}</span><span style="color:#66d9ef">catch</span> <span style="color:#f92672">(</span>QSException e<span style="color:#f92672">)</span> <span style="color:#f92672">{</span> </span></span><span style="display:flex;"><span> e<span style="color:#f92672">.</span><span style="color:#a6e22e">printStackTrace</span><span style="color:#f92672">();</span> </span></span><span style="display:flex;"><span> <span style="color:#f92672">}</span> </span></span><span style="display:flex;"><span><span style="color:#f92672">}</span> </span></span></code></pre></div> Storage: JavaScript SDK /storage/object-storage/sdk/javascript/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/sdk/javascript/ <p>QingStor 对象存储的 JavaScript SDK 已在 GitHub 开源,本文为简要使用文档。更多详细信息请参见 <a href="https://github.com/yunify/qingstor-sdk-js">GitHub 项目</a>。</p> <h2 id="安装">安装</h2> <p>QingStor 对象存储提供若干安装方式,用户可根据需求进行选用。</p> <p><strong>方式一:</strong> 使用 npm 安装 SDK:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npm install qingstor-sdk </span></span></code></pre></div><p><strong>方式二:</strong> 使用 <a href="https://yarnpkg.com">yarn</a> 安装 SDK:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>yarn add qingstor-sdk </span></span></code></pre></div><p><strong>方式三:</strong> 也可以请前往 <a href="https://github.com/yunify/qingstor-sdk-js/releases">Release</a> 页面下载打包好的 SDK 文件,然后在 HTML 中加上如下格式的 Script 标签引入 SDK,QingStor 对象存储建议用户在开发时使用未压缩的版本,方便调试,在生产环境中使用 <code>qingstor-sdk.min.js</code> 版本。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">script</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://example.com/path/to/qingstor-sdk.js&#34;</span>&gt;&lt;/<span style="color:#f92672">script</span>&gt; </span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">script</span>&gt; </span></span><span style="display:flex;"><span> <span style="color:#75715e">// reference sdk by a global variable: qingstor_sdk </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">qingstor_sdk</span>.<span style="color:#a6e22e">version</span>); </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">qingstor_sdk</span>.<span style="color:#a6e22e">QingStor</span>); </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">qingstor_sdk</span>.<span style="color:#a6e22e">Config</span>); </span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">script</span>&gt; </span></span></code></pre></div><h2 id="快速开始">快速开始</h2> <p>QingStor SDK 使用 ES6 的语法编写,所以使用前请确保你配置了合适的构建环境。</p> <h3 id="浏览器环境">浏览器环境</h3> <p>如果您是在浏览器中使用 SDK,推荐使用 <a href="https://babeljs.io">Babel</a> 对代码进行编译,使用 <a href="https://webpack.js.org">Webpack</a> 打包代码。详细操作步骤如下:</p> <ol> <li>安装 Babel:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npm install --save-dev @babel/core @babel/cli @babel/preset-env </span></span></code></pre></div><ol start="2"> <li>安装完成之后,在项目的根目录下新建 <code>babel.config.js</code> 文件,其内容如下:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">presets</span> <span style="color:#f92672">=</span> [ </span></span><span style="display:flex;"><span> [ </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;@babel/env&#34;</span>, </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">targets</span><span style="color:#f92672">:</span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">edge</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;17&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">firefox</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;60&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">chrome</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;67&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">safari</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;11.1&#34;</span>, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">useBuiltIns</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;usage&#34;</span>, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> ], </span></span><span style="display:flex;"><span>]; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">module</span>.<span style="color:#a6e22e">exports</span> <span style="color:#f92672">=</span> { <span style="color:#a6e22e">presets</span> }; </span></span></code></pre></div><ol start="3"> <li>安装 webpack:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npm install --save-dev webpack webpack-cli </span></span></code></pre></div><ol start="4"> <li>安装完成之后,在项目的根目录下新建 <code>webpack.config.js</code> 文件,其内容如下:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#a6e22e">module</span>.<span style="color:#a6e22e">exports</span> <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">mode</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;development&#39;</span>, </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">// 项目的启动文件, 你可以在这里 import { QingStor } from &#39;qingstor-sdk&#39; </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">entry</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;./index.js&#39;</span>, </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">output</span><span style="color:#f92672">:</span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">filename</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;dist.js&#39;</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">libraryTarget</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;umd&#39;</span>, </span></span><span style="display:flex;"><span> }, </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">module</span><span style="color:#f92672">:</span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">rules</span><span style="color:#f92672">:</span> [ </span></span><span style="display:flex;"><span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">test</span><span style="color:#f92672">:</span> <span style="color:#e6db74">/\.js$/</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">exclude</span><span style="color:#f92672">:</span> <span style="color:#e6db74">/node_modules/</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">use</span><span style="color:#f92672">:</span> { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">loader</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;babel-loader&#39;</span> </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span> ] </span></span><span style="display:flex;"><span> } </span></span><span style="display:flex;"><span>} </span></span></code></pre></div><ol start="5"> <li>在 终端输入如下命令行进行开发,关于 Babel 和 Webpack 配置与使用的更多细节,请参考其官方文档。</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span>.<span style="color:#f92672">/</span><span style="color:#a6e22e">node_module</span><span style="color:#f92672">/</span>.<span style="color:#a6e22e">bin</span><span style="color:#f92672">/</span><span style="color:#a6e22e">webpack</span> <span style="color:#f92672">-</span><span style="color:#a6e22e">w</span> </span></span></code></pre></div><h3 id="node-环境">Node 环境</h3> <p>如果您是在 Node 环境中使用 SDK,推荐使用 <a href="https://github.com/standard-things/esm">esm</a> 来作为 module loader。操作步骤如下:</p> <ol> <li>安装 esm:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npm install esm </span></span></code></pre></div><ol start="2"> <li>使用 esm:</li> </ol> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>node -r esm index.js </span></span></code></pre></div><h3 id="请求签名">请求签名</h3> <p>发往 QingStor 对象存储的请求需要使用 Access Key 和 Secret Key 对请求签名,请前往 <a href="https://console.qingcloud.com/access_keys/">开·云app官方版下载控制台</a> 创建和下载。下载到的密钥文件格式如下,请妥善保存你的密钥:</p> <pre tabindex="0"><code class="language-plain_text" data-lang="plain_text">access_key_id: &#39;ACCESS_KEY_ID_EXAMPLE&#39; secret_access_key: &#39;SECRET_ACCESS_KEY_EXAMPLE&#39; </code></pre><p>如果在 Node.js 环境中使用 SDK,在初始化配置 Config 对象时,可以直接采用如下方式:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">Config</span> } <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#39;qingstor-sdk&#39;</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">config</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Config</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">access_key_id</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;ACCESS_KEY_ID_EXAMPLE&#39;</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">secret_access_key</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;SECRET_ACCESS_KEY_EXAMPLE&#39;</span>, </span></span><span style="display:flex;"><span>}); </span></span></code></pre></div><p>如果在浏览器 Browser 环境中使用 SDK,QingStor 对象存储强烈建议用户部署一个签名服务器,专门用来对请求做签名,这样的好处是不会将 <code>access_key_id</code> 和 <code>secret_access_key</code> 暴露在客户端。</p> <p>签名服务器的代码非常简单,请参考 <a href="https://github.com/yunify/qingstor-sdk-js/blob/master/docs/examples/signaure_server.js">Express 示例</a>。签名服务器部署好之后,请采用如下方式初始化 Config 对象:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">Config</span> } <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#39;qingstor-sdk&#39;</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">config</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Config</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">signature_server</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;https://your.signserver.com/some_path&#39;</span>, </span></span><span style="display:flex;"><span>}); </span></span></code></pre></div><p><strong>备注:</strong> 如果签名服务器的域名和用户当前所在域名不同,需要配置相应的 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS">CORS</a> 规则。</p> <h3 id="获取-bucket-列表">获取 Bucket 列表</h3> <p>在项目中根目录下新建一个 <code>index.js</code> 文件,复制以下内容到文件中:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#75715e">// index.js </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">QingStor</span>, <span style="color:#a6e22e">Config</span> } <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#39;qingstor-sdk&#39;</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// 修改这里的 ACCESS_KEY_ID_EXAMPLE 和 SECRET_ACCESS_KEY_EXAMPLE 为前 </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 一步中得到的 access_key_id 和 secret_access_key </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">config</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Config</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">access_key_id</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;ACCESS_KEY_ID_EXAMPLE&#39;</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">secret_access_key</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;SECRET_ACCESS_KEY_EXAMPLE&#39;</span>, </span></span><span style="display:flex;"><span>}); </span></span><span style="display:flex;"><span><span style="color:#75715e">// or </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">config</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Config</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">signature_server</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;https://your.signserver.com/some_path&#39;</span>, </span></span><span style="display:flex;"><span>}); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">qingstor</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">QingStor</span>(<span style="color:#a6e22e">config</span>); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">listBuckets</span>() { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">qingstor</span>.<span style="color:#a6e22e">listBuckets</span>().<span style="color:#a6e22e">then</span>((<span style="color:#a6e22e">response</span>) =&gt; { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">response</span>.<span style="color:#a6e22e">data</span>); </span></span><span style="display:flex;"><span> <span style="color:#75715e">// 得到如下格式的结果 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// { </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;count&#34;: 2, </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;buckets&#34;: [ </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// { </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;name&#34;: &#34;mybucket&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;location&#34;: &#34;pek3a&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;url&#34;: &#34;https://mybucket.pek3a.qingstor.com&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;created&#34;: &#34;2015-07-11T04:45:57Z&#34; </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// }, </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// { </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;name&#34;: &#34;myphotos&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;location&#34;: &#34;pek3a&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;url&#34;: &#34;https://myphotos.pek3a.qingstor.com&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// &#34;created&#34;: &#34;2015-07-12T09:40:32Z&#34; </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// } </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// ] </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// } </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> }); </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">listBuckets</span>(); </span></span></code></pre></div><h3 id="新建-bucket">新建 Bucket</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">QingStor</span>, <span style="color:#a6e22e">Config</span> } <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#39;qingstor-sdk&#39;</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// 修改这里的 ACCESS_KEY_ID_EXAMPLE 和 SECRET_ACCESS_KEY_EXAMPLE 为前 </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 一步中得到的 access_key_id 和 secret_access_key </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">config</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Config</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">access_key_id</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;ACCESS_KEY_ID_EXAMPLE&#39;</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">secret_access_key</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;SECRET_ACCESS_KEY_EXAMPLE&#39;</span>, </span></span><span style="display:flex;"><span>}); </span></span><span style="display:flex;"><span><span style="color:#75715e">// or </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">config</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Config</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">signature_server</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;https://your.signserver.com/some_path&#39;</span>, </span></span><span style="display:flex;"><span>}); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">qingstor</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">QingStor</span>(<span style="color:#a6e22e">config</span>); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">createBucket</span>() { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">qingstor</span>.<span style="color:#a6e22e">Bucket</span>(<span style="color:#e6db74">&#39;example-bucket&#39;</span>, <span style="color:#e6db74">&#39;sh1a&#39;</span>).<span style="color:#a6e22e">put</span>().<span style="color:#a6e22e">then</span>(({ <span style="color:#a6e22e">status</span> }) =&gt; { </span></span><span style="display:flex;"><span> <span style="color:#75715e">// bucket 创建成功,status 应该为 201 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">status</span>); </span></span><span style="display:flex;"><span> }).<span style="color:#66d9ef">catch</span>((<span style="color:#a6e22e">error</span>) =&gt; { </span></span><span style="display:flex;"><span> <span style="color:#75715e">// bucket 创建失败,打印返回结果 </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">error</span>.<span style="color:#a6e22e">response</span>.<span style="color:#a6e22e">data</span>); </span></span><span style="display:flex;"><span> }); </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">createBucket</span>(); </span></span></code></pre></div><h3 id="获取-bucket-中的文件列表">获取 Bucket 中的文件列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">QingStor</span>, <span style="color:#a6e22e">Config</span> } <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#39;qingstor-sdk&#39;</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// 修改这里的 ACCESS_KEY_ID_EXAMPLE 和 SECRET_ACCESS_KEY_EXAMPLE 为前 </span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 一步中得到的 access_key_id 和 secret_access_key </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">config</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Config</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">access_key_id</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;ACCESS_KEY_ID_EXAMPLE&#39;</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">secret_access_key</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;SECRET_ACCESS_KEY_EXAMPLE&#39;</span>, </span></span><span style="display:flex;"><span>}); </span></span><span style="display:flex;"><span><span style="color:#75715e">// or </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">config</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Config</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">signature_server</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;https://your.signserver.com/some_path&#39;</span>, </span></span><span style="display:flex;"><span>}); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">bucket</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">QingStor</span>(<span style="color:#a6e22e">config</span>).<span style="color:#a6e22e">Bucket</span>(<span style="color:#e6db74">&#39;example-bucket&#39;</span>, <span style="color:#e6db74">&#39;sh1a&#39;</span>); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">listObjects</span>() { </span></span><span style="display:flex;"><span> <span style="color:#75715e">// list objects under perfix &#39;/images&#39; </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">bucket</span>.<span style="color:#a6e22e">listObjects</span>({ </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">limit</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">10</span>, </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">prefix</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;/images&#39;</span>, </span></span><span style="display:flex;"><span> }).<span style="color:#a6e22e">then</span>((<span style="color:#a6e22e">response</span>) =&gt; { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">response</span>.<span style="color:#a6e22e">data</span>); </span></span><span style="display:flex;"><span> }).<span style="color:#66d9ef">catch</span>((<span style="color:#a6e22e">error</span>) =&gt; { </span></span><span style="display:flex;"><span> <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">error</span>.<span style="color:#a6e22e">response</span>.<span style="color:#a6e22e">data</span>); </span></span><span style="display:flex;"><span> }); </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#a6e22e">listObjects</span>(); </span></span></code></pre></div><h2 id="请求返回格式说明">请求返回格式说明</h2> <p>QingStor 对象存储的 SDK 使用 <a href="https://github.com/axios/axios">axios</a> 作为 HTTP 客户端,所有请求的返回都是一个 Promise。axios 的 Response 结构如下:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#75715e">// copied from https://github.com/axios/axios/blob/master/README.md </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>{ </span></span><span style="display:flex;"><span> <span style="color:#75715e">// `data` is the response that was provided by the server </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">data</span><span style="color:#f92672">:</span> {}, </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">// `status` is the HTTP status code from the server response </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">status</span><span style="color:#f92672">:</span> <span style="color:#ae81ff">200</span>, </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">// `statusText` is the HTTP status message from the server response </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">statusText</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#39;OK&#39;</span>, </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">// `headers` the headers that the server responded with </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// All header names are lower cased </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">headers</span><span style="color:#f92672">:</span> {}, </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">// `config` is the config that was provided to `axios` for the request </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">config</span><span style="color:#f92672">:</span> {}, </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span> <span style="color:#75715e">// `request` is the request that generated this response </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// It is the last ClientRequest instance in node.js (in redirects) </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#75715e">// and an XMLHttpRequest instance in the browser </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span> <span style="color:#a6e22e">request</span><span style="color:#f92672">:</span> {} </span></span><span style="display:flex;"><span>} </span></span></code></pre></div> Storage: PHP SDK /storage/object-storage/sdk/php/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/sdk/php/ <p>QingStor 对象存储的 PHP SDK 已在 GitHub 开源,本文为简要使用文档。更多详细信息请参见 <a href="https://github.com/yunify/qingstor-sdk-php">GitHub 项目</a>。</p> <p>使用 SDK 之前请先在 <a href="https://console.qingcloud.com/access_keys/">管理控制台</a> 申请 Access key。</p> <h2 id="安装">安装</h2> <p>使用 Composer 安装:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>&gt; composer require yunify/qingstor-sdk </span></span></code></pre></div><h2 id="初始化服务">初始化服务</h2> <p>发起请求前需要初始化服务。以下代码初始化了一个 QingStor Service。</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">use</span> <span style="color:#a6e22e">QingStor\SDK\Service\QingStor</span>; </span></span><span style="display:flex;"><span><span style="color:#66d9ef">use</span> <span style="color:#a6e22e">QingStor\SDK\Config</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>$config <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">Config</span>(<span style="color:#e6db74">&#34;ACCESS_KEY_ID&#34;</span>, <span style="color:#e6db74">&#34;SECRET_ACCESS_KEY&#34;</span>); </span></span><span style="display:flex;"><span>$service <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">QingStor</span>($config); </span></span></code></pre></div><h2 id="代码示例">代码示例</h2> <h3 id="获取账户下的-bucket-列表">获取账户下的 Bucket 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>$response <span style="color:#f92672">=</span> $test_service<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">listBuckets</span>(); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the response statusCode. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">echo</span> $response<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">statusCode</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the buckets. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">var_dump</span>($response<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">buckets</span>); </span></span></code></pre></div><h3 id="创建-bucket">创建 Bucket</h3> <p>初始化并创建 Bucket, 需要指定 Bucket 名称和所在 Zone:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>$test_bucket <span style="color:#f92672">=</span> $test_service<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">Bucket</span>(<span style="color:#e6db74">&#34;test-bucket&#34;</span>, <span style="color:#e6db74">&#34;pek3a&#34;</span>) </span></span><span style="display:flex;"><span>$response <span style="color:#f92672">=</span> $test_bucket<span style="color:#f92672">.</span><span style="color:#a6e22e">put</span>() </span></span></code></pre></div><h3 id="获取-bucket-中存储的-object-列表">获取 Bucket 中存储的 Object 列表</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>$response <span style="color:#f92672">=</span> <span style="color:#a6e22e">bucket</span><span style="color:#f92672">.</span><span style="color:#a6e22e">listObjects</span>() </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the response statusCode. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">echo</span> $response<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">statusCode</span>; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the objects keys. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">var_dump</span>($response<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">keys</span>); </span></span></code></pre></div><h3 id="创建一个-object">创建一个 Object</h3> <p>上传一个文件:</p> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#75715e">// Put object </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>$response <span style="color:#f92672">=</span> $test_bucket<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">putObject</span>( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;test_file&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">array</span>( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#39;body&#39;</span> <span style="color:#f92672">=&gt;</span> <span style="color:#a6e22e">file_get_contents</span>(<span style="color:#e6db74">&#39;/tmp/test_file&#39;</span>), </span></span><span style="display:flex;"><span> ) </span></span><span style="display:flex;"><span>) </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the response statusCode. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">echo</span> $response<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">statusCode</span>; </span></span></code></pre></div><h3 id="删除一个-object">删除一个 Object</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#75715e">// Delete object </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>$response <span style="color:#f92672">=</span> $test_bucket<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">deleteObject</span>(<span style="color:#e6db74">&#34;test_object&#34;</span>); </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span><span style="color:#75715e">// Print the response statusCode. </span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">echo</span> $response<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">statusCode</span>; </span></span></code></pre></div><h3 id="设置-bucket-acl">设置 Bucket ACL</h3> <div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>$response <span style="color:#f92672">=</span> $test_bucket<span style="color:#f92672">-&gt;</span><span style="color:#a6e22e">putACL</span>( </span></span><span style="display:flex;"><span> <span style="color:#66d9ef">array</span>( </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;acl =&gt; array( </span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> &#34;</span><span style="color:#a6e22e">grantee</span><span style="color:#e6db74">&#34; =&gt; array( </span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> &#34;</span><span style="color:#a6e22e">type</span><span style="color:#e6db74">&#34; =&gt; &#34;</span><span style="color:#a6e22e">user</span><span style="color:#e6db74">&#34;, </span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> &#34;</span><span style="color:#a6e22e">ID</span><span style="color:#e6db74">&#34; =&gt; &#34;</span><span style="color:#a6e22e">usr</span><span style="color:#f92672">-</span><span style="color:#a6e22e">xxxxxxxx</span><span style="color:#e6db74">&#34; </span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> ), </span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> &#34;</span><span style="color:#a6e22e">permission</span><span style="color:#e6db74">&#34; =&gt; &#34;</span><span style="color:#a6e22e">FULL_CONTROL</span><span style="color:#e6db74">&#34; </span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> ) </span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> ) </span></span></span><span style="display:flex;"><span><span style="color:#e6db74">); </span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> </span></span></span><span style="display:flex;"><span><span style="color:#e6db74">// Print the response statusCode. </span></span></span><span style="display:flex;"><span><span style="color:#e6db74">echo </span><span style="color:#e6db74">$response-&gt;statusCode</span><span style="color:#e6db74">; </span></span></span></code></pre></div>