c# .net asp.net gridview crystal-reports

c# - Mostrar imagen en informes de Crystal usando URL



.net asp.net (4)

Quiero mostrar la imagen en un informe de cristal. El escenario es algo como esto.

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

Ahora quiero repetir esta imagen en un informe de cristal.

Cuando llene mi datatable me muestra la url completa. Cuando imageBox 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 es. Ahora aquí, en lugar de la ruta, quiero que se muestre una imagen.


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 admite el protocolo ftp para mostrar imágenes.


De acuerdo, entonces el rastro de lágrimas para mostrar imágenes en el informe de RC en la web es el siguiente:

1) Se supone lo siguiente:

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

b) Se desea la visualización web de las imágenes en los informes, con desarrollo de estación de trabajo local y vista previa

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

d) Crystal Reports instalado correctamente (es una discusión completamente diferente, pero basta con decir que es mejor que tenga una carpeta llamada aspnet_client con subdirectorios de la siguiente manera:

**system_web 4_0_30319 crystalreportviewers12**

etc.

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

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

f) Existen miniaturas de cada imagen o está disponible un archivo de miniaturas predeterminado.

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 sigamos en el tema de la imagen ...

h) Usted tiene imágenes organizadas en una jerarquía de carpetas en su servidor web, o accesible para su servidor web, pero en cualquier caso, accesible para el sitio web. Supongamos que todos están bajo una ubicación principal D: / MyDocuments

No he probado esta referencia a un sitio FTP como la pregunta original, pero creo que funcionará.

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 tienen que hacer una ruta de archivo como:

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

entonces la base de datos contiene todo, o parte de él, o los bits, o lo que sea.

3) La carpeta raíz es D: / MyDocuments cuando se visualizan informes localmente / independiente / no con un navegador. Este es un nombre arbitrario pero mantén un registro de él por el momento.

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é ocurre cuando se implementa en algún otro sistema de archivos?)

5) En su informe que muestra las imágenes, y estoy asumiendo aquí N / elemento de interés como se describe en (2) arriba, tiene una imagen insertada con el diseñador de CR. Conéctelo a una imagen realmente falsa o una imagen predeterminada para que pueda saber si está resolviendo los nombres de los archivos ....

6) La ruta de acceso de la miniatura de la imagen se recupera de la base de datos y se ensambla según sea necesario, con RETROCESOS ATRÁS, 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 dedicado DocRoot de StringVar dedicado (digamos) MÁS el calculado nombre del archivo. Así que el campo de fórmula FullyQualifiedThumbnailFileName tiene el siguiente aspecto: {@DocRoot} & FolderLocationFromDB & ThumbnailFileNameFromDB o en la vida real:

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

7) Entonces ahora tienes un nombre de archivo 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 Dar formato a gráfico, haga clic en la pestaña de imagen y abra el icono de fórmula para la ubicación de la imagen.

Antes de que empieces 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.

Luego, en el editor de fórmulas, ingrese lo siguiente:

{@FullQualifiedThumbnailFileName} que creaste hace solo 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 consista 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. Supongo que podrías haber hecho esto antes ... Nombre este WebURLRoot

10) Crea un campo de fórmula llamado txtImageURL De todos modos, el nombre depende de ti, pero adivina qué pasa aquí? Algo como lo siguiente:

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

La adición del nombre de archivo DocumentFileNameFromYourSource a WebURLRoot funciona para mí porque tengo rutas relativas en mi situación que NO incluyen DocRoot. Tu situación puede ser diferente. En cualquier caso, en modo independiente , esta variable debería resolverse a:

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

donde esto no es una miniatura En tiempo de ejecución en la web, debe resolver:

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

porque vamos a suministrar http: // localhost / web a la variable WebURLRoot de alguna manera. Lo hice 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?

Coloque {@txtImageURL} en la fórmula del nombre del archivo calculado para el 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 el modo independiente, las cadenas de archivos en txtImageURL tienen barras invertidas. 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 un CR RPT con

a) Una variable que contiene la raíz de Windows de su árbol de documentos C: / MyDocuments, que usted suministró al 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 a su miniatura, construida a partir del nombre de la 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, nuevamente construido a partir del nombre de archivo real en la base de datos más la raíz del documento

d) Una raíz de URL del sitio web que es file: // durante el desarrollo y http: // localhost / web / en tiempo de ejecución para el sitio web. Estás pasando esto

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

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

Cambios de C #

1) De acuerdo, entonces debemos ajustar nuestro mundo para pasar el 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é el mío en Global.asax.cs en el evento Session_Start, que parece muy razonable según el autor ... Tenga en cuenta que el crédito se debe al personaje de la URL a los que se hace referencia ... :

// 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, cuando cree los parámetros para su informe, asegúrese de pasar la Sesión ["APP_Path"] como un parámetro como este:

// 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 exportador.Argumentos contiene 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 esto, muestre 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 un archivo: // Siempre puede ocultarlas antes de la producción.

2) Cuidado con demasiadas barras, etc. Es fácil terminar con una doble barra que arruina las URL ...

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

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 "informes de titulares variables" no se pueden suprimir 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 reubicar mis documentos fuera de la jerarquía del sitio web durante el desarrollo usando Junction Magic para reasignar ~ / MyDocuments a D: / MyDocuments etc. El servidor web no parece importarle que sea en realidad atravesando D: / MyDocuments pero piensa que está en una subcarpeta del sitio web. SIN EMBARGO, puede que tenga que usar un enfoque de Directorio Virtual - prevenido. O bien, guarde los documentos directamente debajo del sitio web, pero de alguna manera parece klutzy.

8) ¿He mencionado 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 ...

NOTICIAS BLAST -

así que aparentemente el objeto Request también contiene el URL del sitio web. Úselo si no quiere ir por la ruta de un global.
Además, es posible 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, por ejemplo ~ / Folder / Folder / File.png para que no quede muy claro cómo los documentos están dispuestos en el sitio web, probablemente innecesariamente paranoicos, pero también tiene el beneficio de que si el sitio web se mueve, los usuarios no se desconcierten.

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


El principal problema es CrystalImageHandler.aspx solo funciona para la carpeta raíz (quiero decir: para c:/inetpub/wwwroot ) Entonces hay 2 opciones:

  1. Desde el Administrador del ISS, cambie el Default Web Site -> Advanced Settings -> Physical Route desde %SystemDrive%/inetpub/wwwroot a YourFolderName
  2. Mueva sus archivos a %SystemDrive%/inetpub/wwwroot

Hasta el momento, encontré esta solución. Espero eso ayude.


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

1) Adición de una imagen al informe usando insertar-> imagen

2) Haga clic derecho en la imagen -> formatear objeto -> imagen

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

ex-

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

Puede cambiar la ruta y el nombre del archivo según sus requisitos y condiciones utilizando el generador de fórmulas