
# 基于表单上传(Node.js SDK)
![](https://support.huaweicloud.com/sdk-nodejs-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
开发过程中，您有任何问题可以在GitHub上[提交issue](https://github.com/huaweicloud/huaweicloud-sdk-nodejs-obs/issues)，或者在[华为云对象存储服务论坛](https://bbs.huaweicloud.com/forum/forum-620-1.html)中发帖求助。
#### 功能说明
基于表单上传是使用HTML表单形式上传对象到指定桶中，对象最大不能超过5GB。
您可以通过ObsClient.createPostSignatureSync生成基于表单上传的请求参数。使用Node.js代码模拟表单上传的完整代码示例，参见[post-object-sample](https://obssdk.obs.cn-north-1.myhuaweicloud.com/sample/nodejs/post-object-sample.zip)。您也可以通过如下步骤进行表单上传：
1. 使用ObsClient.createPostSignatureSync生成用于鉴权的请求参数。
2. 准备表单HTML页面。
3. 将生成的请求参数填入HTML页面。
4. 选择本地文件，进行表单上传。
 
#### 方法定义
```
ObsClient.createPostSignatureSync(params)
```
#### 请求参数
表1请求参数列表 
| **参数名称**   | **类型** | **是否必选** | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|:---|:---|
| Bucket     | string | 必选       | **参数解释** **：** 桶名。 **约束限制：** - 桶的名字需全局唯一，不能与已有的任何桶名称重复，包括其他用户创建的桶。  - 桶命名规则如下： - 3～63个字符，数字或字母开头，支持小写字母、数字、"-"、"."。  - 禁止使用IP地址。  - 禁止以"-"或"."开头及结尾。  - 禁止两个"."相邻（如："my..bucket"）。  - 禁止"."和"-"相邻（如："my-.bucket"和"my.-bucket"）。    - 同一用户在同一个区域多次创建同名桶不会报错，创建的桶属性以第一次请求为准。   **取值范围：** 长度为3～63个字符。 **默认取值：** 无 |
| Key        | string | 必选       | **参数解释：** 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径，路径中不包含桶名。 例如，您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中，对象名为folder/test.txt。 **约束限制：** 无 **取值范围：** 长度大于0且不超过1024的字符串。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| Expires    | Number | 可选       | **参数解释：** 表单上传鉴权的过期时间。 **约束限制：** 无 **取值范围：** 正整数。单位：秒。 **默认取值：** 300                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| FormParams | Object | 可选       | **参数解释：** 除key、policy、signature外，表单上传时的其他参数。 **约束限制：** 无 **取值范围：** - acl  - cache-control  - content-type  - content-disposition  - content-encoding  - expires   **默认取值：** 无                                                                                                                                                                                                                                                                        |
   
#### 返回结果
表2返回结果 
| **参数名称**     | **参数类型** | **描述**                                                             |
|:---|:---|:---|
| OriginPolicy | String   | **参数解释：** Policy未经过base64之前的值，仅用于校验。 |
| Policy       | String   | **参数解释：** 表单中的policy。                 |
| Signature    | String   | **参数解释：** 表单中的signature。           |
   
#### 代码示例
以下代码展示了如何生成基于表单上传的请求参数：
```
// 引入obs库
// 使用npm安装
const ObsClient = require("esdk-obs-nodejs");
// 使用源码安装
// var ObsClient = require('./lib/obs');
// 创建ObsClient实例
const obsClient = new ObsClient({
  // 推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险
  // 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
  access_key_id: process.env.ACCESS_KEY_ID,
  secret_access_key: process.env.SECRET_ACCESS_KEY,
  // 【可选】如果使用临时AK/SK和SecurityToken访问OBS，同样建议您尽量避免使用硬编码，以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK，也可以使用其他外部引入方式传入
  // security_token: process.env.SECURITY_TOKEN,
  // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例，其他地区请按实际情况填写
  server: "https://obs.cn-north-4.myhuaweicloud.com",
});
function createSignedUrlSync() {
  const params = {
    // 指定存储桶名称
    Bucket: "examplebucket",
    // 指定对象，此处以 example/objectname 为例
    Key: "example/objectname",
    // 指定签名URL的过期时间，这里以3600为例，单位为秒
    Expires: 3600,
    // 指定请求中携带的头域
    FormParams: {
      'x-obs-acl': 'public-read',
      'content-type': 'text/plain'
    }
  };
  // 生成上传对象的带授权信息的URL
  const res = obsClient.createPostSignatureSync(params);
  console.log("OriginPolicy : %s", res.OriginPolicy);
  console.log("Policy: %s", res.Policy);
  console.log("Signature: %v", res.Signature);
};
createSignedUrlSync()
```
示例表单HTML代码如下：
```
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form action="http://bucketname.your-endpoint/" method="post" enctype="multipart/form-data">
Object key
<!-- 对象名 -->
<input type="text" name="key" value="objectname" />
<p>
ACL
<!-- 对象ACL权限 -->
<input type="text" name="x-obs-acl" value="public-read" />
<p>
Content-Type
<!-- 对象MIME类型 -->
<input type="text" name="content-type" value="text/plain" />
<p>
<!-- policy的base64编码值 -->
<input type="hidden" name="policy" value="*** Provide your policy ***" />
<!-- AK -->
<input type="hidden" name="AccessKeyId" value="*** Provide your access key ***"/>
<!-- 签名串信息 -->
<input type="hidden" name="signature" value="*** Provide your signature ***"/>
<input name="file" type="file" />
<input name="submit" value="Upload" type="submit" />
</form>
</body>
</html>
```
![](https://support.huaweicloud.com/sdk-nodejs-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
您可以直接下载表单HTML示例[PostDemo](https://obssdk.obs.cn-north-1.myhuaweicloud.com/sample/nodejs/PostDemo.zip)。
