文档预览功能支持表格文件、文字文件、演示文件以及pdf文件的在线预览,便于您进行文档内容管理与访问。
前提条件
已开通智能媒体管理IMM,并在OSS中绑定IMM。具体操作,请参见快速入门。
如果您通过RAM用户使用IMM相关功能,需确保RAM用户拥有以下权限。
系统权限:
AliyunOSSReadOnlyAccess
和AliyunIMMFullAccess
关于为RAM用户授权的具体操作,请参见为RAM用户授权。
自定义权限:
oss:ProcessImm
和ram:GetRole
为RAM用户授予自定义权限时,您需要先创建对应的自定义权限,然后为RAM用户授权。具体操作,请参见为RAM用户授予自定义的权限策略。
注意事项
支持在线预览的文件类型
表格文件:et、xls、xlt、xlsx、xlsm、xltx、xltm、csv
文字文件:doc、docx、txt、dot、wps、wpt、dotx、docm、dotm、rtf
演示文件:ppt、pptx、pptm、ppsx、ppsm、pps、potx、potm、dpt、dps
pdf文件:pdf
文件大小限制
不支持在线预览大于200 MB的文件。
预览的方式
无论请求预览的文档读写权限为公共读或私有,都需要通过AccessKey ID、AccessKey Secret签名后得到的URL进行预览访问。
费用说明
本文的文档预览操作使用IMM文档预览V1接口,关于该接口的计费,请参见IMM旧版产品计费说明。
参数
操作名称:imm/previewdoc
参数说明如下:
名称 | 描述 |
copy | 指定预览文档时是否支持复制内容。取值如下: 1:支持复制文档内容。 0:不支持复制文档内容。 |
流程介绍
文档预览流程如下:
客户端App或者Web端向业务服务器发起预览请求,并提供要预览的文件名。
业务服务器根据请求文件进行URL签名,将签名完成的URL提供给客户端App或者Web端。
客户端App或者Web端通过签名URL直接预览访问OSS文件。
重要不支持通过签名URL直接预览已加密的文件。您可以通过以下步骤预览加密的文件:
通过JavaScript API设置加密文件解密流程。具体步骤,请参见设置加密文件解密流程。
调用智能媒体管理的CreateOfficeConversionTask接口,将原始文档转换为VECTOR向量格式输出到指定的OSS目录。
使用阿里云SDK
生成带签名的文档预览URL与生成带签名的图片处理URL方法类似,仅需将图片处理的操作改为文档预览操作即可。
下仅列举常见SDK的生成带签名的文档预览URL的代码示例。关于其他SDK的生成带签名的文档预览URL代码示例,请参见SDK简介。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
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 {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 强烈建议不要把访问凭证保存到工程代码里,否则可能导致访问凭证泄露,威胁您账号下所有资源的安全。本代码示例以从环境变量中获取访问凭证为例。运行本代码示例之前,请先配置环境变量。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写Object完整路径,完整路径中不能包含Bucket名称。
String objectName = "exampledir/exampleobject.txt";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// 设置样式,样式中包含文档预览参数。
String style = "imm/previewdoc,copy_1";
// 指定签名URL过期时间为10分钟。
Date expiration = new Date(new Date().getTime() + 1000 * 60 * 10 );
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();
}
}
}
}
<?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;
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";
// 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
$object = "exampledir/exampleobject.txt";
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
// 生成一个带图片处理参数的签名的URL,有效期是3600秒,可以直接使用浏览器访问。
$timeout = 3600;
$options = array(
// 设置样式,样式中包含文档预览参数。
OssClient::OSS_PROCESS => "imm/previewdoc,copy_1" );
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
print("rtmp url: \n" . $signedUrl);
const OSS = require('ali-oss');
const client = new OSS({
// yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
region: 'yourregion',
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// yourbucketname填写存储空间名称。
bucket: 'yourbucketname'
});
// 设置样式,样式中包含文档预览参数。
// 生成带签名的URL,并指定过期时间为10分钟。
const signUrl = client.signatureUrl('exampledir/exampleobject.txt', {expires: 600, 'process' : 'imm/previewdoc,copy_1'});
console.log("signUrl="+signUrl);
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
key = 'example.txt'
# 如果文件不在指定Bucket内,需将该图片上传到目标Bucket。
# bucket.put_object_from_file(key, 'D:\\localpath\\example.txt')
# 设置样式,样式中包含文档预览参数。
style = 'imm/previewdoc,copy_1'
# 生成带签名的URL,并指定过期时间为10分钟。过期时间单位为秒。
url = bucket.sign_url('GET', key, 10 * 60, params={'x-oss-process': style})
print(url)
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 指定图片所在Bucket的名称,例如examplebucket。
var bucketName = "examplebucket";
// 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
var objectName = "exampledir/exampleobject.txt";
// 创建OSSClient实例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
// 设置样式,样式中包含文档预览参数。
var process = "imm/previewdoc,copy_1";
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
Expiration = DateTime.Now.AddHours(1),
Process = process
};
// 生成带有签名的URI。
var uri = client.GeneratePresignedUri(req);
Console.WriteLine("Generate Presigned Uri:{0} with process:{1} succeeded ", uri, process);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写不包含Bucket名称在内源Object的完整路径,例如exampleobject.txt。
String objectKey = "exampleobject.txt";
String url = null;
// 设置样式,样式中包含文档预览参数。
String style = "imm/previewdoc,copy_1";
try {
// 生成用于上传文件的签名URL。
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
// 设置签名URL的过期时间为30分钟。
request.setExpiration(30*60);
request.setProcess(style);
url = oss.presignConstrainedObjectURL(request);
Log.d("url", url);
} catch (ClientException e) {
e.printStackTrace();
}
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
/// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 指定图片所在Bucket的名称,例如examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
ossImageName := "exampledir/exampleobject.txt"
// 设置样式,样式中包含文档预览参数。
// 生成带签名的URL,并指定过期时间为600s。
signedURL, err := bucket.SignURL(ossImageName, oss.HTTPGet, 600, oss.Process("imm/previewdoc,copy_1"))
if err != nil {
HandleError(err)
} else {
fmt.Println(signedURL)
}
}
// 指定图片所在Bucket的名称,例如examplebucket。
NSString *bucketName = @"examplebucket";
// 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
NSString *objectKey = @"exampleobject.txt";
NSString *method = @"GET";
// 设置样式,样式中包含文档预览参数。
NSDictionary *params = @{@"x-oss-process": @"imm/previewdoc%2Ccopy_1"};
// 生成带签名的URL,并指定过期时间为30分钟。
OSSTask *ossTask = [client presignConstrainURLWithBucketName:bucketName
withObjectKey:objectKey
httpMethod:method
withExpirationInterval:30 * 60
withParameters:params];
[ossTask continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
if (!task.error) {
NSString *url = task.result;
NSLog(@"url: %@", url);
} else {
NSLog(@"error: %@", task.error);
}
return nil;
}];
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS账号信息。*/
/* 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* 填写图片所在的Bucket名称,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
std::string ObjectName = "exampledir/exampleobject.txt";
/* 初始化网络等资源。*/
InitializeSdk();
ClientConfiguration conf;
/* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
/* 设置样式,样式中包含文档预览参数。*/
std::string Process = "imm/previewdoc,copy_1";
GeneratePresignedUrlRequest request(BucketName, ObjectName, Http::Get);
request.setProcess(Process);
auto outcome = client.GeneratePresignedUrl(request);
/* 释放网络等资源。*/
ShutdownSdk();
return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
const char *access_key_id = getenv("OSS_ACCESS_KEY_ID");
const char *access_key_secret = getenv("OSS_ACCESS_KEY_SECRET");
/* 填写图片所在的Bucket名称,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
const char *object_name = "exampledir/exampleobject.txt";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* 用char*类型的字符串初始化aos_string_t类型。*/
aos_str_set(&options->config->endpoint, endpoint);
aos_str_set(&options->config->access_key_id, access_key_id);
aos_str_set(&options->config->access_key_secret, access_key_secret);
/* 是否使用了CNAME。0表示不使用。*/
options->config->is_cname = 0;
/* 设置网络相关参数,比如超时时间等。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* 在程序入口调用aos_http_io_initialize方法来初始化网络、内存等全局资源。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* 用于内存管理的内存池(pool),等价于apr_pool_t。其实现代码在apr库中。*/
aos_pool_t *pool;
/* 重新创建一个内存池,第二个参数是NULL,表示没有继承其它内存池。*/
aos_pool_create(&pool, NULL);
/* 创建并初始化options,该参数包括endpoint、access_key_id、acces_key_secret、is_cname、 curl等全局配置信息。*/
oss_request_options_t *oss_client_options;
/* 在内存池中分配内存给options。*/
oss_client_options = oss_request_options_create(pool);
/* 初始化Client的选项oss_client_options。*/
init_options(oss_client_options);
/* 初始化参数。*/
aos_string_t bucket;
aos_string_t object;
aos_table_t *params = NULL;
aos_http_request_t *req;
char *url_str;
apr_time_t now;
int64_t expire_time;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
/* 设置样式,样式中包含文档预览参数。*/
params = aos_table_make(pool, 1);
apr_table_set(params, OSS_PROCESS, "imm/previewdoc,copy_1");
req = aos_http_request_create(pool);
req->method = HTTP_GET;
req->query_params = params;
/* 指定过期时间(expire_time),单位为秒。*/
now = apr_time_now();
expire_time = now / 1000000 + 10 * 60;
/* 生成签名url。*/
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
printf("url: %s\n", url_str);
/* 释放该内存池,相当于释放了请求过程中各资源分配的内存。*/
aos_pool_destroy(pool);
/* 释放之前分配的全局资源。*/
aos_http_io_deinitialize();
return 0;
}
常见问题
是否支持打印在线预览的文件?
您可以通过以下两种方式打印在线预览的文件:
将在线预览文件下载到本地后打印。
使用IMM的文档在线协作功能在线打印预览的文件。具体步骤,请参见打印。
生命带签名的文档URL报错The resource Project cannot be found. bucket does not bind any project.
问题原因:当前Bucket未绑定IMM Project。
解决方法:将当前Bucket绑定IMM Project。具体步骤,请参见绑定IMM。
PPT超过200页时不能预览怎么办?
通常情况下,IMM文档预览V1版本支持稳定预览的页数为200页,如果您需要预览超过200页的文档,建议使用IMM文档预览V2版本。更多信息,请参见快速入门。
如何设置预览接口不允许复制?
以Java SDK为例,您可以设置样式,样式中包含文档预览参数,例如:String style = "imm/previewdoc,copy_0"
。copy为0表示预览接口不允许复制。
文档预览时是否支持添加水印?
文档预览不支持添加水印。如果您需要预览添加水印的文档,您可以先使用智能媒体管理为文档添加水印,然后再预览文档。如何为文档添加水印,请参见添加水印。
开启CDN后生成带签名的文档URL报错Either the Signature query string parameter or the Authorization header should be specified, not both.
如果您在私有 Bucket 开启回源功能后,通过 CDN 域名访问已绑定至 IMM 项目的 Bucket 中的文件,无需提供额外的签名信息。请按照以下要求进行配置:
授权默认角色 您需要为CDN的默认角色
AliyunCDNAccessingPrivateOSSRole
授予oss:ProcessImm
权限。访问资源时,应使用不包含签名信息的 URL。
例如,您可以使用如下格式的URL:http://cdn.example.info/demo.ppt?x-oss-process=imm/previewdoc使用文档在线预览功能。