2010-03-31 11 views
5

Voglio mostrare l'immagine in un report di cristallo. Lo scenario è qualcosa del genere.Visualizza l'immagine nei report Crystal utilizzando l'URL

Ho un database in cui il mio percorso di un'immagine è persistente. ad es. ftp://Images/1.jpg

Ora voglio ripetere questa immagine in un rapporto di cristallo.

Quando riempie il mio datatable mi mostra l'URL completo. Quando visualizzo questo campo in GridView io uso imageBox per visualizzare la mia immagine e funziona molto bene per me.

Ma quando provo a fare lo stesso con i report di cristallo, inizia a mostrare il percorso dell'immagine così com'è. Ora qui invece del percorso voglio che venga visualizzata un'immagine.

+0

Adattare la tecnica in questo post: [Crystal Reports: Dynamic Images] (http://cogniza.com/wordpress/2010/03/15/crystal-reports-dynamic-images/). – craig

risposta

-1

So che se si utilizza Crystal Reports incluso in Visual Studio, questo non è supportato. Visualizzerà le immagini memorizzate in un campo DB, ma non da un URL.

Penso (ma non so per certo) che nessuna versione di Crystal supporta il protocollo ftp per la visualizzazione delle immagini.

+0

@Ray Posso farlo con il file .rdlc? –

+0

Credo di sì, ma non ho molta familiarità con i file rdlc - ecco un link che ho trovato utile: http://msdn.microsoft.com/en-us/library/ms251715(v=VS.80). aspx – Ray

+0

è possibile con CR incluso in Visual Studio (almeno rispetto al 2013). vedi la mia risposta .. –

5

OK, quindi la scia di lacrime per mostrare immagini in rapporto CR attraverso il web è il seguente:

1) si assume la seguente:

a) CR 2008 aka CR 12. Io non so sulle versioni precedenti, ma XIR2 (11.5) potrebbe funzionare.

b) vetrina web di immagini in rapporti si desidera, con lo sviluppo workstation locale e anteprima

c) applicazione IIS, ASP.NET, .NET 4.0

d) Crystal Reports installati correttamente (cioè una discussione del tutto diversa, ma basti dire, è meglio avere una cartella denominata aspnet_client con le sottodirectory come segue:

**system_web 
    4_0_30319 
     crystalreportviewers12** 

ecc

che è parallelo alla posizione dell'applicazione web. C'è molto di più - ma non qui però ...

e) Le immagini sono come foto o altro, ma sono di dimensioni ragionevoli e non troppo grandi in termini di byte.

f) Sono disponibili miniature per ogni immagine oppure è disponibile un file di anteprima predefinito.

g) Sono immagini JPG, PNG o BMP. Altrimenti, sei sfortunato AFAICT. Se sono documenti come Word, PDF, ecc. Che desideri mostrare nella stessa lista, avrai bisogno di una miniatura anche per quelli. Ma rimaniamo sull'argomento dell'immagine ...

h) Si dispone di immagini organizzate in una gerarchia di cartelle sul server Web o accessibili al server Web, ma in ogni caso accessibili dal sito Web. Supponiamo che sono tutti sotto un principale posizione D: \ Documenti

non ho provato QUESTO riferendosi a un sito FTP COME IL domanda iniziale ma dubito che funzionerà.

2) Per la registrazione delle immagini è necessaria una tabella di database o altro tipo di archivio accessibile al server web. Il formato DB è flessibile, ma assumeremo che si tratti di una lista di chiavi del tuo dominio principale di interesse, in cui hai 0: N immagini per elemento principale, ad esempio immagini di una residenza, o immagini di un ponte, o immagini di un ispezione a casa. Questa tabella ha un percorso completo per i tuoi file, o un percorso relativo, o una posizione della cartella più una colonna dedicata al nome del file. Qualunque cosa, ma devono fare un percorso di file come:

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

in modo che il database contiene il tutto, o parte di esso, o di bit, o qualsiasi altra cosa.

3) La cartella radice è D: \ MyDocuments durante la visualizzazione di report localmente/standalone/non con un browser. Questo è un nome arbitrario, ma tenetene traccia per ora.

4) Si registra la cartella principale in modo che CR possa trovarla. Questo può essere cablato nei tuoi report (cattivo) o cercato da un file INI (ummm, OK) o in un campo di database (perché no, dal momento che stai comunque registrando le tue immagini?) O passato come parametro al tuo segnalazioni che vogliono mostrare immagini o collegamenti di documenti (semplice, ma cosa succede quando si distribuisce su un altro file system?)

5) Nel report che mostra le immagini, e presumo qui N/item di interesse descritto in (2) sopra, hai una foto inserita con il progettista CR. Collegarlo a qualche immagine veramente fasullo o un'immagine predefinita in modo da poter dire se si sta risolvendo i nomi dei file ....

6) L'immagine percorso della miniatura viene recuperato dal database e assemblato come necessario, con INDIETRO LAGHI, in un nome di file. Verrà memorizzato in una stringa condivisa condivisa FullQualifiedThumbnailFileName (diciamo) nel report e consiste nella root del documento, che è stata resa disponibile per il report nel passaggio (4) e memorizzata in una Docarot condivisa condivisa StringVar (diciamo) PLUS il nome del file calcolato. Quindi campo formula FullyQualifiedThumbnailFileName assomiglia: {} @DocRoot & FolderLocationFromDB & ThumbnailFileNameFromDB o nella vita reale:

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

7) Così ora si dispone di un nome di file miniatura. Rilascialo in qualsiasi punto del rapporto di bozza in modo da poter vedere cosa si risolve anche durante la progettazione. Fai la stessa cosa per fare riferimento al nome del file REAL e creare una variabile denominata FullyQualifiedThumbnailFileName. Dovrebbe essere apribile con un visualizzatore di immagini se è stato costruito correttamente. Lasciatelo da qualche parte in modo da poterlo leggere e usarlo per testare.

8) Fare clic con il pulsante destro del mouse sull'oggetto immagine nel report, selezionare Formato grafico, fare clic sulla scheda Immagine e aprire l'icona della formula per la posizione dell'immagine.

Prima di iniziare a piagnucolare con me, guarda le ipotesi in alto - Non ho idea di quali versioni precedenti di CR supportino questo, o se lo fanno in modo diverso.

Poi, nel editor di formule, immettere la seguente:

{} @FullQualifiedThumbnailFileName cui è stato creato solo un minuto fa. La miniatura è un percorso DOS di Windows con un nome file locale sul server web o sulla workstation di sviluppo.

9) Ora aggiungere un parametro al report o creare una variabile formula o qualsiasi altra cosa che consiste per impostazione predefinita della stringa "file: //". Questo verrà SOSTITUITO in fase di runtime con la root dell'applicazione httpContext.Current.Session ma ci arriveremo in un minuto. Credo che si potrebbe aver fatto questo in precedenza .... Nome questa WebURLRoot

10) Creare un campo formula chiamata txtImageURL In ogni caso, il nome è a voi ma indovinate un po va qui? Qualcosa di simile a quanto segue:

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

l'apposizione del nome del file per DocumentFileNameFromYourSource WebURLRoot funziona per me, perché ho i percorsi relativi nella mia situazione che non includono il docroot. La tua situazione potrebbe essere diversa. In ogni caso, in modalità standalone , questa variabile dovrebbe risolvere a:

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

in cui questa non è una miniatura. In fase di esecuzione sul web, si dovrebbe risolvere a:

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

perché stiamo andando a fornire http: // localhost/sito alla variabile WebURLRoot somehow.I lo ha fatto utilizzando un parametro passato dal applicazione web. Potrebbe essere cercato o cablato, ma ricorda, cosa succede se il sito web viene trasferito?

Mettere {} @txtImageURL nel collegamento ipertestuale calcolato nome del file formula e fare clic sull'opzione per indicare che è venuta da un sito web su internet AKA il server di sviluppo locale o qualsiasi altra cosa.

In modalità standalone, le stringhe di file in txtImageURL hanno barre rovesciate. In fase di esecuzione, sono impostati per inoltrare le barre per il nome completo del file. La funzione URLEncode di Crystal li rende utili per scopi web.

Ancora una volta rilasciare txtImageURL sulla superficie di sviluppo finché non è diritta.

11) Ora avete una RPT CR con

a) Una variabile che detiene la principale di Windows della vostra documenti albero C: \ Documenti, che avete fornito alla relazione con qualsiasi mezzo. Lo memorizzo nel database al quale la mia applicazione si connette.

b) Una variabile che tiene il percorso finestra per l'unghia del pollice, costruito dal nome miniatura nella banca dati più la radice del documento

c) Una variabile che tiene il percorso di Windows per il tuo vero nome del file, di nuovo costruito dal il nome del file effettivo nel database più la radice del documento

d) Un fusto URL del sito web che è file: // durante lo sviluppo e http: // localhost/sito/in fase di esecuzione per il sito web. Si sta passando a questo

e) Un URL funzionante per il file di immagine che combina l'URL del sito Web deriva dal file effettivo.

Buono finora? Prendi una birra. Forse 2.

C# cambia

1) OK, quindi abbiamo bisogno di modificare il nostro mondo per passare il gambo URL del sito web per un rapporto a tempo di esecuzione come parametro. Non è possibile farlo sul Web utilizzando Crystal Reports Viewer. Supponendo che tu abbia seguito uno dei tanti esempi disponibili su come caricare, parametrizzare e mostrare un report da un'applicazione web, e penso che tu possa trovarli con Google, assicurati di farlo nella tua applicazione da qualche parte. Ho individuato miniera in Global.asax.cs nel caso Session_Start che sembra altamente ragionevole secondo l'authoer ... Si prega di notare che il credito è dovuto al personaggio URL di riferimento ...:

// 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) ora in cui si crea i parametri per il report, assicurarsi di passare Session [ "APP_Path"] come parametro qualcosa di simile:

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

dove exporter.Arguments detiene i parametri per i miei rapporti. La tua situazione sarà senza dubbio diversa. Una cosa un po 'importante è mettere questo parametro SEMPRE SEMPRE o SEMPRE ULTIMO, in modo tale che altri parametri non siano rovinati da esso. Utilizzare lo stesso ordine per i parametri nel report stesso. I parametri apparentemente associano i valori per nome, ma penso che mischiarli a mash è una cattiva idea e alla fine confusa.

3) Così ora si eseguono i report autonomamente e quando viene richiesto di inserire l'URL dell'URL del sito Web, immettere file: //. Quando lo stesso report esatto viene eseguito sul Web, l'applicazione lo invia indipendentemente dallo stem del sito Web, ma qualcosa come http: // localhost/website/.

grattacapi:

1) durante lo sviluppo di questo, mostrano le variabili nei rapporti. Assicurati che per le anteprime utilizzi sempre percorsi Windows/DOS relativi ma relativi al server e, per le immagini, percorsi Windows/DOS completi durante lo sviluppo anteposto al file: // Puoi sempre nasconderli prima della produzione.

2) guardare fuori per troppi tagli, ecc E 'facile finire con una doppia barra che si avvita gli URL ...

3) Ricordate che le formule vengono valutate in una sorta di sequenza mistica da Crystal, ma capisco che l'intestazione della pagina viene elaborata prima del dettaglio. Inserisco TUTTE le mie variabili comuni, ad esempio DocRoot e WebSiteRootURL, nell'intestazione di pagina (o anche nell'intestazione del report poiché non cambiano), quindi vengono prima quantificate e la banda di dettagli può utilizzarle.

4) Ho delegato tutte le immagini visualizzate e elencate in un sottoreport incorporato. Condivide le variabili necessarie utilizzando un approccio Shared StringVar xyz. È tutto un po 'stridulo, ma in pratica il sottoreport prende sempre il suo valore dal rapporto del contenitore per le cose comuni (vedere il commento 3 sopra). Per la stesura di quel sottoreport, ho creato un sottoreport ancora più minuscolo per fungere da detentore delle variabili comuni, quindi non avrei dovuto eseguire l'intera mostruosità.

5) Questi rapporti "titolare variabile" non possono essere soppressi o i valori non sembrano risolti. Quindi rendili estremamente piccoli e senza bordi, quindi schiaccia le intestazioni delle pagine o qualsiasi altra cosa per nasconderle.Suppongo che il testo e lo sfondo possano essere impostati ugualmente per mantenerli nascosti ma non farlo finché non hai finito di manipolare il layout, ecc. O dovrai sfiorarti per trovare il sottoreport itty-bitty. Sono le tue variabili di memoria locali.

6) Immagine/documento/file collegati in standalone DEVE utilizzare percorsi di nome di file convenzionali DOS/Windows (senza slash). Questi possono risolversi per il sito Web, ma per creare un collegamento ipertestuale, le barre devono andare avanti, per quanto posso dire, supponiamo che dovrai flip-flop.

7) Come nota a margine, sono stato in grado di spostare i miei documenti fuori dalla gerarchia del sito Web durante lo sviluppo utilizzando Junction Magic per rimappare ~/MyDocuments su D: \ MyDocuments, ecc. che in realtà sta attraversando D: \ MyDocuments ma pensa che si trovi in ​​una sottocartella del sito web. TUTTAVIA, potrebbe essere necessario utilizzare un approccio di directory virtuale - essere preavvisato. Oppure, archivia i documenti direttamente sotto il sito ma in qualche modo sembra klutzy.

8) Ho già detto problemi di permessi? No, ma potrebbero morderti. Assicurarsi che l'IIS_IUSR e tutto ciò che possa accedere ai file/cartelle ecc

9) Non dovrebbe questo hanno tutti stato molto più facile? Oh bene, grazie lo stesso SAP ...

NEWS BLAST -

così apparentemente l'oggetto Request detiene anche il gambo URL del sito web. Usalo se non vuoi seguire il percorso di un globale.
Inoltre, non posso avere esplicitamente dichiarato, ma l'oggetto OLE CR capisce solo Windows ... Not Unix convenzioni dei nomi di file. Come ulteriore considerazione, le lunghezze del percorso devono essere conformi. Infine, quando mostro i nomi dei file nella pagina Web, mantengo sia la radice DOS/Windows che l'intestazione del sito Web e mostriamo solo il percorso relativo, ad es. ~/Folder/Folder/File.png in modo che non sia troppo ovvio come i documenti sono disposti sul sito web - probabilmente inutilmente paranoico, ma ha anche il vantaggio che se il sito web si sposta gli utenti non rimangono sconcertati.

domande possono o non possono ottenere risposte. Divertiti.

0

Il problema principale è CrystalImageHandler.aspx funziona solo per la cartella principale (intendo: per c:\inetpub\wwwroot) quindi ci sono 2 opzioni:

  1. Dal cambiamento ISS manager Default Web Site ->Advanced Settings ->Physical Route%SystemDrive%\inetpub\wwwroot-YourFolderName
  2. trasferire i file da %SystemDrive%\inetpub\wwwroot

Finora, ho trovato questa soluzione. Spero che sia d'aiuto.

1

Qui si va ... (testato con VS 2013) - di lavoro !!!

1) Ad un'immagine per il report utilizzando Inserisci-> immagine

2) Fare clic destro sull'immagine -> formato oggetto -> immagine

3) Modificare la formula della locazione grafica

ex

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

È possibile modificare il percorso e il nome del file secondo il vostro requisito e condizioni utilizzando il generatore di formula

Problemi correlati