Отображение изображения в отчетах Crystal с использованием URL - PullRequest
5 голосов
/ 31 марта 2010

Я хочу показать изображение в отчете Crystal. Сценарий примерно такой.

У меня есть база данных, где мой путь к изображению сохраняется. например, ftp: //Images/1.jpg

Теперь я хочу повторить это изображение в отчете о кристалле.

Когда я заполняю свой datatable, он показывает мне полный URL. Когда я отображаю это поле в GridView, я использую imageBox для отображения моего изображения, и оно работает для меня очень хорошо.

Но когда я пытаюсь сделать то же самое с отчетами о кристаллах, я начинаю показывать путь к изображению как есть. Теперь здесь вместо пути я хочу, чтобы изображение отображалось.

Ответы [ 4 ]

5 голосов
/ 26 сентября 2012

ОК, поэтому слезы показа изображений в отчете CR по сети выглядят следующим образом:

1) Предполагается следующее:

a) CR 2008 или CR 12. Я не знаю о более ранних версиях, но XIR2 (11.5) может работать.

b) Желательно отображение картинок в отчетах через Интернет с разработкой локальной рабочей станции и предварительным просмотром

в) IIS, приложение ASP.NET, .NET 4.0

d) Crystal Reports установлен правильно (это совершенно другое обсуждение, но достаточно сказать, что вам лучше иметь папку aspnet_client с подкаталогами следующим образом:

**system_web
   4_0_30319
      crystalreportviewers12**

и т.д.

, который параллелен расположению веб-приложения. Там намного больше - но не здесь, хотя ...

e) Изображения похожи на фотографии или что-то еще, но имеют разумный размер и не слишком большие байты.

f) Миниатюры для каждого изображения существуют или доступен файл миниатюр по умолчанию.

g) Это изображения в формате JPG, PNG или BMP. В противном случае, вам не повезло, AFAICT. Если это такие документы, как Word, PDF и т. Д., Которые вы хотите отобразить в одном и том же списке, вам также понадобится эскиз для них. Но давайте остановимся на теме изображения ...

h) Ваши изображения организованы в иерархию папок на вашем веб-сервере или доступны для вашего веб-сервера, но в любом случае доступны для веб-сайта. Давайте предположим, что все они находятся в главном местоположении D: \ MyDocuments

Я НЕ ПРОБОВАЛ ЭТУ ССЫЛКУ НА САЙТ FTP, КАК ОРИГИНАЛЬНЫЙ ВОПРОС, НО Я СОМНЯЮ, ЧТО ЭТО РАБОТАЕТ.

2) Вам нужна таблица базы данных или другое хранилище, доступное веб-серверу для регистрации ваших изображений. Формат БД гибкий, но мы будем предполагать, что это список, связанный с вашей основной областью интересов, где у вас есть 0: N изображений для каждого основного элемента, скажем, изображения места жительства, или изображения моста, или изображения домашний осмотр. В этой таблице указывается либо полный путь к вашим файлам, либо относительный путь, либо местоположение папки плюс выделенный столбец с именем файла. Как бы то ни было, но они должны указать путь к файлу:

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

так что в базе данных хранится все, или часть, или биты, или что-то еще.

3) Корневой папкой является D: \ MyDocuments при локальном / автономном просмотре отчетов / без использования браузера. Это произвольное имя, но пока следите за ним.

4) Вы регистрируете эту корневую папку, чтобы CR мог ее найти. Это может быть либо встроено в ваши отчеты (плохо), либо отыскиваться из INI-файла (ммм, ОК), либо в поле базы данных (почему нет, так как вы все равно регистрируете свои изображения?) Или передаваться как параметр вашему отчеты, которые хотят показывать изображения или ссылки на документы (просто, но что происходит при развертывании в другой файловой системе?)

5) В вашем отчете, который показывает изображения, и я предполагаю, что здесь нет интересующего элемента, как описано в (2) выше, у вас есть изображение, вставленное с дизайнером CR. Свяжите его с каким-то действительно поддельным изображением или изображением по умолчанию, чтобы вы могли определить, разрешаете ли вы имена файлов ....

6) Путь к картинке thumbnail извлекается из базы данных и при необходимости собирается с BACK SLASHES в имя файла. Он будет храниться в Shared StringVar FullQualifiedThumbnailFileName (скажем) в отчете и состоит из корня документа, который вы сделали доступным для отчета на шаге (4), и сохранен в выделенном Shared StringVar DocRoot ( допустим) ПЛЮС вычисляемое имя файла. Итак, поле формулы FullyQualifiedThumbnailFileName выглядит так: {@DocRoot} & FolderLocationFromDB & ThumbnailFileNameFromDB или в реальной жизни:

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

7) Итак, теперь у вас есть имя файла миниатюры.Перетащите его в любое место вашего черновика отчета, чтобы вы могли увидеть, что он решает во время разработки.Сделайте то же самое, чтобы обратиться к РЕАЛЬНОМУ имени файла и создайте переменную с именем FullyQualifiedThumbnailFileName .Он должен быть открыт с помощью средства просмотра изображений, если он был построен правильно.Перетащите его куда-нибудь, чтобы вы могли прочитать его и использовать для проверки.

8) Щелкните правой кнопкой мыши на объекте изображения в отчете, выберите «Форматировать графику», перейдите на вкладку «Изображение» и откройте значок формулы дляместоположение картинки.

Прежде чем начать скулить на меня, пожалуйста, посмотрите на предположения сверху - я понятия не имею, какие ранние версии CR поддерживают это, или если они делают это по-другому.

Затем в редакторе формул введите следующее:

{@ FullQualifiedThumbnailFileName} , которое вы создали минуту назад.Ваша миниатюра представляет собой путь Windows DOS к локальному имени файла на веб-сервере или рабочей станции разработки.

9) Теперь добавьте параметр в свой отчет, или создайте переменную формулы, или что-то еще, что по умолчанию состоит изстрока "file: //".Это будет заменено во время выполнения с корнем приложения httpContext.Current.Session, но мы вернемся к этому через минуту.Я думаю, вы могли бы сделать это раньше .... Назовите это 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

, где это не миниатюра.Во время выполнения в сети он должен разрешить:

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

, потому что мы собираемся предоставить http://localhost/website для переменной WebURLRoot . Я сделал это, используя параметрпередан из веб-приложения.Его можно посмотреть или зафиксировать, но помните, что произойдет, если веб-сайт будет перенесен?

Поместите {@ txtImageURL} в формулу имени файла для вычисления гиперссылки и щелкните параметр, чтобы указать, чтоон поступает с веб-сайта в Интернете, который также называется вашим локальным сервером разработки.

В автономном режиме строки файлов в txtImageURL имеют обратную косую черту.Во время выполнения они устанавливаются для прямой косой черты для полного имени файла.Функция URLEncode от Crystal делает их удобными для веб-целей.

Снова перетащите txtImageURL на поверхность разработки, пока она не станет прямой.

11) Теперь у вас есть CR RPTс

a) Переменная, содержащая корневой каталог дерева ваших документов C: \ MyDocuments, который вы указали в отчете любым способом.Я храню его в базе данных, к которой подключается мое приложение.

b) Переменная, содержащая путь к окну вашего эскиза, составленная из имени миниатюры в базе данных и корня документа

c) Aпеременная, содержащая путь Windows к вашему реальному имени файла, снова составленная из фактического имени файла в базе данных плюс корень документа

d) Основа URL веб-сайта, которая file: // в процессе разработки и http://localhost/website/ во время выполнения для веб-сайта.Вы передаете это

e) Рабочий URL-адрес файла изображения, объединяющий основную часть URL-адреса веб-сайта с фактическим файлом.

Хорошо, пока?Хватай пиво.Может быть 2.

C # изменения

1) Хорошо, поэтому нам нужно настроить наш мир, чтобы в качестве параметра передавать URL-адрес веб-сайта в отчет во время выполнения. Вы не можете сделать это через Интернет с помощью Crystal Reports Viewer. Предполагая, что вы воспользовались одним из множества доступных примеров загрузки, параметризации и отображения отчета из веб-приложения, и я думаю, что вы можете найти их в Google, убедитесь, что вы делаете это где-нибудь в своем приложении. Я разместил свой файл в Global.asax.cs в событии Session_Start, которое, по мнению автора, представляется весьма разумным ... Обратите внимание, что кредит вызван ссылочным персонажем URL ... :

//  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) Теперь, когда вы создаете параметры для своего отчета, обязательно передайте Session ["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) Итак, теперь вы запускаете свои отчеты автономно, и когда вас попросят ввести URL-адрес веб-сайта, вы вводите file: // . Когда тот же самый точный отчет запускается через Интернет, приложение отправляет его независимо от того, что есть на сайте, но что-то вроде http://localhost/website/.

Gotchas:

1) Во время разработки укажите ваши переменные в ваших отчетах. Убедитесь, что для миниатюр вы всегда используете относительные к серверу, но полные пути Windows / DOS, а для изображений - полные пути Windows / DOS во время разработки с добавлением файла: // Вы всегда можете спрятать их перед производством.

2) Остерегайтесь слишком большого количества косых черт и т. Д. Легко закончить двойной косой чертой, которая приводит в замешательство URL-адреса ...

3) Помните, что формулы в какой-то мистической последовательности оцениваются Crystal, но я понимаю, что заголовок страницы обрабатывается до детализации. Я поместил ВСЕ свои общие переменные, т. Е. DocRoot и WebSiteRootURL, в заголовок страницы (или даже в заголовок отчета, поскольку они не меняются), так что они сначала определяются количественно, и группа подробностей может их использовать.

4) Я делегировал все изображения и списки во встроенный подотчет. Он разделяет необходимые ему переменные, используя Shared StringVar xyz подход. Это все немного сжато, но в основном подотчет всегда получает свое значение из отчета контейнера для общих вещей (см. Комментарий 3 выше). Для выкладки этого подотчета я сделал еще меньший подотчет, чтобы он служил держателем для общих переменных, чтобы мне не пришлось управлять всем чудовищем.

5) Эти «переменные» не могут подавляться или значения не отображаются для разрешения. Поэтому сделайте их очень маленькими и без полей, а затем сожмите заголовки страниц или что угодно, чтобы скрыть их. Я полагаю, что текст и фон также могут быть идентичными, чтобы в дальнейшем скрывать их, но не делайте этого, пока вы не закончите возиться с макетом и т. Д., Или вам придется суетиться, чтобы найти крошечный подотчет. Это ваши локальные переменные памяти.

6) Изображения / документы / связанные файлы в автономном режиме ДОЛЖНЫ использовать обычные пути к именам файлов DOS / Windows (без косой черты). Это может помочь веб-сайту, но для создания гиперссылки косые черты должны продвигаться вперед, насколько я могу судить, поэтому предположим, что вам придется шлепнуть.

7) Как примечание, я смог переместить мои документы из иерархии веб-сайта во время разработки с помощью Junction Magic для переназначения ~ / MyDocuments в D: \ MyDocuments и т. Д. Веб-сервер, похоже, не заботится о том, что фактически он пересекает D: \ MyDocuments, но считает, что находится в подпапке сайта. ОДНАКО, возможно, вам придется использовать подход виртуального каталога - будьте предупреждены. Или храните документы прямо под веб-сайтом, но это почему-то кажется нелепым.

8) Я упоминал проблемы с разрешением? Нет, но они могут вас укусить. Убедитесь, что IIS_IUSR и все, что может получить доступ к файлам / папкам и т. Д.

9) Разве все это не было намного проще? Ну что ж, все равно спасибо, SAP ...

NEWS BLAST -

так что, очевидно, объект Request также содержит основу URL-адреса веб-сайта. Используйте это, если вы не хотите идти по пути глобального.
Кроме того, я, возможно, не указал это явно, но объект CR OLE понимает только Windows ... а не соглашения об именах файлов unix. В качестве дальнейшего рассмотрения, длина пути должна соответствовать. Наконец, когда я показываю имена файлов на веб-странице, я скрываю как корень DOS / Windows, так и ствол веб-сайта и просто показываю относительный путь, например ~ / Folder / Folder / File.png, так что не слишком очевидно, как документы расположены на веб-сайте - вероятно, излишне параноидально, но также имеет то преимущество, что если сайт перемещается, пользователи не будут сбиты с толку.

Вопросы могут или не могут получить ответы. Веселитесь.

1 голос
/ 16 августа 2016

Вот, пожалуйста ... (протестировано с VS 2013) - Работает !!!

1) Добавьте изображение в отчет, используя insert-> picture

2) Щелкните правой кнопкой мыши на изображении -> отформатировать объект -> изображение

3) Изменить формулу графического местоположения

1011 * экс- *

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

Вы можете изменить путь и имя файла в соответствии с вашими требованиями и условиями, используя построитель формул

0 голосов
/ 18 февраля 2016

Основная проблема CrystalImageHandler.aspx работает только для корневой папки (я имею в виду: для c:\inetpub\wwwroot), поэтому есть 2 варианта:

  1. Из диспетчера МКС изменить Default Web Site -> Advanced Settings -> Physical Route с %SystemDrive%\inetpub\wwwroot на YourFolderName
  2. Переместите файлы в %SystemDrive%\inetpub\wwwroot

Пока я нашел это решение. Надеюсь, это поможет.

0 голосов
/ 31 марта 2010

Я знаю, что если вы используете Crystal Reports, включенный в Visual Studio, это не поддерживается. Он будет отображать изображения, хранящиеся в поле базы данных, но не из URL.

Я думаю (но не знаю наверняка), что ни одна версия Crystal не поддерживает протокол ftp для отображения изображений.

...