# 上传文件

当审批表单中有图片或者附件控件时，开发者需要在调用[创建审批实例](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/approval-v4/instance/create)前，将传入图片或附件控件的文件通过本接口上传到审批系统，接口会返回文件的 code，该 code 用于创建审批实例时为图片或附件控件赋值。

例如，以下是创建审批实例时，图片控件值示例，其中的 value 为本接口返回的图片 code。

```json
{
    "id":"widget1",
    "type":"image",
    "value": ["D93653C3-2609-4EE0-8041-61DC1D84F0B5"]
}
```

## 使用限制

- 每次只能上传一个文件，如有多个文件，请分多次上传。文件类型 **image**（图片） 或 **attachment**（附件）取决于审批定义表单控件中的具体类型，请按定义使用。
- 附件上传大小限制为 50 M，图片上传大小为 10 M。

## 请求

基本 | &nbsp;
---|---
HTTP URL | https://www.feishu.cn/approval/openapi/v2/file/upload
HTTP Method | POST
支持的应用类型 | Custom App、Store App
权限要求<br>**调用该 API 所需的权限。开启其中任意一项权限即可调用** | 访问审批应用(approval:approval:readonly)

### 请求头

名称 | 类型 | 必填 | 描述
---|---|---|---
Authorization | string | 是 | `tenant_access_token`<br>以应用身份调用 API，可读写的数据范围由应用自身的 [数据权限范围](https://open.feishu.cn/document/home/introduction-to-scope-and-authorization/configure-app-data-permissions) 决定。参考 [自建应用获取 tenant_access_token](https://open.feishu.cn/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/tenant_access_token_internal) 或 [商店应用获取 tenant_access_token](https://open.feishu.cn/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/tenant_access_token)。<br>**值格式**："Bearer `access_token`"<br>**示例值**："Bearer t-7f1bcd13fc57d46bac21793a18e123"<br>[了解更多：如何选择与获取 access token](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-choose-which-type-of-token-to-use)
Content-Type | string | 是 | **固定值**："multipart/form-data"

### 请求体

| 名称         | 类型           | 是否必须        | 说明        |
| --------- | --------------- | -------   | --------- |
|name | string | 是 |  文件名，需包含文件扩展名。例如 `文件.doc` |
|type |string | 是 | 文件类型。取值 **image**（图片）或 **attachment**（附件）|
|content | file | 是 |文件 |

### 请求体示例

```json
{
	"name":"123.doc",
	"type":"attachment",
	"content":123.doc
}
````

### SDK 调用示例

使用[服务端 SDK](https://open.feishu.cn/document/ukTMukTMukTM/uETO1YjLxkTN24SM5UjN) 时，需要以原生模式调用该接口，以 Java SDK 为例，调用接口的示例代码如下所示。

```java
public void uploadApprovalFile() {
    File file = new File("1.txt");
    FormData formData = new FormData();
    formData.addField("name", file.getName());
    formData.addField("type", "attachment");
    formData.addFile("content", file);
    RawResponse rawResponse = client.post("https://www.feishu.cn/approval/openapi/v2/file/upload", formData, AccessTokenType.Tenant);
}
```

各开发语言 SDK 内原生模式使用说明，参考：

- [Java SDK](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/server-side-sdk/java-sdk-guide/invoke-server-api#16086ee2)
- [Golang SDK](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/server-side-sdk/golang-sdk-guide/calling-server-side-apis#16086ee2)
- [Python SDK](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/server-side-sdk/python--sdk/invoke-server-api#200a09d7)
- [NodeJS SDK](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/server-side-sdk/nodejs-sdk/invoke-server-api#200a09d7)

## 响应

### 响应体

| 参数         |类型         | 说明        |
| --------- | ----------| --------- |
|code |int  |错误码，非 0 表示失败 |
|msg | string | 返回码的描述|
|data | map | 返回业务信息 |
|&emsp;∟code|string| 文件标识码。用于[创建审批实例](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/approval-v4/instance/create)时，传入图片控件或附件控件的 value 参数。|
|&emsp;∟url|string| 文件 url|
**注意**：返回的 url 有效期为 12 小时。发起审批后，每次获取审批详情都会获得新的 url。如果 url 打不开，请检查 url 的参数中是否包含`\\u0026`，因`&`被转义成了`\\u0026`，只需要将`\\u0026`替换成`&`符号即可打开。
### 响应体示例

```json
{
    "code":0,
    "msg":"success",
    "data": {
        "code": "D93653C3-2609-4EE0-8041-61DC1D84F0B5",
        "url": "https://example.com/lark-approval-attachment/image/20210819/a8c1a1f1-47ae-4147-9deb-a8bf2c1234.jpg~image.image?x-expires=1634941234&x-signature=1234Tfv50ryUesNwKTUTnBlJivY%3D#.jpg"
    }
}
```

错误码信息，参见[通用错误码](https://open.feishu.cn/document/ukTMukTMukTM/ugjM14COyUjL4ITN)。