我想在水晶报告中显示图像。 场景是这样的。
我有一个数据库,其中我的图像路径是持久的。 例如ftp://Images/1.jpg
现在我想在水晶报告中重复这个图像。
当我填写datatable
时,它会显示我的完整网址。当我在GridView中显示此字段时,我使用imageBox
来显示我的图像,它对我很有用。
但是当我试图用水晶报告做同样的事情时,它开始让我显示图像路径。现在这里而不是路径我想要显示图像。
答案 0 :(得分:5)
好的,所以通过网络在CR报告中显示图像的泪痕如下:
1)假设如下:
a)CR 2008又称CR 12.我不知道早期版本,但XIR2(11.5)可能有效。
b)需要在报告中显示图片,并进行本地工作站开发和预览
c)IIS,ASP.NET应用程序,.NET 4.0
d)正确安装了Crystal Reports(这是一个完全不同的讨论,但是可以说,你最好有一个名为aspnet_client的文件夹,子目录如下:**system_web
4_0_30319
crystalreportviewers12**
等
与Web应用程序的位置并行。 还有更多 - 但不是在这里......
e)图像就像照片或其他什么,但尺寸合理,字节不太大。
f)存在每个图像的缩略图,或者可以使用默认的缩略图文件。
g)它们是JPG,PNG或BMP图像。否则,你运气不好AFAICT。如果它们是您希望在同一列表中显示的Word,PDF等文档,那么您也需要一个缩略图。但是,让我们继续关注图像主题...
h)您将图像组织到Web服务器上的文件夹层次结构中,或者Web服务器可以访问,但无论如何,网站都可以访问。我们假设他们都在主要位置 D:\ MyDocuments
我没有尝试过这样一个FTP网站,比如原始问题,但我觉得它会起作用。
2)您需要一个可供Web服务器访问的数据库表或其他类型的存储库来注册您的图像。 DB格式是灵活的,但我们假设它是一个键入您感兴趣的主域名的列表,其中每个主项目有0:N个图像,例如,住宅的图片,或者桥梁的图片,或者图片的图片房屋检查。此表具有文件的完整路径,或相对路径,或文件夹位置以及专用文件名列。无论如何,但他们必须创建一个文件路径:
D:\MyDocuments\folderA\folder1\area51\whatever\myfile.png
所以数据库包含整个事物,或者它的一部分,或者比特,或者其他什么。
3)在本地/独立/不使用浏览器查看报告时,根文件夹是 D:\ MyDocuments 。这是一个任意名称,但现在要跟踪它。
4)您注册了该根文件夹,以便CR可以找到它。这可以硬连接到您的报告(坏)或从INI文件(嗯,OK)或数据库字段中查找(为什么不,因为您仍在注册图像?)或作为参数传递给您想要显示图片或文档链接的报告(简单,但在部署到其他文件系统时会发生什么?)
5)在显示图片的报告中,我假设在这里N /感兴趣的项目如上面(2)所述,你有一个插入CR设计师的图片。将它链接到一些真正虚假的图片或默认图像,以便您可以判断您是否正在解析文件名....
6)从数据库中检索图片缩略图路径,并根据需要将其与BACK SLASHES组合成文件名。它将存储在报表中的共享StringVar FullQualifiedThumbnailFileName (简而言之)中,并包含您在步骤(4)中可用于报表并存储在文档根目录中的文档根目录。专用的共享StringVar DocRoot(让我们说)加上计算的文件名。所以公式字段 FullyQualifiedThumbnailFileName 看起来像: {@DocRoot}& FolderLocationFromDB& ThumbnailFileNameFromDB或现实生活中:
D:\MyDocuments\folderA\folder1\area51\whatever\tn_myfile.png
7)所以现在你有一个缩略图文件名。将其放在草稿报告的任何位置,这样您就可以在设计过程中看到它正在解决的问题。做同样的事情来引用REAL文件名并创建一个名为 FullyQualifiedThumbnailFileName 的变量。如果图片浏览器构造正确,它应该可以打开。把它放在某处,这样你就可以读它并用它来测试。
8)右键单击报表上的图片对象,选择“格式图形”,单击图片选项卡,然后打开图片位置的公式图标。
在你开始抱怨我之前,请先看看顶部的假设 - 我不知道哪个早期版本的CR支持这个,或者他们是否采用不同的方式。
然后,在公式编辑器中,输入以下内容:
您在一分钟前创建的{@ FullQualifiedThumbnailFileName} 。您的缩略图是指向Web服务器或开发工作站上本地文件名的Windows DOS路径。
9)现在在您的报告中添加一个参数,或者创建一个公式变量,或者其他什么,默认情况下由字符串" file://"组成。这将在运行时使用httpContext.Current.Session应用程序根进行REPLACED,但我们将在一分钟内完成。我想你可以早点做到这一点......将此名称命名为 WebURLRoot
10)创建一个名为 txtImageURL 的公式字段无论如何,这个名称取决于您,但猜猜这里有什么?如下所示:
if lowercase( {@WebURLRoot} ) = "file://" THEN
{@WebURLRoot} &
REPLACE( {@txtDocumentFileFullyQualifiedName},"/","\")
else
URLENCODE( {@WebURLRoot} &
REPLACE(
{*DocumentFileNameFromYourSource*}
,"\","/") )
将文件名DocumentFileNameFromYourSource附加到WebURLRoot对我来说很有用,因为我的情况中的相对路径不包含DocRoot。你的情况可能会有所不同。无论如何,在独立模式中,此变量应解析为:
file://D:\MyDocuments\folderA\folder1\area51\whatever\myfile.png
这不是缩略图。在Web上运行时,它应该解析为:
http://somewebhost/website/folderA/folder1/area51/whatever/myfile.png
因为我们要以某种方式向变量 WebURLRoot 提供 http:// localhost / website 。我是使用从Web应用程序传递的参数来完成的。它可以被查找或硬连线但请记住,如果网站重新定位会发生什么?
将 {@txtImageURL} 放入超链接计算的文件名公式中,然后单击该选项以指示它来自Internet上的网站AKA您的本地开发服务器或其他任何内容。
在独立模式下, txtImageURL 中的文件字符串具有反斜杠。在运行时,它们被设置为正斜杠以获取完整的文件名。 Crystal的URLEncode函数使它们非常适合用于Web目的。
再次将 txtImageURL 放到开发表面上,直到它变直。
11)你现在有一个CR RPT
a)包含文档树C:\ MyDocuments的Windows根目录的变量,您以任何方式提供给报表。我将它存储在我的应用程序连接的数据库中。
b)保存缩略图的Window路径的变量,由数据库中的缩略图名称和文档根
构成c)保存Windows路径到实际文件名的变量,再次根据数据库中的实际文件名加上文档根
构建d)一个网站网址,该网站的 file://在开发期间和 http:// localhost / website / at runtime 。你正在传递这个
e)将网站网址与实际文件相结合的图像文件的工作URL。
到目前为止好吗?拿一杯啤酒。也许2。
C#更改
1)好的,所以我们需要调整我们的世界,以便在运行时将网站URL主干作为参数传递给报告。您无法使用Crystal Reports Viewer在Web上执行此操作。假设您已经关注了如何加载,参数化和显示来自Web应用程序的报告的众多示例之一,并且我认为您可以通过Google找到这些,请确保在您的应用程序中执行此操作。我在Session_Start事件中找到我的Global.asax.cs,根据authoer看起来非常合理... 请注意,信用是由于引用的网址人士... :
// so Crystal can receive the APP_Path as an argument
// Code that runs when a new session is started
// http://aquesthosting.headtreez.com/doc/d9ccf4d8-1873-469e-9dca-815e5854b963
string appPath = System.Web.HttpContext.Current.Request.ApplicationPath.ToLower();
if (appPath == "/") //a site
appPath = "/";
else if (!appPath.EndsWith(@"/")) //a virtual directory i.e. in a subfolder
appPath += @"/";
Session["APP_Path"] = appPath; //stores the value to a session variable for us to use
2)现在,您要为报告创建参数,请务必将会话[" APP_Path"] 作为参数传递给您:
// START CHANGE
// this next check seems unlikely
if(! (HttpContext.Current.Session == null))
{
// pass HttpContext.Current.Session["APP_Path"].ToString() as a parameter
if (!(String.IsNullOrEmpty(HttpContext.Current.Session["APP_Path"].ToString())))// set in Global.asax.cs Start_Session
exporter.Arguments.Add(exporter.Arguments.Count, HttpContext.Current.Session["APP_Path"].ToString()); // to last parameter position
else
exporter.Arguments.Add(exporter.Arguments.Count, String.Empty); // or nothing to last parameter position
// end change
}
其中 exporter.Arguments 包含报告的参数。 你的情况无疑会有所不同。一个有点重要的事情就是把这个参数始终放在第一位或总是最后,这样其他参数就不会搞砸了。对报告本身中的参数使用相同的顺序。这些参数显然无论如何都会按名称关联,但我认为混合它们是一个坏主意,最终会让人感到困惑。
3)现在,您可以独立运行报告,当系统提示您输入网站网址时,请输入 file:// 。当在网络上运行相同的确切报告时,应用程序会发送它,不管网站是什么,但 http:// localhost / website / 。
<强>陷阱:强>
1)在开发过程中,在报告中显示变量。确保对于缩略图,您始终使用服务器相关但完整的Windows / DOS路径,对于图片,在开发期间使用file://开头的完整Windows / DOS路径 您可以在制作前随时隐藏它们。
2)注意太多的斜线等。很容易得到一个双斜杠,搞砸了URL ......
3)请记住,Crystal通过某种神秘的序列来评估公式,但我知道在详细信息之前处理了页眉。我将所有常见变量(即DocRoot和WebSiteRootURL)放在页眉中(甚至报表头,因为它们不会更改),因此它们首先被量化,详细信息带可以使用它们。
4)我将显示和列出的所有图片委托给嵌入式子报表。它使用 Shared StringVar xyz 方法共享所需的变量。它有点松鼠,但基本上子报表总是从容器报告中获取其常见内容的值(参见上面的注释3)。为了布置那个子报告,我做了一个更加细小的子报告作为公共变量的持有者,所以我不必运行整个怪物。
5)无法抑制这些“变量持有者”报告,或者这些值似乎无法解决。因此,使它们非常小和无边框,然后挤压页面标题或任何隐藏它们的东西。我猜文本和背景也可以设置为相同,以便进一步隐藏它们但是不要这样做,直到你完成摆弄布局等,否则你将不得不四处寻找itty-bitty子报告。它们是您的本地内存变量。
6)独立的图像/文档/链接文件必须使用传统的DOS / Windows文件名路径(没有正斜杠)。这些可以解决网站,但要制作一个超链接,我可以告诉你的斜线,所以假设你将不得不翻转。
7)作为旁注,我可以通过使用Junction Magic将〜/ MyDocuments重新映射到D:\ MyDocuments等,在开发期间将我的文档重新定位到网站层次结构中.Web服务器似乎并不关心它实际上是遍历D:\ MyDocuments但认为它位于网站的子文件夹中。但是,您可能必须使用虚拟目录方法 - 预先警告。或者,将文档存储在网站下面,但不知何故,这似乎是klutzy。
8)我提到了许可问题了吗?不,但他们可能会咬你。确保IIS_IUSR以及任何可以访问文件/文件夹等的内容。9)这不是更容易吗?哦,谢谢你,无论如何SAP ......
所以显然Request对象也拥有网站URL干。如果你不想走全球化的路线,请使用它 另外,我可能没有明确说明它,但CR OLE对象只能理解Windows ...而不是unix文件名约定。作为进一步的考虑,路径长度必须符合。 最后,当我在网页上显示文件名时,我隐藏了DOS / Windows根目录和网站主干,只显示相对路径,例如〜/ Folder / Folder / File.png这样就不太明显文件是如何安排在网站上的 - 可能是不必要的偏执,但也有好处,如果网站移动用户不要感到困惑。
问题可能会也可能不会得到答案。玩得开心。
答案 1 :(得分:1)
在这里......(使用VS 2013测试) - 工作!!!
1)使用insert-&gt; picture
向报告添加图片2)右键点击图片 - &gt;格式对象 - &gt;图片
3)更改图形位置的公式
前 -
"E:\tmp\wrk\s1.jpg"
您可以使用公式构建器
根据您的要求和条件更改路径和文件名答案 2 :(得分:0)
主要问题是CrystalImageHandler.aspx
仅适用于根文件夹(我的意思是:对于c:\inetpub\wwwroot
)所以有两个选项:
Default Web Site
- &gt;从Advanced Settings
到Physical Route
%SystemDrive%\inetpub\wwwroot
- &gt; YourFolderName
%SystemDrive%\inetpub\wwwroot
到目前为止,我找到了这个解决方案。希望它有所帮助。
答案 3 :(得分:-1)
我知道如果您使用Visual Studio附带的Crystal Reports,则不支持此功能。它将显示存储在db字段中的图像,但不会显示存储在URL中的图像。
我认为(但不确定)没有版本的Crystal支持用于显示图像的ftp协议。