Итак, след слез при отображении изображений в отчете 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