使用URL在Crystal报表中显示图像

时间:2010-03-31 11:01:49

标签: c# .net asp.net gridview crystal-reports

我想在水晶报告中显示图像。 场景是这样的。

我有一个数据库,其中我的图像路径是持久的。 例如ftp://Images/1.jpg

现在我想在水晶报告中重复这个图像。

当我填写datatable时,它会显示我的完整网址。当我在GridView中显示此字段时,我使用imageBox来显示我的图像,它对我很有用。

但是当我试图用水晶报告做同样的事情时,它开始让我显示图像路径。现在这里而不是路径我想要显示图像。

4 个答案:

答案 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 ......

NEWS BLAST -

所以显然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)所以有两个选项:

  1. 从国际空间站管理员更改Default Web Site - &gt;从Advanced SettingsPhysical Route
  2. %SystemDrive%\inetpub\wwwroot - &gt; YourFolderName
  3. 将文件移至%SystemDrive%\inetpub\wwwroot
  4. 到目前为止,我找到了这个解决方案。希望它有所帮助。

答案 3 :(得分:-1)

我知道如果您使用Visual Studio附带的Crystal Reports,则不支持此功能。它将显示存储在db字段中的图像,但不会显示存储在URL中的图像。

我认为(但不确定)没有版本的Crystal支持用于显示图像的ftp协议。