QingCloud 文档 – Object API - kaiyun官方网站下载手机网页 /storage/object-storage/api/object/ Recent content in Object API on QingCloud 文档 Hugo -- gohugo.io Wed, 25 Nov 2020 10:08:56 +0900 Storage: 基础操作 /storage/object-storage/api/object/basic_opt/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/api/object/basic_opt/ <ul> <li>上传对象:<a href="./put">PUT Object</a></li> <li>下载对象:<a href="./get">GET Object</a></li> <li>删除对象:<a href="./delete">Delete Object</a></li> <li>获取对象元数据:<a href="./head">HEAD Object</a></li> <li>拷贝对象:<a href="./copy">PUT Object - Copy</a></li> <li>移动对象:<a href="./move">PUT Object - Move</a></li> <li>导入对象:<a href="./fetch">PUT Object - Fetch</a></li> <li>查询对象:<a href="./options_object">Options Object</a></li> </ul> Storage: Append Object /storage/object-storage/api/object/append/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/api/object/append/ <p>用户可以调用该 API 接口以追加写的方式上传对象到 QingStor 对象存储。通过该接口创建的 Object 类型为 <code>appendable</code>。</p> <h2 id="使用限制">使用限制</h2> <ul> <li>每次追加写的数据不能超过 5 GB,Object 的总大小不能超过 50 TB;</li> <li>非 <code>appendable</code> 类型的 Object 不支持被追加写;</li> <li><code>appendable</code> 类型的 Object 不支持加密;</li> </ul> <h2 id="请求语法">请求语法</h2> <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-http" data-lang="http"><span style="display:flex;"><span><span style="color:#a6e22e">POST</span> /&lt;object-name&gt;?append&amp;position=&lt;position&gt; <span style="color:#66d9ef">HTTP</span><span style="color:#f92672">/</span><span style="color:#ae81ff">1.1</span> </span></span><span style="display:flex;"><span>Host<span style="color:#f92672">:</span> <span style="color:#ae81ff">&lt;bucket-name&gt;.&lt;zone-id&gt;.qingstor.com</span> </span></span><span style="display:flex;"><span>Date<span style="color:#f92672">:</span> <span style="color:#ae81ff">&lt;date&gt;</span> </span></span><span style="display:flex;"><span>Authorization<span style="color:#f92672">:</span> <span style="color:#ae81ff">&lt;authorization-string&gt;</span> </span></span></code></pre></div><h2 id="请求参数">请求参数</h2> <p>调用该接口时,可在 URL 中添加如下参数:</p> <table> <thead> <tr> <th>名称</th> <th>类型</th> <th>说明</th> <th>是否必选</th> </tr> </thead> <tbody> <tr> <td>append</td> <td>String</td> <td>表示以追加写的方式上传 Object</td> <td>是</td> </tr> <tr> <td>position</td> <td>Integer</td> <td>用于指定追加写的位置。首次调用该接口时,指定该值 0,后续调用该接口追加写时,指定该值为前一次返回结果中的 <a href="#%E5%93%8D%E5%BA%94%E5%A4%B4">x-qs-next-append-position</a> 值</td> <td>是</td> </tr> </tbody> </table> <h2 id="请求消息头">请求消息头</h2> <table> <thead> <tr> <th>名称</th> <th>类型</th> <th>说明</th> <th>是否必选</th> </tr> </thead> <tbody> <tr> <td>Content-Length</td> <td>String</td> <td>本次追加写入的数据的大小。</td> <td>是</td> </tr> <tr> <td>Content-Type</td> <td>String</td> <td>Object 类型,首次写入时需指定。</td> <td>否</td> </tr> <tr> <td>Content-MD5</td> <td>String</td> <td>本次追加写入的数据的 MD5 值,用于检查数据在传输过程中是否出错或被篡改。</td> <td>否</td> </tr> <tr> <td>x-qs-storage-class</td> <td>String</td> <td>指定该对象的存储级别,首次写入时需指定。默认值为 <code>STANDARD</code>。可选值为:<br> - <code>STANDARD</code> 表示标准存储;<br> - <code>STANDARD_IA</code> 表示低频存储。</td> <td>否</td> </tr> </tbody> </table> <p>除以上请求头以外,此接口还需要包含 Host、Date 等公共请求头。详细内容可参见 <a href="/storage/object-storage/api/common_header/#%E8%AF%B7%E6%B1%82%E5%A4%B4%E5%AD%97%E6%AE%B5-request-header">公共请求头</a>。</p> <h2 id="请求消息体">请求消息体</h2> <p>无。</p> <h2 id="响应头">响应头</h2> <p>调用该接口后,QingStor 对象存储会返回如下自定义响应头:</p> <table> <thead> <tr> <th>名称</th> <th>类型</th> <th>说明</th> <th>是否必选</th> </tr> </thead> <tbody> <tr> <td>x-qs-next-append-position</td> <td>Interger</td> <td>即当前 Object 大小。作为下一次追加写请求参数 <code>position</code> 的值。</td> <td>是</td> </tr> </tbody> </table> <p>除以上响应头以外,其他公共响应头可参考:<a href="/storage/object-storage/api/common_header/#%E5%93%8D%E5%BA%94%E5%A4%B4%E5%AD%97%E6%AE%B5-response-header">公共响应头</a>。</p> <h2 id="错误码">错误码</h2> <p>成功则返回 200,失败的返回码参考 <a href="/storage/object-storage/api/error_code/#%E9%94%99%E8%AF%AF%E7%A0%81%E5%88%97%E8%A1%A8">错误码列表</a>。</p> <h2 id="示例">示例</h2> <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-http" data-lang="http"><span style="display:flex;"><span><span style="color:#a6e22e">POST</span> /obj-append?append&amp;position=0 <span style="color:#66d9ef">HTTP</span><span style="color:#f92672">/</span><span style="color:#ae81ff">1.1</span> </span></span><span style="display:flex;"><span>Host<span style="color:#f92672">:</span> <span style="color:#ae81ff">mybucket.pek3a.qingstor.com</span> </span></span><span style="display:flex;"><span>Date<span style="color:#f92672">:</span> <span style="color:#ae81ff">Dec, 16 Aug 2019 09:05:00 GMT</span> </span></span><span style="display:flex;"><span>Content-Length<span style="color:#f92672">:</span> <span style="color:#ae81ff">1024</span> </span></span><span style="display:flex;"><span>Authorization<span style="color:#f92672">:</span> <span style="color:#ae81ff">authorization string</span> </span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">[1024</span> <span style="color:#ae81ff">bytes of object data]</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-http" data-lang="http"><span style="display:flex;"><span><span style="color:#66d9ef">HTTP</span><span style="color:#f92672">/</span><span style="color:#ae81ff">1.1</span> <span style="color:#ae81ff">200</span> <span style="color:#a6e22e">OK</span> </span></span><span style="display:flex;"><span>Server<span style="color:#f92672">:</span> <span style="color:#ae81ff">QingStor</span> </span></span><span style="display:flex;"><span>Date<span style="color:#f92672">:</span> <span style="color:#ae81ff">Dec, 16 Aug 2019 09:05:00 GMT</span> </span></span><span style="display:flex;"><span>Content-Length<span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span> </span></span><span style="display:flex;"><span>Connection<span style="color:#f92672">:</span> <span style="color:#ae81ff">close</span> </span></span><span style="display:flex;"><span>x-qs-request-id<span style="color:#f92672">:</span> <span style="color:#ae81ff">3f2cf9ac3168744d</span> </span></span><span style="display:flex;"><span>x-qs-next-append-position<span style="color:#f92672">:</span> <span style="color:#ae81ff">1024</span> </span></span></code></pre></div><h2 id="sdk">SDK</h2> <p>此接口所对应的各语言 SDK 可参考 <a href="/storage/object-storage/sdk/">SDK 文档</a>。</p> Storage: Multipart 分段 /storage/object-storage/api/object/multipart/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/api/object/multipart/ <ul> <li><a href="initiate/">Initiate Multipart Upload 初始化分段上传</a></li> <li><a href="upload/">Upload Multipart Part 上传对象分段</a></li> <li><a href="copy/">Copy Multipart Part 复制对象分段</a></li> <li><a href="list/">List Multipart Parts 列取对象分段</a></li> <li><a href="abort/">Abort Multipart Upload 取消对象分段</a></li> <li><a href="complete/">Complete Multipart Upload 合并对象分段</a></li> </ul> <h2 id="功能概述">功能概述</h2> <p>QingStor 对象存储的 Multipart 接口,提供了多个 API 来实现 Object 分段上传。除了支持客户端上传超过 5G 的大文件以外,还能实现客户端的断点续传,分段并发上传等高级特性。</p> <p>完整的分段上传过程为:</p> <ol> <li>客户端调用 <a href="initiate/">Initiate Multipart Upload</a> 来初始化一个 Object 分段上传。QingStor 对象存储返回该 Object 分段上传的唯一 Upload Id。</li> <li>客户端根据 Object 内容偏移依次读取文件数据,并为每个分段标上大于等于 0 的整数标识后,调用 <a href="upload/">Upload Multipart Part</a> 对每个分段进行上传。</li> <li>客户端使用 <a href="list/">List Multipart Parts</a> 来查看指定 Upload Id 对应的已经上传的分段,以便实现断点续传。</li> <li>在所有分段上传完毕后,客户端调用 <a href="complete/">Complete Multipart Upload</a> 将指定 Upload Id 对应的分段进行合并并得到完整 Object。</li> </ol> <h2 id="注意事项">注意事项</h2> <ul> <li>在上传分段过程中未完成的分段会增加 Bucket 的空间使用量,所以如果要取消上传过程,需要调用 <a href="abort/">Abort Multipart Upload</a> 来清除没用的分段数据。</li> <li>在 Bucket 中所有未完成的分段上传过程,可以通过 <a href="/storage/object-storage/api/bucket/basic_opt/list_multipart_uploads/">List Multipart Uploads</a> 进行查看。</li> <li>若指定 Upload Id 的同一分段多次上传,则最后一次调用会覆盖之前的上传数据。</li> <li>若指定的 Bucket 中已存在同名的 Object,QingStor 对象存储会在该 Object 完整上传完成后,替换已有 Object。</li> </ul> <h2 id="并发操作">并发操作</h2> <ul> <li>Multipart API 均为原子调用,能够支持并发。</li> <li>对同一个 Object 多次调用 <a href="initiate/">Initiate Multipart Upload</a> 得到的 Upload Id 均不同。</li> <li>对同一个 Object 的不同 Upload Id 的内容,调用 <a href="upload/">Upload Multipart Part</a>、<a href="complete/">Complete Multipart Upload</a> 以及 <a href="abort/">Abort Multipart Upload</a> 均为独立过程,不会相互影响。</li> <li>客户端可以对同一个 Upload Id 的各个分段使用多线程来上传,提高网络带宽的利用率。</li> <li>若有多个请求对同一个 Upload Id 的同一个分段序号进行上传,以后传输完成的作为最终结果。</li> </ul> <h2 id="大文件的拷贝">大文件的拷贝</h2> <p>大于 5G 的 Object,QingStor 对象存储不支持直接拷贝。客户端需要为目标位置 Object 调用 <a href="initiate/">Initiate Upload</a>,然后参照 <a href="copy/">Copy Object Part</a> 并附带 <code>x-qs-copy-range</code> 请求头逐段拷贝数据,最后使用 <a href="complete/">Complete Multipart Upload</a> 合并得到目标位置 Object。</p> <h2 id="分段上传限制">分段上传限制</h2> <p>使用 Multipart 上传方式有如下几个限制:</p> <ul> <li>每个分段最大为 5GB。</li> <li>由 Upload Id 唯一标识的一个分段上传过程,最多可以支持的分段数量为 10000。</li> <li>除最后一个分段不限最小长度以外,其它分段最小为 4MB。</li> <li>一个 Object 的各个分片长度不要求一样。</li> </ul> <p>因此,在使用 5GB 大小进行分段的时候,10000 个分段能支持上传最大为 50TB 的 Object;在使用最小分段 4MB 进行分段的时候,10000 个分段能支持上传最大 40GB 的 Object。</p> <p>客户端可以根据实际需求选择分段大小。比如在外网环境,由于公网传输速度是由多种因素决定,其大小可能受到限制,考虑到保证服务端和客户端的交互,QingStor 对象存储建议,此时,客户端可以采用较小的长度来进行分段。</p> <p>目前 <a href="https://console.qingcloud.com/">管理控制台</a> 上传大文件是采用 64MB 来作为分段大小。</p> Storage: Post Object /storage/object-storage/api/object/post/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/api/object/post/ <p>若用户需通过 HTML 表单上传的方式向 Bucket 上传一个 Object,可调用该接口。</p> <h2 id="使用须知">使用须知</h2> <ul> <li>此操作要求请求者对 Bucket 拥有可写权限。</li> <li>该方式开发难度较小,但是由于浏览器自身的限制,没有断点续传、上传进度等用户友好的功能。因此当文件大于 20M 或多个文件上传时,不建议使用该接口。</li> <li>若指定的 Bucket 被设置为匿名用户可写,则请求中可不携带用户认证信息</li> <li>若指定的 Bucket 被设置为匿名用户可写,请求中仍然携带了用户认证信息,则 QingStor 对象存储仍然会对该用户进行认证,当 QingStor 对象存储认证该用户不拥有该 Bucket 的可写权限,该请求返回错误。</li> <li>若同时有多个上传请求写入同一个对象名称,则最后一个被 QingStor 对象存储处理的请求会覆盖之前上传的对象内容。</li> <li>HTML 的表单设置如下:<br><code>action</code> 为 <code>http://&lt;bucket-name&gt;.&lt;zone-id&gt;.qingstor.com</code>,其中 <code>zone-id</code> 可参考 <a href="/storage/object-storage/intro/object-storage/#zone">Zone</a><br> <code>method</code> 必须为 <code>POST</code> <br> <code>enctype</code> 必须为 <code>multipart/form-data</code> <br> Object key 在表单项中设置。</li> <li>考虑到不是所有网站都默认使用 UTF-8,若您的网站需要以 GBK 或 Big5 展示,我们支持在 <code>Form</code> 中声明 <code>charset</code> 字段来定义客户端上传的文件名所用编码。QingStor 对象存储服务端在接收到之后,会将其转换为 UTF-8 的格式来存储,以便兼容跨平台的客户端。但由于不是所有字符都能对应到 UTF-8 码表,转换过程仍有可能出现乱码,所以 QingStor 对象存储建议用户最好使用 UTF-8 来作为上传编码。</li> </ul> <h2 id="请求语法">请求语法</h2> <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-http" data-lang="http"><span style="display:flex;"><span><span style="color:#a6e22e">POST</span> / <span style="color:#66d9ef">HTTP</span><span style="color:#f92672">/</span><span style="color:#ae81ff">1.1</span> </span></span><span style="display:flex;"><span>Host<span style="color:#f92672">:</span> <span style="color:#ae81ff">&lt;bucket-name&gt;.&lt;zone-id&gt;.qingstor.com</span> </span></span><span style="display:flex;"><span>Content-Type<span style="color:#f92672">:</span> <span style="color:#ae81ff">multipart/form-data; boundary=XXXXXX</span> </span></span><span style="display:flex;"><span>Content-Length<span style="color:#f92672">:</span> <span style="color:#ae81ff">length</span> </span></span></code></pre></div><h2 id="请求参数">请求参数</h2> <p>无。</p> <h2 id="请求消息头">请求消息头</h2> <p>此接口仅包含公共请求头。关于公共请求头的更多信息,请参见 <a href="/storage/object-storage/api/common_header/#%E8%AF%B7%E6%B1%82%E5%A4%B4%E5%AD%97%E6%AE%B5-request-header">公共请求头</a>。</p> <h2 id="表单项字段">表单项字段</h2> <table> <thead> <tr> <th>表单字段</th> <th>类型</th> <th>描述</th> <th>是否必须</th> </tr> </thead> <tbody> <tr> <td>access_key_id</td> <td>String</td> <td>Access Key ID。若该 Bucket 没有公开写权限,或含有 <code>policy</code>,则必须指定 <code>access_key_id</code>。</td> <td>否</td> </tr> <tr> <td>signature</td> <td>String</td> <td>签名认证信息。用 Secret Key 对 base64 编码后的 <code>policy</code> 字符串进行 HMAC-SHA256 签名即可。若表单含有 <code>access_key_id</code>,则必须设置该字段。</td> <td>否</td> </tr> <tr> <td>content-type</td> <td>String</td> <td>指定上传的文件类型,若用户上传的文件类型与本设置不一致,返回错误。</td> <td>否</td> </tr> <tr> <td>charset</td> <td>String</td> <td>指定上传的文件名的编码方式。必须与网页开头的 <code>&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=***&quot;&gt;</code> 中 <code>charset</code> 的设置一致。若不指定,QingStor 对象存储默认使用 <code>UTF-8</code> 对上传的文件名进行解码。</td> <td>否</td> </tr> <tr> <td>key</td> <td>String</td> <td>上传文件的 Object Key。有如下限制:<br> - 不可以使用 <code>/</code> 开头。<br> - 可以为普通字符串,也可以是一个模板。<br> - 模板可以使用一些内置的变量,例如 <code>user/tom/${filename}</code>。</td> <td>是</td> </tr> <tr> <td>policy</td> <td>String</td> <td>设置上传文件的访问策略,由多个表单项组成。规则如下:<br> - 将 <code>file</code> 之前的,除 <code>access_key_id</code>,<code>policy</code> 和 <code>signature</code> 以外的所有表单项。以 <code>JSON Object</code> 的格式,UTF-8 编码后进行组装;<br> - 对以上内容进行 Base64 编码;<br> - 若指定 Bucket 对匿名用户可写,则无需设置该字段。<br> - 若有不方便签名的表单项,需将其放置在表单项 <code>file</code> 的之后。</td> <td>否</td> </tr> <tr> <td>redirect</td> <td>String</td> <td>请求结果重定向 URL。重定向跳转时,会在该 URL 后面添加 Query String,包含 <code>status</code>,<code>code</code>,<code>message</code>,<code>request_id</code> 四个参数。 <br> 示例:设置 <code>redirect</code> 为 <code>http://.com/callback</code>,请求成功后会以状态码 <code>302</code> 重定向至: <code>http://.com/callback?status=201&amp;code=created&amp;message=Object+created&amp;request_id=XXXXXX</code></td> <td>否</td> </tr> <tr> <td>file</td> <td>Binary</td> <td>待上传的文件,必须作为最后一个有效表单项。位于该项后面的表单项将被丢弃,故,该项后面的表单项不能作为签名的部分。</td> <td>是</td> </tr> <tr> <td>x-qs-storage-class</td> <td>String</td> <td>指定该对象的存储级别。默认值为 <code>STANDARD</code>,可选值为:<br> - <code>STANDARD</code> 表示标准存储。<br> - <code>STANDARD_IA</code> 表示低频存储</td> <td>否</td> </tr> </tbody> </table> <p><strong>备注:</strong></p> <ul> <li>若要给对象附带支持可修改的元数据,可在表单项里,添加相关字段。详细内容,可参见 <a href="/storage/object-storage/api/metadata/#%E5%8F%AF%E4%BF%AE%E6%94%B9%E7%9A%84%E5%85%83%E6%95%B0%E6%8D%AE">可修改的元数据</a>。</li> <li>表单项 <code>key</code>,若指定为模板,使用内置变量时,如 <code>user/tom/${filename}</code>,其中的 <code>${filename}</code> 参考 <a href="#%E5%86%85%E7%BD%AE%E5%8F%98%E9%87%8F">内置变量说明</a>。</li> </ul> <h2 id="请求消息体">请求消息体</h2> <p>无。</p> <h2 id="响应头">响应头</h2> <p>此接口仅包含公共响应头。关于公共响应头的更多信息,请参见 <a href="/storage/object-storage/api/common_header/#%E5%93%8D%E5%BA%94%E5%A4%B4%E5%AD%97%E6%AE%B5-response-header">公共响应头</a>。</p> <h2 id="错误码">错误码</h2> <p>该 API 为幂等操作. 上传成功返回 201; 假如有重定向则返回 302. 失败的返回码参考 <a href="/storage/object-storage/api/error_code/#%E9%94%99%E8%AF%AF%E7%A0%81%E5%88%97%E8%A1%A8">错误码列表</a>。</p> <h2 id="示例">示例</h2> <p><strong>Signature 字段示例:</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-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> hmac </span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> json </span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> hashlib <span style="color:#f92672">import</span> sha256 </span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> base64 <span style="color:#f92672">import</span> b64encode </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>policy_json <span style="color:#f92672">=</span> { </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;key&#34;</span>: <span style="color:#e6db74">&#34;user/tom/$</span><span style="color:#e6db74">{filename}</span><span style="color:#e6db74">&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;redirect&#34;</span>: <span style="color:#e6db74">&#34;http://&lt;mydomain&gt;.com/callback&#34;</span>, </span></span><span style="display:flex;"><span> <span style="color:#e6db74">&#34;charset&#34;</span>: <span style="color:#e6db74">&#34;UTF-8&#34;</span> </span></span><span style="display:flex;"><span>} </span></span><span style="display:flex;"><span>policy <span style="color:#f92672">=</span> b64encode(json<span style="color:#f92672">.</span>dumps(policy_json)) </span></span><span style="display:flex;"><span>h <span style="color:#f92672">=</span> hmac<span style="color:#f92672">.</span>new(YOUR_SECRET_KEY, digestmod<span style="color:#f92672">=</span>sha256) </span></span><span style="display:flex;"><span>h<span style="color:#f92672">.</span>update(policy) </span></span><span style="display:flex;"><span>signature <span style="color:#f92672">=</span> b64encode(h<span style="color:#f92672">.</span>digest())<span style="color:#f92672">.</span>strip() </span></span></code></pre></div><p><strong>HTML 上传对象:</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-html" data-lang="html"><span style="display:flex;"><span><span style="color:#75715e">&lt;!DOCTYPE html&gt;</span> </span></span><span style="display:flex;"><span>&lt;<span style="color:#f92672">html</span>&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">meta</span> <span style="color:#a6e22e">http-equiv</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Content-Type&#34;</span> <span style="color:#a6e22e">content</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;text/html;charset=UTF-8&#34;</span>&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">h3</span>&gt;Upload&lt;/<span style="color:#f92672">h3</span>&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">form</span> <span style="color:#a6e22e">action</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;http://&lt;bucket-name&gt;.pek3a.qingstor.com&#34;</span> <span style="color:#a6e22e">method</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;POST&#34;</span> <span style="color:#a6e22e">enctype</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;multipart/form-data&#34;</span>&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">hidden</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;policy&#34;</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;eyJrZXkiOiAidXNlci90b20vJHtmaWxlbmFtZX0iLCAicmVkaXJlY3QiOiAiaHR0cDovL215ZG9tYWluLmNvbS9jYWxsYmFjayJ9&#34;</span> /&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">hidden</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;access_key_id&#34;</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;YYY&#34;</span> /&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">hidden</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;signature&#34;</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;XXX&#34;</span> /&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">hidden</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;key&#34;</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;user/tom/${filename}&#34;</span>/&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">hidden</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;charset&#34;</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;UTF-8&#34;</span> /&gt; <span style="color:#75715e">&lt;!-- 该网页为UTF-8 --&gt;</span> </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">hidden</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;redirect&#34;</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;http://&lt;mydomain&gt;.com/callback&#34;</span>/&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">file</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;file&#34;</span> /&gt; </span></span><span style="display:flex;"><span> &lt;<span style="color:#f92672">input</span> <span style="color:#a6e22e">type</span><span style="color:#f92672">=</span><span style="color:#e6db74">submit</span> <span style="color:#a6e22e">name</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Upload&#34;</span> <span style="color:#a6e22e">value</span><span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Upload to QingStor&#34;</span> /&gt; </span></span><span style="display:flex;"><span> &lt;/<span style="color:#f92672">form</span>&gt; </span></span><span style="display:flex;"><span>&lt;/<span style="color:#f92672">html</span>&gt; </span></span></code></pre></div><p><strong>Policy 字段示例:</strong></p> <p>未编码的 JSON 格式 policy 如下:</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-json" data-lang="json"><span style="display:flex;"><span>{<span style="color:#f92672">&#34;key&#34;</span>: <span style="color:#e6db74">&#34;user/tom/${filename}&#34;</span>, <span style="color:#f92672">&#34;redirect&#34;</span>: <span style="color:#e6db74">&#34;http://.com/callback&#34;</span>} </span></span></code></pre></div><p>对应的 base64 编码后的 policy 为:</p> <pre tabindex="0"><code class="language-plain_text" data-lang="plain_text">eyJrZXkiOiAidXNlci90b20vJHtmaWxlbmFtZX0iLCAicmVkaXJlY3QiOiAiaHR0cDovLzxteWRvbWFpbj4uY29tL2NhbGxiYWNrIn0= </code></pre><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-http" data-lang="http"><span style="display:flex;"><span><span style="color:#a6e22e">POST</span> / <span style="color:#66d9ef">HTTP</span><span style="color:#f92672">/</span><span style="color:#ae81ff">1.1</span> </span></span><span style="display:flex;"><span>Host<span style="color:#f92672">:</span> <span style="color:#ae81ff">.pek3a.qingstor.com</span> </span></span><span style="display:flex;"><span>User-Agent<span style="color:#f92672">:</span> <span style="color:#ae81ff">curl/7.30</span> </span></span><span style="display:flex;"><span>Content-Type<span style="color:#f92672">:</span> <span style="color:#ae81ff">multipart/form-data; boundary=1234567890</span> </span></span><span style="display:flex;"><span>Content-Length<span style="color:#f92672">:</span> <span style="color:#ae81ff">length</span> </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>--1234567890 </span></span><span style="display:flex;"><span>Content-Disposition: form-data; name=&#34;access_key_id&#34; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>YYY </span></span><span style="display:flex;"><span>--1234567890 </span></span><span style="display:flex;"><span>Content-Disposition: form-data; name=&#34;policy&#34; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>eyJrZXkiOiAidXNlci90b20vJHtmaWxlbmFtZX0iLCAicmVkaXJlY3QiOiAiaHR0cDovLzxteWRvbWFpbj4uY29tL2NhbGxiYWNrIn0= </span></span><span style="display:flex;"><span>--1234567890 </span></span><span style="display:flex;"><span>Content-Disposition: form-data; name=&#34;signature&#34; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>XXX </span></span><span style="display:flex;"><span>--1234567890 </span></span><span style="display:flex;"><span>Content-Disposition: form-data; name=&#34;key&#34; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>user/tom/${filename} </span></span><span style="display:flex;"><span>--1234567890 </span></span><span style="display:flex;"><span>Content-Disposition: form-data; name=&#34;redirect&#34; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>http://.com/callback </span></span><span style="display:flex;"><span>--1234567890 </span></span><span style="display:flex;"><span>Content-Disposition: form-data; name=&#34;file&#34;; filename=&#34;icon.jpg&#34; </span></span><span style="display:flex;"><span>Content-Type: image/jpeg </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>file_content </span></span><span style="display:flex;"><span>--1234567890 </span></span><span style="display:flex;"><span>Content-Disposition: form-data; name=&#34;Upload&#34; </span></span><span style="display:flex;"><span> </span></span><span style="display:flex;"><span>Upload to QingStor </span></span><span style="display:flex;"><span>--1234567890-- </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-http" data-lang="http"><span style="display:flex;"><span><span style="color:#66d9ef">HTTP</span><span style="color:#f92672">/</span><span style="color:#ae81ff">1.1</span> <span style="color:#ae81ff">302</span> <span style="color:#a6e22e">Found</span> </span></span><span style="display:flex;"><span>Server<span style="color:#f92672">:</span> <span style="color:#ae81ff">QingStor</span> </span></span><span style="display:flex;"><span>Date<span style="color:#f92672">:</span> <span style="color:#ae81ff">Sun, 16 Aug 2015 09:05:00 GMT</span> </span></span><span style="display:flex;"><span>ETag<span style="color:#f92672">:</span> <span style="color:#ae81ff">&#34;0c2f573d81194064b129e940edcefe9b&#34;</span> </span></span><span style="display:flex;"><span>Content-Length<span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span> </span></span><span style="display:flex;"><span>Connection<span style="color:#f92672">:</span> <span style="color:#ae81ff">close</span> </span></span><span style="display:flex;"><span>x-qs-request-id<span style="color:#f92672">:</span> <span style="color:#ae81ff">aa08cf7a43f611e5886952542e6ce14b</span> </span></span><span style="display:flex;"><span>Location<span style="color:#f92672">:</span> <span style="color:#ae81ff">http://.com/callback?status=201&amp;code=created&amp;message=Object+created&amp;request_id=aa08cf7a43f611e5886952542e6ce14b</span> </span></span></code></pre></div><h2 id="sdk">SDK</h2> <p>此接口所对应的各语言 SDK 可参考 <a href="/storage/object-storage/sdk/">SDK 文档</a>。</p> <h2 id="内置变量">内置变量</h2> <table> <thead> <tr> <th>名字</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td>filename</td> <td>用户上传文件的文件名,默认为空。若该文件名中包含有目录,则仅需保留最后一个 <code>\</code> 或 <code>/</code> 之后的内容</td> </tr> </tbody> </table> Storage: 数据加密 /storage/object-storage/api/object/encryption/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/api/object/encryption/ <p>该 API 接口用于对用户上传的 Object 进行加密处理。QingStor 对象存储支持由用户提供密钥的加密方式,对上传的 Object 进行加密。</p> <h2 id="注意事项">注意事项</h2> <ul> <li>QingStor 对象存储服务端不保存用户的密钥。</li> </ul> <h2 id="什么是加密">什么是加密</h2> <h3 id="加密过程">加密过程</h3> <ol> <li>客户端自主生成密钥及密钥的 MD5 值,在上传 Object 时,通过 <a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a> 指定加密算法、密钥、和密钥 MD5 值。</li> <li>QingStor 对象存储服务端根据用户提供的密钥,自主生成密钥 MD5 值,并将其与用户上传的密钥 MD5 值进行比对,以确认密钥在传输过程中的完整性。</li> <li>当经过比对后,两者的密钥 MD5 值不一致,QingStor 对象存储返回失败,并丢弃用户上传的 Object。</li> <li>当经过比对后,两者的密钥 MD5 值一致,QingStor 对象存储服务端对上传的 Object 进行加密。</li> <li>加密完成后,QingStor 对象存储服务端丢弃用户上传的密钥,仅保存加密算法和密钥 MD5 值。</li> </ol> <h3 id="解密过程">解密过程</h3> <ol> <li>客户端在获取 Object 时,通过 <a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a> 指定加密算法、密钥、和密钥 MD5 值。密钥须为上传时所指定的加密密钥。</li> <li>QingStor 对象存储服务端根据用户提供的密钥,自主生成密钥 MD5 值,并将其与用户上传的密钥 MD5 值进行比对,以确认密钥在传输过程中的完整性。</li> <li>当经过比对后,两者的密钥 MD5 值不一致,QingStor 对象存储返回失败。</li> <li>当经过比对后,两者的密钥 MD5 值一致,QingStor 对象存储服务端将 Object 用请求头中指定的密钥解密并返回至客户端。</li> </ol> <h2 id="如何使用加密">如何使用加密</h2> <h3 id="加密请求头">加密请求头</h3> <p>除 <a href="/storage/object-storage/api/common_header/#%E8%AF%B7%E6%B1%82%E5%A4%B4%E5%AD%97%E6%AE%B5-request-header">公共请求头</a>。 外,用户还需在请求头中添加如下头字段,用以指定加密算法、密钥、以及密钥 MD5 值。QingStor 对象存储根据该信息,对上传的 Object 进行加密。</p> <table> <thead> <tr> <th>头字段</th> <th>类型</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>x-qs-encryption-customer-algorithm</td> <td>String</td> <td>指定加密算法。目前仅支持 <code>AES256</code>。</td> </tr> <tr> <td>x-qs-encryption-customer-key</td> <td>String</td> <td>用户提供的密钥。密钥必须进行 Base64 编码处理,对于 <code>AES256</code> 的密钥,明文长度必须为 32 字节。</td> </tr> <tr> <td>x-qs-encryption-customer-key-MD5</td> <td>String</td> <td>用户提供的密钥的 MD5,用于检查密钥在传输过程中的完整性。密钥 MD5 必须进行 Base64 编码处理。</td> </tr> </tbody> </table> <h3 id="加密响应头">加密响应头</h3> <table> <thead> <tr> <th>头字段</th> <th>类型</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>x-qs-encryption-customer-algorithm</td> <td>String</td> <td>加密时所用的加密算法</td> </tr> <tr> <td>x-qs-encryption-customer-key-md5</td> <td>String</td> <td>加密时所用的密钥的 MD5</td> </tr> </tbody> </table> <h3 id="get-object">GET Object</h3> <p>若用户需从指定的 Bucket,获取之前存储的加密对象,可以使用 <a href="../basic_opt/get/">GET Object</a> 接口,并携带该加密对象的加密信息。即:<a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a>。</p> <p>除 <a href="/storage/object-storage/api/common_header/#%E5%93%8D%E5%BA%94%E5%A4%B4%E5%AD%97%E6%AE%B5-response-header">公共响应头</a> 外,QingStor 对象存储服务端还会返回 <a href="#%E5%8A%A0%E5%AF%86%E5%93%8D%E5%BA%94%E5%A4%B4">加密响应头</a>。</p> <h3 id="put-object">PUT Object</h3> <p>若用户上传 Object 时需加密,可以使用 <a href="../basic_opt/put/">PUT Object</a> 接口,并携带 <a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a>。</p> <p>除 <a href="/storage/object-storage/api/common_header/#%E5%93%8D%E5%BA%94%E5%A4%B4%E5%AD%97%E6%AE%B5-response-header">公共响应头</a> 外,QingStor 对象存储服务端还会返回 <a href="#%E5%8A%A0%E5%AF%86%E5%93%8D%E5%BA%94%E5%A4%B4">加密响应头</a>。</p> <h3 id="put-object---copy">PUT Object - Copy</h3> <p>用户可使用 <a href="../basic_opt/copy/">PUT Object - Copy</a> 接口拷贝加密 Object。拷贝 Object 的过程可分为:读取源 Object 与写入目标 Object。并且,QingStor 对象存储默认拷贝 Object 时,不会包含源 Object 的加密信息。</p> <p>因此,用户需提供源加密 Object 的加密信息,用于成功读取源加密 Object。写入目标 Object 时,若用户仍需加密,此时需再次提供加密信息,用于对目标 Object 进行加密。</p> <p>整个过程,用户需提供两个加密信息:源 Object 的加密信息与目标 Object 的加密信息。目标 Object 的加密信息,就是 <a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a>。源 Object 的加密信息,则使用如下请求头字段:</p> <table> <thead> <tr> <th>头字段</th> <th>类型</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>x-qs-copy-source-encryption-customer-algorithm</td> <td>String</td> <td>源对象的加密算法 。目前仅支持 <code>AES256</code>。</td> </tr> <tr> <td>x-qs-copy-source-encryption-customer-key</td> <td>String</td> <td>源对象的密钥。密钥必须进行 Base64 编码处理,对于 <code>AES256</code> 的密钥,明文长度必须为 32 字节。</td> </tr> <tr> <td>x-qs-copy-source-encryption-customer-key-md5</td> <td>String</td> <td>源对象的密钥的 MD5。密钥 MD5 必须进行 Base64 编码处理。</td> </tr> </tbody> </table> <h3 id="put-object---move">PUT Object - Move</h3> <p>若用户需移动指定加密 Object,可以直接使用 <a href="../basic_opt/move/">GET Object - Move</a> 接口,无需添加额外的头字段。移动后,目标 Object 会保留 源 Object 的所有密文和元数据。</p> <h3 id="head-object">HEAD Object</h3> <p>用户如需获取加密对象的元数据,可直接使用 <a href="../basic_opt/head/">HEAD Object</a> 接口,无需携带 <a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a>。若用户需验证加密算法和密钥是否正确,则可以在使用 <a href="../basic_opt/head/">HEAD Object</a> 接口时,提供 <a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a> 一节中定义的头字段。</p> <h3 id="加密分段上传">加密分段上传</h3> <p>QingStor 对象存储要求所有分段均使用相同的加密算法与密钥。因此,在初始化分段上传时,QingStor 对象存储会保存密钥的 MD5 用来验证后续上传分段的密钥是否相同。</p> <table> <thead> <tr> <th>API</th> <th>描述</th> </tr> </thead> <tbody> <tr> <td><a href="/storage/object-storage/api/object/multipart/initiate">Initiate Multipart Upload</a></td> <td>使用 <a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a> 一节中定义的头字段来初始化一个加密对象的分段上传。</td> </tr> <tr> <td><a href="/storage/object-storage/api/object/multipart/upload">Upload Object Part</a></td> <td>上传一个分段时,使用 <a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a> 一节中定义的加密请求头部,以加密分段。</td> </tr> <tr> <td><a href="/storage/object-storage/api/object/multipart/copy">Copy Object Part</a></td> <td>若源对象是加密的,则需要使用 <a href="#put-object---copy">PUT Object - Copy</a> 一节中定义的头字段。若需为目标对象加密,可指定 <a href="#%E5%8A%A0%E5%AF%86%E8%AF%B7%E6%B1%82%E5%A4%B4">加密请求头</a> 一节中定义的头字段。</td> </tr> <tr> <td><a href="/storage/object-storage/api/object/multipart/complete">Complete Multipart Upload</a></td> <td>完成加密对象的分段上传,无需提供加密请求头。</td> </tr> <tr> <td><a href="/storage/object-storage/api/object/multipart/abort">Abort Multipart Upload</a></td> <td>中止加密对象的分段上传,无需提供加密请求头。</td> </tr> </tbody> </table> Storage: 图片处理 /storage/object-storage/api/object/image_process/ Mon, 01 Jan 0001 00:00:00 +0000 /storage/object-storage/api/object/image_process/ <p>用户可以调用该 API 接口对存储于 QingStor 对象存储上的图片进行各种基本处理。</p> <p>目前 QingStor 对象存储支持的图片操作类型有:查看图片信息;对图片进行剪裁,旋转,缩放;给图片添加文字水印,图片水印;将图片另存为,以及对图片进行格式的转换。</p> <p>详细可参考:</p> <ul> <li><a href="/storage/object-storage/api/object/image_process/info/">图片信息</a></li> <li><a href="/storage/object-storage/api/object/image_process/crop/">图片裁剪</a></li> <li><a href="/storage/object-storage/api/object/image_process/rotate/">图片旋转</a></li> <li><a href="/storage/object-storage/api/object/image_process/resize/">图片缩放</a></li> <li><a href="/storage/object-storage/api/object/image_process/watermark/">文字水印</a></li> <li><a href="/storage/object-storage/api/object/image_process/watermark_image/">图片水印</a></li> <li><a href="/storage/object-storage/api/object/image_process/save/">图片另存</a></li> <li><a href="/storage/object-storage/api/object/image_process/format/">图片格式转换</a></li> </ul> <h2 id="注意事项">注意事项</h2> <ul> <li>QingStor 对象存储目前暂不支持对加密后的图片进行处理</li> <li>QingStor 对象存储目前可处理的单张图片最大为 10M。</li> </ul> <h2 id="通用格式">通用格式</h2> <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-http" data-lang="http"><span style="display:flex;"><span><span style="color:#a6e22e">GET</span> /&lt;object-name&gt;?image&amp;action=&lt;operation:k_v[,k_v][|operation:k_v][,k_v]&gt; <span style="color:#66d9ef">HTTP</span><span style="color:#f92672">/</span><span style="color:#ae81ff">1.1</span> </span></span><span style="display:flex;"><span>Host<span style="color:#f92672">:</span> <span style="color:#ae81ff">&lt;bucket-name&gt;.pek3a.qingstor.com</span> </span></span><span style="display:flex;"><span>Date<span style="color:#f92672">:</span> <span style="color:#ae81ff">&lt;date&gt;</span> </span></span><span style="display:flex;"><span>Authorization<span style="color:#f92672">:</span> <span style="color:#ae81ff">&lt;authorization-string&gt;</span> </span></span></code></pre></div><h3 id="请求参数">请求参数</h3> <p>调用该接口时,如 <a href="#%E8%AF%B7%E6%B1%82%E8%AF%AD%E6%B3%95">请求语法</a> 中内容所示,URL 中添加有相关参数。各参数字段说明如下:</p> <table> <thead> <tr> <th>名称</th> <th>类型</th> <th>说明</th> <th>是否必选</th> </tr> </thead> <tbody> <tr> <td>action</td> <td>String</td> <td>对图片的一组操作。</td> <td>是</td> </tr> <tr> <td>operation</td> <td>String</td> <td>对图片的基本操作。详情请参考前文内容。<br>- 每个 <code>operation</code> 可以有多个键值对作为参数,多个键值对之间使用分隔符 <code>,</code> 隔开;<br>- 多个 <code>operation</code> 之间使用分隔符 <code>|</code> 隔开。</td> <td>是</td> </tr> <tr> <td>k</td> <td>Char</td> <td><code>operation</code> 的参数名</td> <td>是</td> </tr> <tr> <td>v</td> <td>Integer</td> <td><code>operation</code> 的参数值</td> <td>是</td> </tr> </tbody> </table> <h3 id="请求示例">请求示例</h3> <p>将图片按照 300*400(px) 进行固定宽高的缩略,并翻转 90 度。请求示例如下:</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-http" data-lang="http"><span style="display:flex;"><span><span style="color:#a6e22e">GET</span> /myphoto.jpg?image&amp;action=resize:w_300,h_400|rotate:a_90 <span style="color:#66d9ef">HTTP</span><span style="color:#f92672">/</span><span style="color:#ae81ff">1.1</span> </span></span><span style="display:flex;"><span>Host<span style="color:#f92672">:</span> <span style="color:#ae81ff">mybucket.pek3a.qingstor.com</span> </span></span><span style="display:flex;"><span>Date<span style="color:#f92672">:</span> <span style="color:#ae81ff">Sun, 16 Aug 2015 09:05:00 GMT</span> </span></span><span style="display:flex;"><span>Authorization<span style="color:#f92672">:</span> <span style="color:#ae81ff">authorization string</span> </span></span></code></pre></div><h3 id="图片格式">图片格式</h3> <p>不同的图片操作类型,所支持的图片格式也有所区别。详情可参考下表:</p> <table> <thead> <tr> <th>操作类型</th> <th>jpeg</th> <th>png</th> <th>webp</th> <th>tiff</th> <th>gif</th> <th>svg</th> <th>pdf</th> </tr> </thead> <tbody> <tr> <td>图片信息</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> </tr> <tr> <td>图片裁剪</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>N</td> <td>N</td> <td>N</td> </tr> <tr> <td>图片旋转</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>N</td> <td>N</td> <td>N</td> </tr> <tr> <td>图片缩放</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>N</td> <td>N</td> </tr> <tr> <td>文字水印</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>N</td> <td>N</td> <td>N</td> </tr> <tr> <td>图片水印</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>N</td> <td>N</td> <td>N</td> </tr> <tr> <td>图片另存</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> </tr> <tr> <td>图片格式转换</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>Y</td> <td>N</td> <td>N</td> <td>N</td> </tr> </tbody> </table>