使用动态文件扩展名的SSRS外部图片

3
我有一个报告需要从服务器上的Windows文件夹中显示图像,这个已经实现了(请参见此处)。现在,我想知道如何让报告拉取不同文件类型的图像,比如jpg和tif。(默认情况下我使用png)。有相对简单的方法吗?带有文件扩展名的图像名称不在SQL数据库中。
编辑:我按照以下代码块输入了这些内容,来自Daniel的帮助。 Public Function GetImage(ByRef Filename As String) As String ' Full image path used for testing if it exists Dim ImagePath As String ImagePath = "\\GVSSERVER1\GVSServerD\Acclamare_Images\" + Filename ' Test to see if the file exists as a gif Try If System.IO.File.Exists(ImagePath + ".png") Return "file://" + ImagePath + ".png" ElseIf System.IO.File.Exists(ImagePath + ".jpg") Else Return "file://" + ImagePath + ".jpg" End If Catch ex As Exception Return "Hit an Error" End Try Return "Hit the end" End Function
当我运行报告时,它会获取.jpg扩展名,即使图像文件是png,并且该项没有jpg文件。有什么办法可以纠正这个问题?
编辑2:虽然我不是专家,但我尝试了更新的自定义代码,但没有成功。我找到了这个问题(在此处),其中包含一个函数。我尝试了它,并且它可以工作,但由于某种原因.tif文件不会显示在报告中。我安装了Microsoft Picture Manager(来自Sharepoint exe下载),但它仍然无法显示.tif文件。

你的意思是只有文件名而没有扩展名信息可用,需要自己找出来吗? - Lucky
正确。我们有一个图像文件夹,其中包含几种不同的扩展名。 - itstknecht
1个回答

3
好消息是,这绝对是可能的,但是需要一些自定义代码和服务器端调整才能准备好。
总体思路:创建一个代码后台函数,它接受我们图片的名称,并执行文件存在测试,以确定哪种文件扩展名类型实际上存在于网络共享中。
如果您在报告区域外右键单击并转到属性,您将看到自定义代码窗口,在那里您可以粘贴以下函数代码。
自定义代码:
Public Function GetImage(ByRef Filename As String) As String
    ' Full image path used for testing if the image exists
    Dim ImagePath As String
    ImagePath = "\\EM-SSRS\ImageTest\" + Filename

    ' Test to see if the file exists as a gif
    If System.IO.File.Exists(ImagePath + ".gif")  THEN
            Return "file://" + ImagePath + ".gif"
    ElseIf System.IO.File.Exists(ImagePath + ".png")  THEN
            Return "file://" + ImagePath + ".png"
    ElseIf System.IO.File.Exists(ImagePath + ".jpg")  THEN
            Return "file://" + ImagePath + ".jpg"
    ElseIf System.IO.File.Exists(ImagePath + ".jpeg")  THEN
            Return "file://" + ImagePath + ".jpeg"
    End If

    Return "No Image Exists"
End Function

你需要编辑ImagePath变量,将其更改为你的网络共享路径或添加另一个参数以使函数更加通用。创建代码函数后,建议在报表上创建一个虚拟文本框表达式,并使用以下值:
=Code.GetImage("Filenmame")

这样可以让您查看函数的输出并根据需要进行调整。请注意,“file://...”语法在报告生成器或Visual Studio内可能无法使用,而且可能需要部署到报表服务器进行测试。

当然,一旦函数看起来有效,请添加图像,确保将源设置为外部并使用与文本框相同的表达式。

服务器端更改

在我的环境下进一步测试后,我不得不做出两个额外的更改才能使其正常工作:

  1. 确保未用户执行账户设置为具有文件共享权限的域帐户

  2. 编辑rssrvpolicy.config文件中的SSRS配置,信任自定义代码并允许通过指定“FullTrust”来执行 File.Exists 函数

<CodeGroup
  class="UnionCodeGroup"
  version="1'
  PermissionSetName="FullTrust"
  Name="Report_Expressions_Default_Permissions"
  Description="This code group grants default permissions for code in report expressions and code element."
  ...
</CodeGroup>

我做出这些更改后重新启动了SSRS服务(我认为这是必需的,但作为预防措施也这样做了)。
请注意,我不是SSRS服务器管理员,其他人可能能够添加一些有关自定义策略更改的附加信息。浏览MS文档时,建议使用自定义程序集,因此在这一部分要谨慎对待。

Daniel,请查看我的编辑后的问题。我不熟悉自定义代码,所以可能会漏掉一些东西... - itstknecht
这是一个很好的解决方案,我想知道在SSRS中是否支持System.IO.File。我进行了快速测试,使用以下表达式的文本框:=IIF(System.IO.File.Exists("FILE.jpg"),1,0)。我测试了file://格式、/格式、./、C:/...,但都没有得到true值。这是基于存在于SSRS报告服务器上的文件。值得注意的是,如果我插入一张图片并选择外部来源,则该值为“/FILE.jpg”,但提交给Exists()函数时无法正常工作。我将相同的代码作为全局代码中的函数运行,也得到了所有负面的返回结果。 - Lucky
1
@Lucky,这是我之前遇到的相同问题,直到我进行了两个服务器端的更改(帐户/策略配置),详见我的回答。我也没有使用“C:\ ...”文件引用格式进行测试,而是使用了来自同一台服务器的共享文件夹进行测试。 - Daniel
哦,我昨天没有看到更新的信息(我昨晚开始回复,但被分心了)。非常酷,@Daniel。这就是我喜欢这个网站的原因! - Lucky
哈哈,是啊,我从来没有做过这个,但尝试一下是一个有趣的实验。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接