文档预览功能支持表格文件、文字文件、演示文件以及pdf文件的在线预览,便于您进行文档内容管理与访问。

前提条件

  • 已开通智能媒体管理IMM,并在OSS中绑定IMM。具体操作,请参见快速入门
  • 如果您通过RAM用户使用IMM相关功能,需确保RAM用户拥有以下权限。
    • 系统权限:AliyunOSSReadOnlyAccessAliyunIMMFullAccess

      关于为RAM用户授权的具体操作,请参见为RAM用户授权

    • 自定义权限:oss:ProcessImmram: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计费说明

参数

操作名称:imm/previewdoc

参数说明如下:

名称 描述
copy 指定预览文档时是否支持复制内容。取值如下:

1:支持复制文档内容。

0:不支持复制文档内容。

流程介绍

文档预览流程如下:

  1. 客户端App或者Web端向业务服务器发起预览请求,并提供要预览的文件名。
  2. 业务服务器根据请求文件进行URL签名,将签名完成的URL提供给客户端App或者Web端。
  3. 客户端App或者Web端通过签名URL直接预览访问OSS文件。
    注意 不支持通过签名URL直接预览已加密的文件。您可以通过以下步骤预览加密的文件:
    1. 通过JavaScript API设置加密文件解密流程。具体步骤,请参见设置加密文件解密流程
    2. 调用智能媒体管理的CreateOfficeConversionTask接口,将原始文档转换为VECTOR向量格式输出到指定的OSS目录。

使用阿里云SDK

生成带签名的文档预览URL与生成带签名的图片处理URL方法类似,仅需将图片处理的操作改为文档预览操作即可。

下仅列举常见SDK的生成带签名的文档预览URL的代码示例。关于其他SDK的生成带签名的文档预览URL代码示例,请参见SDK简介

import com.aliyun.oss.*;
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";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "yourAccessKeyId";
        String accessKeySecret = "yourAccessKeySecret";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称。
        String objectName = "exampledir/exampleobject.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        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;

// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
// 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',
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId: 'yourAccessKeyId',
  accessKeySecret: 'yourAccessKeySecret',
  // 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

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
access_key_id = 'yourAccessKeyId'
access_key_secret = 'yourAccessKeySecret'
# 填写Bucket名称,例如examplebucket。
bucket_name = 'examplebucket'
# 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
key = 'exampledir/exampleobject.txt'

# 指定Bucket实例,所有文件相关的方法都需要通过Bucket实例来调用。
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
# 如果图片不在指定Bucket内,需将该图片到目标Bucket。
# bucket.put_object_from_file(key, 'D:\\localpath\\example.jpg')
# 设置样式,样式中包含文档预览参数。
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";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
var accessKeyId = "yourAccessKeyId";
var accessKeySecret = "yourAccessKeySecret";
// 指定图片所在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);
}
package main

import (
    "fmt"
    "os"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func HandleError(err error) {
    fmt.Println("Error:", err)
    os.Exit(-1)
}

func main() {
    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
    if err != nil {
    HandleError(err)
    }

    // 指定图片所在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)
    }
}
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS账号信息。*/
    /* 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
    std::string AccessKeyId = "yourAccessKeyId";
    std::string AccessKeySecret = "yourAccessKeySecret";
    /* 填写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;
    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, 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";
/* 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。*/
const char *access_key_id = "yourAccessKeyId";
const char *access_key_secret = "yourAccessKeySecret";
/* 填写图片所在的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;
}