文檔預覽功能支持表格文件、文字文件、演示文件以及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使用文檔在線預覽功能。