Отображение изображения в отчетах Crystal с использованием URL-адреса

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

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

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

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

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


person Shantanu Gupta    schedule 31.03.2010    source источник


Ответы (4)


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

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

person Ray    schedule 31.03.2010
comment
@Ray Могу ли я сделать это с файлом .rdlc? - person Shantanu Gupta; 31.03.2010
comment
Я так считаю, но я не очень хорошо знаком с файлами rdlc - вот ссылка, которую я нашел, может помочь: msdn.microsoft.com/en-us/library/ms251715 (v = VS.80) .aspx - person Ray; 31.03.2010
comment
это возможно с CR, включенным в Visual Studio (по крайней мере, по сравнению с 2013 годом). смотри мой ответ .. - person kuma DK; 16.08.2016

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

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

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

б) Веб-отображение изображений в отчетах желательно, с разработкой и предварительным просмотром локальной рабочей станции.

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

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

**system_web
   4_0_30319
      crystalreportviewers12**

и т.п.

это параллельно расположению веб-приложения. Есть еще много чего, но не здесь ...

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

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

ж) Это изображения в формате 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-файла (ummm, OK), либо в поле базы данных (почему бы и нет, поскольку вы все равно регистрируете свои изображения?), Или передать в качестве параметра вашему отчеты, которые хотят показать изображения или ссылки на документы (просто, но что происходит, когда вы развертываете в какой-либо другой файловой системе?)

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

6) Путь к миниатюре изображения извлекается из базы данных и при необходимости объединяется с обратными косыми чертами в имя файла. Он будет храниться в 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) Переменная, содержащая корень Windows вашего дерева документов C: \ MyDocuments, который вы каким-либо образом передали в отчет. Я храню его в базе данных, к которой подключается мое приложение.

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

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

г) Основа 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) Эти отчеты о держателях переменных не могут быть подавлены или значения не разрешаются. Так что сделайте их очень маленькими и без полей, а затем сожмите заголовки страниц или что-то еще, чтобы скрыть их. Я предполагаю, что текст и фон можно было бы установить одинаковыми, чтобы дополнительно скрыть их, но не делайте этого, пока не закончите возиться с макетом и т. Д., Или вам придется пастись, чтобы найти подотчет itty-bitty. Это переменные вашей локальной памяти.

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

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

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

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

ВЗРЫВ НОВОСТЕЙ -

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

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

person Allen    schedule 26.09.2012

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

1) Добавьте изображение в отчет с помощью insert-> picture

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

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

ex-

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

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

person kuma DK    schedule 16.08.2016

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

  1. Из Менеджера ISS сменить _3 _-> _4 _-> _ 5_ с %SystemDrive%\inetpub\wwwroot на YourFolderName
  2. Переместите файлы в %SystemDrive%\inetpub\wwwroot

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

person nes    schedule 18.02.2016