ОК, поэтому слезы показа изображений в отчете 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, так что не слишком очевидно, как документы расположены на веб-сайте - вероятно, излишне параноидально, но также имеет то преимущество, что если сайт перемещается, пользователи не будут сбиты с толку.
Вопросы могут или не могут получить ответы. Веселитесь.