使用静态资源

静态资源允许您上传 可以在 Visualforce 页面中引用,包括存档(如 .zip 和 .jar 文件), 图像、样式表、JavaScript 和其他文件。静态资源只能使用 在您的 Salesforce 组织内,因此您不能在此处为其他应用程序或 网站。使用静态资源比将文件上传到 “文档”选项卡,因为:

  • 您可以将相关文件的集合打包到 目录层次结构,并将该层次结构作为 .zip 或 .jar 存档上传。
  • 您可以通过以下方式在页面标记中按名称引用静态资源 使用全局 变量,而不是硬编码文档 ID。$Resource

提示

另外 使用静态资源引用 JavaScript 或级联样式表 (CSS) 比包含内联标记更可取。管理这个 使用静态资源的内容类型允许您具有一致的 所有页面的外观和一组共享的 JavaScript 功能。

一个 单个静态资源最多可以有 5 MB,一个组织最多可以有 250 MB 的 静态资源,总计。

  • 创建静态资源
  • 在 Visualforce 标记中引用静态资源
  • 使用 iframe 引用不受信任的第三方内容

创建静态资源

要创建静态资源,请执行以下操作:

  1. 在“设置”中,输入“快速” “查找”框,然后选择“静态资源”。Static Resources
  2. 点击新增功能.
  3. 在名称文本框中,输入用于标识 资源。此名称只能包含下划线和字母数字 字符,并且必须在您的组织中是唯一的。它必须以字母开头,不能包含空格, 不以下划线结尾,也不包含两个连续的下划线。注意如果你 在 Visualforce 标记中引用静态资源,然后更改 资源,则 Visualforce 标记将更新以反映该更改。
  4. 在“说明”文本区域中,指定 资源。
  5. 在文件文本框旁边,单击浏览到 导航到要上传的资源的本地副本。一个 单个静态资源最多可以有 5 MB,一个组织最多可以有 250 MB 的 静态资源,总计。
  6. 为用户会话设置缓存控制,包括 API 和 Experience Cloud 用户会话:
    • Private指定 Salesforce 服务器上缓存的静态资源数据不得 与其他用户共享。静态资源仅存储在缓存中,用于当前 用户的会话。注意在以下情况下,静态资源的缓存设置设置为私有 通过 Salesforce 站点访问,其访客用户的个人资料具有基于 IP 的限制 范围或登录时间。具有来宾用户配置文件限制的站点缓存静态 资源仅在浏览器中。此外,如果以前不受限制的站点成为 受限制时,静态资源最多可能需要 45 天才能从 Salesforce 缓存和任何中间缓存。Public指定共享 Salesforce 服务器上缓存的静态资源数据 与组织中的其他用户一起,以缩短加载时间。缓存后, 资源可供所有 Internet 流量访问,包括未经身份验证的 用户。
    标头上的 W3C 规范 字段定义包含有关缓存控制的更多技术信息。注意这 该功能仅适用于使用静态 资源。
  7. 点击保存

警告

如果您使用的是 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)