2010-03-31 151 views
5

Quiero mostrar la imagen en un informe de cristal. El escenario es algo como esto.Mostrar imagen en informes de Crystal usando URL

Tengo una base de datos donde persiste mi ruta de una imagen. eg ftp://Images/1.jpg

Ahora quiero repetir esta imagen en un informe de cristal.

Cuando llene mi datatable me muestra la URL completa. Cuando muestro este campo en GridView, uso imageBox para mostrar mi imagen y me funciona muy bien.

Pero cuando trato de hacer lo mismo con los informes de cristal, me empieza a mostrar la ruta de la imagen tal como está. Ahora aquí, en lugar de la ruta, quiero que se muestre una imagen.

+0

Adapte la técnica en esta publicación: [Crystal Reports: imágenes dinámicas] (http://cogniza.com/wordpress/2010/03/15/crystal-reports-dynamic-images/). – craig

Respuesta

-1

Sé que si está utilizando los Crystal Reports incluidos con Visual Studio, esto no es compatible. Mostrará imágenes almacenadas en un campo db, pero no desde una url.

Creo (pero no estoy seguro) que ninguna versión de Crystal sea compatible con el protocolo ftp para mostrar imágenes.

+0

@Ray ¿Puedo hacerlo con el archivo .rdlc? –

+0

Creo que sí, pero no estoy realmente familiarizado con los archivos rdlc. Aquí hay un enlace que encontré que puede ser útil: http://msdn.microsoft.com/en-us/library/ms251715(v=VS.80). aspx – Ray

+0

es posible con CR incluido con Visual Studio (al menos en comparación con 2013). ver mi respuesta ... –

5

OK, por lo que el camino de las lágrimas para mostrar imágenes en el Informe de RC a través de Internet es el siguiente:

1) se requieren los siguientes:

a) CR 2008 también conocido como CR 12. No saben sobre versiones anteriores, pero XIR2 (11.5) puede funcionar. se desea

b) escaparate web de imágenes en los informes, con el desarrollo de la estación de trabajo local y vista previa

c) la aplicación de IIS, ASP.NET, .NET 4.0

d) Crystal Reports instalados correctamente (es decir un debate totalmente diferente, pero baste decir, que es mejor tener una carpeta llamada aspnet_client con los subdirectorios de la siguiente manera:

**system_web 
    4_0_30319 
     crystalreportviewers12** 

etc.

que es paralelo a la ubicación de la aplicación web. Hay mucho más, pero no aquí ...

e) Las imágenes son como fotos o lo que sea, pero tienen un tamaño razonable y no son demasiado grandes en bytes.

f) Existen miniaturas para cada imagen o está disponible un archivo de miniaturas por defecto.

g) Son imágenes JPG, PNG o BMP. De lo contrario, estás fuera de suerte AFAICT. Si se trata de documentos como Word, PDF, etc. que desea mostrar en la misma lista, necesitará una miniatura para esos también. Pero mantengamos el tema de la imagen ...

h) Usted tiene imágenes organizadas en una jerarquía de carpetas en su servidor web, o accesibles para su servidor web, pero en cualquier caso, accesibles para el sitio web. Vamos a suponer que todos están bajo una localización principal D: \ Mis documentos

que no has probado este refiriéndose a un sitio FTP como la pregunta original, pero dudo de que funcione.

2) Necesita una tabla de base de datos u otro tipo de repositorio al que pueda acceder el servidor web para registrar sus imágenes. El formato DB es flexible, pero asumiremos que es una lista con clave para su dominio de interés principal, donde tiene 0: N imágenes por elemento principal, por ejemplo, imágenes de una residencia, o imágenes de un puente, o imágenes de un inspección de la casa Esta tabla tiene una ruta completa a sus archivos, o una ruta relativa, o una ubicación de carpeta más una columna de nombre de archivo dedicado. Lo que sea, pero que tienen que hacer una ruta de archivo como:

D:\MyDocuments\folderA\folder1\area51\whatever\myfile.png 

por lo que la base de datos contiene toda la cosa, o parte de ella, o de los bits, o lo que sea.

3) La carpeta raíz es D: \ MyDocuments al ver los informes localmente/independiente/no con un navegador. Este es un nombre arbitrario pero mantén un registro de él por ahora.

4) Registra esa carpeta raíz para que CR pueda encontrarla. Esto puede ser cableado en sus informes (incorrecto) o buscado desde un archivo INI (ummm, OK) o en un campo de base de datos (¿por qué no, ya que está registrando sus imágenes de todos modos?) O pasado como un parámetro para su informes que desean mostrar imágenes o enlaces de documentos (simples, pero ¿qué sucede cuando se implementa en otro sistema de archivos?)

5) En su informe que muestra las imágenes, y estoy asumiendo aquí N/elemento de interés como descrito en (2) arriba, tiene una imagen insertada con el diseñador de CR. Vincularlo a alguna imagen muy falsa o una imagen por defecto para que pueda saber si está tratando de solucionar los nombres de los archivos ....

6) El pathimagen de miniatura se recupera de la base de datos y se monta como sea necesario, con la espalda SLASHES, en un nombre de archivo. Se almacenará en Shared StringVar FullQualifiedThumbnailFileName (digamos) en el informe y consta de la raíz del documento, que se puso a disposición del informe en el paso (4) y se almacenó en un DocRoot Shared StringVar dedicado (digamos) PLUS el nombre de archivo calculado. Así campo de fórmula FullyQualifiedThumbnailFileName parece: {} @DocRoot & FolderLocationFromDB & ThumbnailFileNameFromDB o en la vida real:

D:\MyDocuments\folderA\folder1\area51\whatever\tn_myfile.png 

7) Así que ahora tiene un nombre de archivo de imágenes en miniatura. Colóquelo en cualquier lugar del borrador del informe para que pueda ver también lo que se está resolviendo durante el diseño. Haga exactamente lo mismo para referirse al nombre de archivo REAL y cree una variable llamada FullyQualifiedThumbnailFileName. Debería poder abrirse con un visor de imágenes si se ha construido correctamente. Tíralo también a algún lado para que puedas leerlo y usarlo para probar.

8) Haga clic con el botón derecho en el objeto de imagen en el informe, elija Formato de gráfico, haga clic en la pestaña de la imagen y abra el icono de fórmula para la ubicación de la imagen.

Antes de que empiece a quejarte, mira las suposiciones en la parte superior: no tengo idea de qué versiones anteriores de CR lo soportan, o si lo hacen de manera diferente.

A continuación, en el editor de fórmulas, escriba lo siguiente:

{} @FullQualifiedThumbnailFileName que creó hace un minuto. Su miniatura es una ruta de DOS de Windows a un nombre de archivo local en el servidor web o su estación de trabajo de desarrollo.

9) Ahora agregue un parámetro a su informe, o haga una variable de fórmula, o lo que sea, que consiste por defecto en la cadena "file: //". Esto será REEMPLAZADO en el tiempo de ejecución con la raíz de la aplicación httpContext.Current.Session, pero lo haremos en un minuto. Creo que se podría haber hecho esto antes .... Nombre esta WebURLRoot

10) Crear un campo de fórmula llamada txtImageURL De todos modos, el nombre es de usted, pero supongo que lo que pasa aquí? Algo así como lo siguiente:

if lowercase({@WebURLRoot}) = "file://" THEN 
    {@WebURLRoot} & 
     REPLACE( {@txtDocumentFileFullyQualifiedName},"/","\") 
else 
    URLENCODE({@WebURLRoot} & 
     REPLACE( 
     {*DocumentFileNameFromYourSource*} 
     ,"\","/") ) 

La Anexión del nombre del archivo DocumentFileNameFromYourSource a WebURLRoot que funciona para mí porque tengo rutas relativas en mi situación que no incluyen el docroot. Tu situación puede ser diferente. En cualquier caso, en modo autónomo , esta variable debe resolver a:

file://D:\MyDocuments\folderA\folder1\area51\whatever\myfile.png 

en que esto no es una miniatura. En tiempo de ejecución en la web, se debe resolver a:

http://somewebhost/website/folderA/folder1/area51/whatever/myfile.png 

porque vamos a suministrar http: // localhost/sitio web a la variable WebURLRoot somehow.I lo hizo usando un parámetro pasado desde la Aplicación web. Podría ser buscado o cableado, pero recuerde, ¿qué sucede si el sitio web se reubica?

Ponga {@txtImageURL} en la fórmula de nombre de archivo calculada del hipervínculo, y haga clic en la opción para indicar que proviene de un sitio web en Internet, como su servidor de desarrollo local o lo que sea.

En modo independiente, las cadenas de archivos en txtImageURL tienen barras diagonales inversas. En tiempo de ejecución, están configurados para reenviar barras para el nombre completo del archivo. La función URLEncode de Crystal los hace agradables para fines web.

Vuelva a colocar txtImageURL en su superficie de desarrollo hasta que esté recta.

11) Ahora tiene una CR RPT con

a) Una variable que contiene la raíz de Windows de su árbol de documentos C: \ Mis documentos, el que facilita el informe por cualquier medio. Lo almaceno en la base de datos a la que se conecta mi aplicación.

b) Una variable que contiene la ruta de la ventana de la uña del pulgar, construida a partir del nombre de miniatura en la base de datos más la raíz del documento

c) Una variable que contiene la ruta de Windows a su nombre de archivo real, construido de nuevo desde el nombre real del archivo en la base de datos, más la raíz del documento

d) Un tallo URL del sitio web que es file: // durante el desarrollo y http: // localhost/web/ en tiempo de ejecución para el sitio web. Está pasando este

e) Una URL funcional para el archivo de imagen que combina el origen del URL del sitio web con el archivo real.

¿Bien hasta ahora? Agarre una cerveza. Quizás 2.

C# cambia

1) Aceptar, por lo que necesitamos para modificar nuestro mundo para pasar el tallo URL del sitio web a un informe en tiempo de ejecución como parámetro. No puede hacer esto en la web usando Crystal Reports Viewer. Asumiendo que ha seguido uno de los muchos ejemplos disponibles de cómo cargar, parametrizar y mostrar un informe desde una aplicación web, y creo que puede encontrarlos con Google, asegúrese de hacerlo en su aplicación en alguna parte. Localicé mina en Global.asax.cs en caso Session_Start que parece muy razonable de acuerdo con el authoer ... Tenga en cuenta que el crédito es debido al personaje URL referenciado ...:

// 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) ahora donde se crean los parámetros para su informe, asegúrese de pasar Sesión [ "APP_Path"] como un parámetro o menos así:

// 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 
} 

donde exporter.Arguments sostiene los parámetros para mis informes. Tu situación, sin duda, será diferente. Una cosa algo importante es poner este parámetro SIEMPRE PRIMERO o SIEMPRE ÚLTIMO, de modo que otros parámetros no se arruinen por él. Use el mismo orden para los parámetros en el informe en sí. Los parámetros aparentemente asocian los valores por su nombre de todos modos, pero creo que mezclarlos es una mala idea y en última instancia confuso.

3) Por lo tanto, ahora ejecuta sus informes de forma independiente, y cuando se le solicite la dirección URL del sitio web, ingrese file: //. Cuando el mismo informe exacto se ejecuta en la web, la aplicación lo envía sea cual sea el origen del sitio web, pero algo así como http: // localhost/website/.

Gotchas:

1) Durante el desarrollo de esta, muestran sus variables en sus informes. Asegúrese de que para las miniaturas esté utilizando rutas de Windows/DOS relativas al servidor pero completas, y para las imágenes, rutas de Windows/DOS completas durante el desarrollo precedido de file: // Siempre puede ocultarlas antes de la producción.

2) Cuidado con demasiadas barras, etc. Es fácil acabar con una doble barra que se enrosca hasta las URLs ...

3) Recuerde que las fórmulas se evalúan en una especie de secuencia de mística Crystal pero entiendo que el encabezado de página se procesa antes de los detalles. Puse TODAS mis variables comunes, es decir, DocRoot y WebSiteRootURL allí en el encabezado de página (o incluso el encabezado del informe, ya que no cambian), por lo que primero se cuantifican, y la banda de detalles puede usarlos.

4) Delegué toda la imagen que se muestra y el listado en un subinforme integrado. Comparte las variables que necesita utilizando un enfoque Shared StringVar xyz. Es un poco complicado, pero básicamente el subinforme siempre obtiene su valor del informe del contenedor para las cosas en común (ver comentario 3 arriba). Para diseñar ese subinforme, hice un informe interno aún más pequeño para servir como titular de las variables comunes para no tener que ejecutar toda la monstruosidad.

5) Estos 'titulares de variables' no pueden suprimirse o los valores no parecen resolverse. Así que hazlos extremadamente pequeños y sin bordes, luego aplasta los encabezados de las páginas o lo que sea para ocultarlos.Supongo que el texto y el fondo también pueden ser idénticos para ocultarlos, pero no lo hagas hasta que hayas terminado de jugar con el diseño, etc. o tendrás que buscar el subinforme itty-bitty. Son tus variables de memoria local.

6) Los archivos de imagen/documento/vinculados en modo autónomo DEBEN utilizar rutas de nombre de archivo de DOS/Windows convencionales (sin barras diagonales). Estos pueden resolverse para el sitio web, pero para hacer un hipervínculo, las barras tienen que seguir adelante hasta donde yo sepa, así que suponga que tendrá que dar un salto.

7) Como nota al margen, pude ubicar mis documentos fuera de la jerarquía del sitio web durante el desarrollo utilizando Junction Magic para reasignar ~/MyDocuments a D: \ MyDocuments etc. El servidor web no parece importarle que en realidad está atravesando D: \ MyDocuments pero cree que está en una subcarpeta del sitio web. SIN EMBARGO, puede que tenga que usar un enfoque de Directorio Virtual - prevenido. O bien, almacene los documentos directamente debajo del sitio web, pero de alguna manera parece klutzy.

8) ¿Mencioné los problemas de permisos? No, pero podrían morderte. Asegúrese de que IIS_IUSR y lo que sea pueda acceder a los archivos/carpetas, etc.

9) ¿No debería haber sido todo más fácil? Oh, bueno, gracias de todos modos SAP ...

News Blast -

lo que al parecer también el objeto Request sostiene el tallo URL del sitio web. Úselo si no quiere ir por la ruta de un global.
Además, puede que no lo haya declarado explícitamente, pero el objeto CR OLE solo entiende Windows ... no las convenciones de nombre de archivo de Unix. Como una consideración adicional, las longitudes de trayectoria deben conformarse. Finalmente, cuando muestro los nombres de los archivos en la página web, oculto tanto la raíz de DOS/Windows como la raíz del sitio web y solo muestro la ruta relativa, p. ~/Folder/Folder/File.png para que no quede muy claro cómo se organizan los documentos en el sitio web, probablemente innecesariamente paranoico, pero también tiene el beneficio de que si el sitio web se mueve, los usuarios no se desconciertan.

Las preguntas pueden o no obtener respuestas. Que te diviertas.

0

El principal problema es CrystalImageHandler.aspx sólo funciona para la carpeta raíz (quiero decir: para c:\inetpub\wwwroot) por lo que hay 2 opciones:

  1. Desde el administrador de cambios ISS Default Web Site ->Advanced Settings ->Physical Route%SystemDrive%\inetpub\wwwroot-YourFolderName
  2. mover sus archivos a %SystemDrive%\inetpub\wwwroot

hasta ahora, he encontrado esta solución. Espero eso ayude.

1

Aquí tienes ... (probado con VS 2013) - ¡¡¡Trabajando !!!

1) anuncio una imagen para el informe usando Insertar> imagen

2) Haz clic derecho en la imagen -> formato de objeto -> imagen

3) Cambiar la fórmula de la ubicación gráfica

ex

"E:\tmp\wrk\s1.jpg" 

puede cambiar la ruta y el nombre de archivo de acuerdo a sus necesidades y condiciones de uso de la fórmula constructor de

Cuestiones relacionadas