静态资源允许您上传 可以在 Visualforce 页面中引用,包括存档(如 .zip 和 .jar 文件), 图像、样式表、JavaScript 和其他文件。静态资源只能使用 在您的 Salesforce 组织内,因此您不能在此处为其他应用程序或 网站。使用静态资源比将文件上传到 “文档”选项卡,因为:
- 您可以将相关文件的集合打包到 目录层次结构,并将该层次结构作为 .zip 或 .jar 存档上传。
- 您可以通过以下方式在页面标记中按名称引用静态资源 使用全局 变量,而不是硬编码文档 ID。$Resource
提示
另外 使用静态资源引用 JavaScript 或级联样式表 (CSS) 比包含内联标记更可取。管理这个 使用静态资源的内容类型允许您具有一致的 所有页面的外观和一组共享的 JavaScript 功能。
一个 单个静态资源最多可以有 5 MB,一个组织最多可以有 250 MB 的 静态资源,总计。
- 创建静态资源
- 在 Visualforce 标记中引用静态资源
- 使用 iframe 引用不受信任的第三方内容
创建静态资源
要创建静态资源,请执行以下操作:
- 在“设置”中,输入“快速” “查找”框,然后选择“静态资源”。Static Resources
- 点击新增功能.
- 在名称文本框中,输入用于标识 资源。此名称只能包含下划线和字母数字 字符,并且必须在您的组织中是唯一的。它必须以字母开头,不能包含空格, 不以下划线结尾,也不包含两个连续的下划线。注意如果你 在 Visualforce 标记中引用静态资源,然后更改 资源,则 Visualforce 标记将更新以反映该更改。
- 在“说明”文本区域中,指定 资源。
- 在文件文本框旁边,单击浏览到 导航到要上传的资源的本地副本。一个 单个静态资源最多可以有 5 MB,一个组织最多可以有 250 MB 的 静态资源,总计。
- 为用户会话设置缓存控制,包括 API 和 Experience Cloud 用户会话:
- Private指定 Salesforce 服务器上缓存的静态资源数据不得 与其他用户共享。静态资源仅存储在缓存中,用于当前 用户的会话。注意在以下情况下,静态资源的缓存设置设置为私有 通过 Salesforce 站点访问,其访客用户的个人资料具有基于 IP 的限制 范围或登录时间。具有来宾用户配置文件限制的站点缓存静态 资源仅在浏览器中。此外,如果以前不受限制的站点成为 受限制时,静态资源最多可能需要 45 天才能从 Salesforce 缓存和任何中间缓存。Public指定共享 Salesforce 服务器上缓存的静态资源数据 与组织中的其他用户一起,以缩短加载时间。缓存后, 资源可供所有 Internet 流量访问,包括未经身份验证的 用户。
- 点击保存。
警告
如果您使用的是 WinZip,则必须安装最多的 最新版本。旧版本的 WinZip 可能会导致数据丢失。
在 Visualforce 标记中引用静态资源
在 Visualforce 标记中引用静态资源的方式取决于是否要引用独立文件。 或者是否要引用存档中包含的文件 (例如 .zip 或 .jar 文件):
- 要引用独立文件,请用作 合并字段,其中名称是 you 在上传资源时指定。为 例:$Resource.<resource_name><resource_name>
<apex:image url="{!$Resource.TestImage}" width="50" height="50"/>
或<apex:includeScript value="{!$Resource.MyJavascriptFile}"/>
- 要引用存档中的文件,请使用该函数。指定静态 上传存档时提供的资源名称 第一个参数,以及存档中所需文件的路径 与第二个。例如:URLFOR
<apex:image url="{!URLFOR($Resource.TestZip, 'images/Bluehills.jpg')}" width="50" height="50"/>
或<apex:includeScript value="{!URLFOR($Resource.LibraryJS, '/base/subdir/file.js')}"/>
- 您可以在静态资源中的文件中使用相对路径 存档来引用存档中的其他内容。例如,在 CSS 中 名为 styles.css 的文件,您有以下内容 风格:
table { background-image: url('img/testimage.gif') }
什么时候 您在 Visualforce 页面中使用该 CSS,您需要确保 CSS 文件可以 找到图像。为此,请创建一个包含样式.css和img/testimage.gif的存档(例如zip文件)。 确保路径结构保留在存档中。然后上传 将文件存档为名为“style_resources”的静态资源。然后 在页面中,添加以下组件:<apex:stylesheet value="{!URLFOR($Resource.style_resources, 'styles.css')}"/>
因为 静态资源包含样式表和图像,相对 样式表中的路径将解析并显示图像。 - 通过自定义控制器,您可以动态引用 使用标记的静态资源的内容。首先,创建自定义控制器:<apex:variable>
global class MyController { public String getImageName() { return 'Picture.gif';//this is the name of the image } }
然后,参考代码中的方法:getImageName<apex:variable><apex:page renderAs="pdf" controller="MyController"> <apex:variable var="imageVar" value="{!imageName}"/> <apex:image url="{!URLFOR($Resource.myZipFile, imageVar)}"/> </apex:page>
如果图像的名称在 zip 文件,您只需更改 中的返回值即可。getImageName
使用 iframe 引用不受信任的第三方内容
最好隔离从不受信任的来源下载的静态资源。您可以 使用 iframe 将第三方内容与 Visualforce 页面分开,以提供 额外的安全层,帮助您保护资产。
若要在单独的域中引用静态 HTML 文件,请用作合并 字段中,其中是您在 上传了资源。例如:$IFrameResource.<resource_name>resource_name
<apex:iframe src="{!$IFrameResource.TestHtml}" id ="theiframe" width="500" height="500"/>
iframe 标记将 JavaScript 注入到父文档和子 iframe 中,以 在两个元素之间建立安全的通信。父文档可以有 多个 iframe。每个唯一命名的静态资源都位于其自己的子域 或 中。force-user-content.comforceusercontent.com
对 iframe 的访问未经身份验证,因此它包含的任何第三方内容都无法访问 用户的会话 ID。
与父文档中的 iframe 进行通信
您可以在父文档中编写 JavaScript 代码以与 iframe 进行通信。
- 发送消息至 iframe:
SfdcApp.iframe.sendMessage('theiframe', { key1: value1, key2: value2 });
- 接收来自以下位置的消息 iframe:
SfdcApp.iframe.addMessageHandler('theiframe', function(data) { if(data.key1) { … } });
- 从以下位置捕获错误 iframe:
SfdcApp.iframe.addErrorHandler('theiframe', function(error) { console.log(error); });
在 iframe 中与父文档进行通信
您也可以从 iframe 文档以另一种方式进行通信。
- 向父级发送消息 公文:
LCC.onlineSupport.sendMessage('containerUserMessage', { key1: value1, key2: value2 });
- 设置处理程序以接收来自父级的消息 公文:
LCC.onlineSupport.addMessageHandler(function(message) { if(data.key1) { … } });
自 删除此内容 处理器:LCC.onlineSupport.removeMessageHandler(function)
- 为来自父级的消息错误设置处理程序 公文:
LCC.onlineSupport.addMessageErrorHandler(function(message) { if(data.key1) { … } });
自 删除此内容 处理器:LCC.onlineSupport.removeMessageErrorHandler(function)
- 为其他类型的 错误:
LCC.onlineSupport.addErrorHandler(function(message) { if(data.key1) { … } });
自 删除此内容 处理器:LCC.onlineSupport.removeErrorHandler(function)