您可以通过WebOffice在线编辑功能,直接编辑文字文档(Word)、演示文档(PPT)、表格文档(Excel)。
使用场景
协同办公平台:多个用户需要实时协作编辑同一文档。
内容管理系统:企业级内容管理系统需要在线编辑文档,直接在系统内进行增删改查。
教育平台:在线教育平台让学生提交作业或教师编写课件,文档保存在云端,方便查阅和分享。
支持的文件类型
文件类型 | 文件后缀 |
Word | doc、dot、wps、wpt、docx、dotx、docm、dotm |
PPT | ppt、pptx、pptm、ppsx、ppsm、pps、potx、potm、dpt、dps |
Excel | xls、xlt、et、xlsx、xltx、xlsm、xltm |
如何使用
前提条件
在OSS中创建存储空间(Bucket),上传需要编辑的Office文档至Bucket中,并为该Bucket绑定智能媒体管理(IMM)的 Project,IMM Project需要跟Bucket在同一地域下。
通过配额中心申请开启新版本IMM Get和Post数据处理能力。
需要您绑定自定义域名至Bucket默认域名,通过自定义域名访问文件时才能打开编辑。
说明如提示域名未配置至小程序的WebView白名单,请通过钉钉用户群(钉钉群号:88490020073)联系智能媒体管理技术支持。技术支持人员将根据用户提供的微信可信域名验证文件进行白名单配置。
获取URL链接进行编辑
Java
要求使用3.17.4及以上版本的Java SDK,Java SDK的安装请参见安装。
package com.aliyun.oss.demo;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws Throwable {
// 请填写您的自定义域名。例如http://static.example.com。
String endpoint = "http://static.example.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径。如果图片不在Bucket根目录,需携带图片完整路径,例如exampledir/exampleobject.jpg
String objectName = "exampledir/exampleobject.png";
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
String region = "cn-hangzhou";
// 创建OSSClient实例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// 请注意,设置true开启CNAME选项。
clientBuilderConfiguration.setSupportCname(true);
// 显式声明使用 V4 签名算法
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 文档处理参数
String style = "doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60";
// 指定签名URL过期时间为3600秒)
Date expiration = new Date(new Date().getTime() + 3600 );
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
req.setExpiration(expiration);
req.setProcess(style);
URL signedUrl = ossClient.generatePresignedUrl(req);
System.out.println(signedUrl);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
Python
要求使用Python SDK 2.18.4及以上版本,Python SDK的安装请参见安装。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填写Bucket名称
bucket = 'examplebucket'
# 请填写您的自定义域名。例如https://static.example.com。
endpoint = 'https://static.example.com'
# 填写阿里云通用Region ID
region = 'cn-hangzhou'
# 使用自定义域名初始化bucket,若您使用的是默认域名,则为bucket = oss2.Bucket(auth, endpoint, bucket, region=region)
bucket = oss2.Bucket(auth, endpoint, bucket, is_cname=True, region=region)
# 指定处理文件
key = 'example.docx'
# 指定过期时间,单位秒
expire_time = 3600
# 构建在线预览的处理指令。
image_process = 'doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60'
# 生成签名URL,带上处理参数
url = bucket.sign_url('GET', key, expire_time, params={'x-oss-process': image_process}, slash_safe=True)
# 打印签名URL
print(url)
Go
要求使用Go SDK 3.0.2及以上版本,Go SDK的安装请参见安装OSS Go SDK。
package main
import (
"context"
"flag"
"log"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// 定义全局变量
var (
region string // 存储区域
bucketName string // 存储空间名称
objectName string // 对象名称
)
// init函数用于初始化命令行参数
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
// 解析命令行参数
flag.Parse()
// 检查bucket名称是否为空
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// 检查region是否为空
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 检查object名称是否为空
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// 加载默认配置并设置凭证提供者和区域
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region).
// 请填写您的自定义域名。例如http://static.example.com。
WithEndpoint("http://static.example.com").
WithUseCName(true)
// 创建OSS客户端
client := oss.NewClient(cfg)
// 生成GetObject的预签名URL
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
// 设置文档处理参数
Process: oss.Ptr("doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60"),
}, oss.PresignExpires(10*time.Minute))
if err != nil {
log.Fatalf("failed to get object presign %v", err)
}
log.Printf("request method:%v\n", result.Method)
log.Printf("request expiration:%v\n", result.Expiration)
log.Printf("request url:%v\n", result.URL)
if len(result.SignedHeaders) > 0 {
// 当返回结果包含签名头时,使用签名URL发送GET请求时也包含相应的请求头,以免出现不一致,导致请求失败和签名错误
log.Printf("signed headers:\n")
for k, v := range result.SignedHeaders {
log.Printf("%v: %v\n", k, v)
}
}
}
Node.js
要求使用Node.js SDK 8.0及以上版本,Node.js SDK的安装请参见安装。
const OSS = require("ali-oss");
// 定义一个生成签名 URL 的函数
async function generateSignatureUrl(fileName) {
// 获取签名URL
const client = await new OSS({
// 请填写您的自定义域名。例如http://static.example.com。
endpoint: 'http://static.example.com',
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'oss-cn-hangzhou',
authorizationV4: true,
cname: true
});
// 生成签名URL,并包含文档处理参数
return await client.signatureUrlV4('GET', 3600, {
headers: {}, // 请根据实际发送的请求头设置此处的请求头
queries: {
"x-oss-process": "doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60" // 添加文档处理参数
}
}, fileName);
}
// 调用函数并传入文件名
generateSignatureUrl('yourFileName').then(url => {
console.log('Generated Signature URL:', url);
}).catch(err => {
console.error('Error generating signature URL:', err);
});
PHP
要求使用PHP SDK 2.7.0及以上版本,PHP SDK的安装请参见安装。
<?php
if (is_file(__DIR__ . '/../autoload.php'))
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
//请填写您的自定义域名。例如http://static.example.com。
$endpoint = "http://static.example.com";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";
// 如果文档位于Bucket根目录,则直接填写文档名称。如果文档不在Bucket根目录,需携带文档完整路径,例如exampledir/example.docx。
$key = 'example.docx';
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"cname" => true,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// 生成一个带图片处理参数的签名的URL,有效期是3600秒,可以直接使用浏览器访问。
$timeout = 3600;
$options = array(
// 构建在线预览的处理指令。
OssClient::OSS_PROCESS => "doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60");
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
print("rtmp url: \n" . $signedUrl);
生成的签名URL示例如下:
http://static.example.com/example.docx?x-oss-process=doc%2Fedit%2Cexport_1%2Cprint_1%2Fwatermark%2Ctext_5YaF6YOo6LWE5paZ%2Csize_30%2Ct_60&x-oss-date=20250220T095032Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI********************%2F20250122%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=514ed93accdb80921c4b2897c6147fdb1599308c6457f68ee0ac2f771c7d0312
复制生成的URL并粘贴到浏览器地址栏,按回车键即可编辑WebOffice文档。
参数说明
操作名称:doc/edit
具体参数如下表所示。
参数名称 | 类型 | 是否必须 | 描述 |
int | 否 | 是否允许打印。取值:
| |
export | int | 否 | 是否允许导出为PDF。取值:
|
watermark | string | 否 | 水印参数。 |
text | string | 否 | 水印文字。需经过URL Safe的Base64编码。具体操作,请参见水印编码,推荐通过base64url encoder进行编码。 父节点:watermark |
size | int | 否 | 水印文字字号,取大于0的整数。 父节点:watermark |
t | int | 否 | 水印文字透明度。取值范围:0~100。默认值:100,表示透明度100%(不透明)。 父节点:watermark |
color | string | 否 | 水印文字颜色,RGB颜色值。默认值为#FFFFFF。 例如:#000000表示黑色,#FFFFFF表示白色。 父节点:watermark |
rotate | int | 否 | 指定文字顺时针旋转角度。取值范围:0~360。 默认值为0,表示不旋转。 父节点:watermark |
type | string | 否 | 指定文字水印的字体,需经过URL Safe的Base64编码。具体操作,请参见水印编码,推荐通过base64url encoder进行编码。 支持的字体如下:
父节点:watermark |
相关API
以上操作方式底层基于API实现,如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。关于公共请求头Authorization的计算方法,请参见签名版本4(推荐)。
编辑信息
编辑文档名称:example.docx
编辑页面水印信息:
水印类型:文字水印
水印文字:内部资料
水印字号:30号字体
水印透明度:60
编辑页面权限信息:允许用户导出和打印
处理示例
GET /example.docx?x-oss-process=doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60 HTTP/1.1
Host: doc-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: SignatureValue
权限说明
阿里云账号默认拥有全部权限。阿里云账号下的RAM用户或RAM角色默认没有任何权限,需要阿里云账号或账号管理员通过RAM Policy或Bucket Policy授予操作权限。
API | Action | 说明 |
GetObject |
| 下载Object。 |
| 下载Object时,如果通过versionId指定了Object的版本,则需要授予此操作的权限。 | |
| 下载Object时,如果Object的元数据包含X-Oss-Server-Side-Encryption: KMS,则需要此操作的权限。 |
API | Action | 说明 |
无 |
| 通过OSS使用IMM进行数据处理的权限。 |
API | Action | 说明 |
GenerateWebofficeToken |
| 用于获取Weboffice凭证。 |
RefreshWebofficeToken |
| 用于刷新Weboffice凭证。 |
计费说明
WebOffice在线编辑会产生以下计费项。有关计费项的定价详情,请参见OSS产品定价和计费项:
API | 计费项 | 说明 |
GetObject | GET 类型请求 | 根据成功的请求次数计算请求费用。 |
外网流出流量费用 | 如果是通过外网Endpoint(示例值oss-cn-hangzhou.aliyuncs.com)或者传输加速Endpoint(示例值oss-accelerate.aliyuncs.com)调用GetObject接口时,会产生外网流出流量费用,根据数据容量大小计费。 | |
低频访问数据取回容量 | 如果取回的数据是低频访问数据,会产生低频访问数据取回容量的费用,按数据取回量计费。 | |
归档直读数据取回容量 | 如果读取的是归档的Object且Bucket开启了归档直读,会产生归档直读数据取回容量费用,根据取回的数据容量大小计费。 | |
传输加速 | 如果开启了传输加速功能且使用传输加速域名访问您的Bucket会产生传输加速费用,根据数据容量大小计费。 |
API | 计费项 | 说明 |
GenerateWebofficeToken | DocumentWebofficeEdit | 文档编辑功能会产生文档处理费用。 重要 截至2023年12月1日之前创建的在线编辑项目将根据文档的打开次数进行收费,而2023年12月1日及之后创建的项目则将按照API接口的调用次数计费。 |
RefreshWebofficeToken |
注意事项
WebOffice在线编辑仅支持同步处理(x-oss-process处理方式)。