AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.06.2010, 02:16   #1  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
? Enterprise Portal - как скачать файл?
Поясняю контекст. На странице портала пользователь нажимает кнопку. Неспроста, а чтобы некий отчет сформировался, сохранился в pdf-формате на сервере (EPDocuGetWebLet для этой задачи не подходил, обошлись парой дюжин строк кода), ну и теперь надо этот pdf-отчет вернуть пользователю.

Как это сделать проще всего? Все, что имеется - это имя файла. Обязательно ли использовать weblet или можно просто написать несколько строк кода в методе dataset'а, ну или во вспомогательном классе? Или описанный подход в принципе неверен?

И, чтобы два раза не вставать, еще такой вопрос: У web menu item'а EPSalesInvoice следующий линк: _layouts/ep/downloaddocument.aspx
Но если нпаротив линка нажать "Browse for page", Аксапта ругается, что этот фолдер no longer available. Не могу понять где именно на портале искать этот downloaddocument.aspx. Не подскажете?
Старый 17.06.2010, 07:35   #2  
LEXAR is offline
LEXAR
Участник
 
27 / 17 (1) ++
Регистрация: 11.09.2009
Тут описан такой пример:
Код:
protected void Button1_Click(object sender, EventArgs e)
    {
        AxUrlMenuItem menuItem = new AxUrlMenuItem("EPDocuGet");
        DataSetViewRow row = dsEPCustInvoiceJournalInfo.GetDataSet().DataSetViews[0].GetCurrent();
        AxTableContext context = AxTableContext.Create(row.GetDefaultTableDataKey(row.DataSetView.Metadata.RootDataSource));
        menuItem.MenuItemContext = context;
   
        //Response.Redirect(menuItem.Url.ToString());
 
        string downloadURL = "window.open('" + menuItem.Url.ToString() + "', '_blank', '' );";
        ScriptManager.RegisterStartupScript(this, typeof(string), "OPEN_WINDOW", downloadURL, true);
 
    }
Старый 17.06.2010, 09:16   #3  
LEXAR is offline
LEXAR
Участник
 
27 / 17 (1) ++
Регистрация: 11.09.2009
Или можно просто сделать переадресацию на файл:
Код:
Response.Redirect("путь_к_файлу");
при таком способе выставлется соответствующий MIME-тип, появляется стандартный диалог сохранения или открытия файла. Но при этом у контролов с Ajax, окно "Загрузка информации" не исчезает даже после загрузки файла. Поэтому используется способ из предыдущего поста, открывающего загрузку в новом окне.
Старый 17.06.2010, 15:17   #4  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от LEXAR Посмотреть сообщение
Или можно просто сделать переадресацию на файл:
Код:
Response.Redirect("путь_к_файлу");

Что-то я не понимаю, как этим способом можно воспользоваться. Редирект ведь надо делать на URL, например response.redirect("http://www.google.com"). Редирект на "C:\Windows\Temp\tmp7B92.tmp" браузер не поймет. Редирект на "file:///Windows/Temp/tmp7B92.tmp" будет искать файл на компьютере клиента, а не на сервере.
Старый 17.06.2010, 15:59   #5  
LEXAR is offline
LEXAR
Участник
 
27 / 17 (1) ++
Регистрация: 11.09.2009
из примера выше, взятого с блога по ссылке:
Код:
AxUrlMenuItem menuItem = new AxUrlMenuItem("EPDocuGet");
        DataSetViewRow row = dsEPCustInvoiceJournalInfo.GetDataSet().DataSetViews[0].GetCurrent();
        AxTableContext context = AxTableContext.Create(row.GetDefaultTableDataKey(row.DataSetView.Metadata.RootDataSource));
        menuItem.MenuItemContext = context;
   
        Response.Redirect(menuItem.Url.ToString());
Старый 17.06.2010, 16:48   #6  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Разбираюсь с этим примером
Кстати, URL menu item EPDocuGet из примера как раз и ссылается на "_layouts/ep/downloaddocument.aspx" - местоположение, на которое AX ругается (см. первоначальный пост). Если я захочу создать веблет в том же месте, непонятно как это сделать.

Смотрим на код downloaddocument.aspx: он ссылается на веблет EPDocuGetWebLet, который для моей задачи не подходит. EPDocuGetWebLet принимает как параметр конкретную запись таблицы, генерирует по ней отчет и возвращает pdf. У меня же pdf уже есть, мне надо только вернуть его пользователю.

Получается, что надо или допиливать EPDocuGetWebLet или создавать собственный веблет. Других вариантов нет, без веблетов никак?
Старый 17.06.2010, 19:23   #7  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Допилил немного EPDocuGetWebLet. Передаю ему имя файла из X++:
X++:
    menuFunction = new WebUrlMenuFunction(weburlitemstr(EPDocuGet));
    weblink = new WebLink();
    webLink.menufunction(menuFunction);
    weblink.addOrUpdateExtraParam("filename", filename);
    webSession().redirect(webLink);

В веблете его использую:
X++:
webSession.getParm("filename")

Файл отдается пользователю. Но это никуда не годится, потому что в веблет параметры передаются в открытом виде:
httр://EnterprisePortalSite/ax/_layouts/ep/downloaddocument.aspx?filename=C:\Windows\TEMP\tmp13AB.tmp&WCMP=cee&WCIV=634123832942290973

Есть какой-нибудь стандартный способ зашифровки передающегося параметра перед подобным редиректом ? Что порекомендуете?
Старый 17.06.2010, 22:31   #8  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Может просто ограничить права доступа для учетной записи, под которой работает бизнес-коннектор?
__________________
С уважением,
glibs®
Старый 17.06.2010, 23:06   #9  
alex55 is offline
alex55
MCTS
MCBMSS
 
224 / 145 (5) +++++
Регистрация: 13.02.2007
Адрес: Москва
Цитата:
Сообщение от Hyper Посмотреть сообщение
Есть какой-нибудь стандартный способ зашифровки передающегося параметра перед подобным редиректом ? Что порекомендуете?
Включение стандартного шифрования в настройках EP, например?
Старый 18.06.2010, 00:25   #10  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от glibs Посмотреть сообщение
Может просто ограничить права доступа для учетной записи, под которой работает бизнес-коннектор?

Это не спасет: зная путь и имя файла, любой пользователь сможет его скачать. Нужно, чтобы пользователь и не подозревал, где именно на сервере лежит файл.
Цитата:
Сообщение от alex55 Посмотреть сообщение
Включение стандартного шифрования в настройках EP, например?

В настройках сайта шифрование, разумеется, включено.

Кажется, нашел метод шифрования конкретного параметра. Хак, конечно, но все же: добавляем в метод \Classes\WebSession\paramRequiresEncryption строчку
X++:
            case 'WFNM':
- и золотой ключик у нас в кармане. Линк с параметром WFNM теперь выглядит так:
httр://vmax2009chmdev1:8080/sites/ax/_layouts/ep/downloaddocument.aspx?WFNM=8c1586207c7ab4f43e22154a96a38db51539556da84d3e740b3f9eae9bab756b00ae4ec95616acb6302bcd1fb1ff0c04c9bc7754ae5302f806488e97a1a00d372a1a13fc017c649294656e8016d1db95cb7749f3df4516bd&WCMP=cee&WCIV=634124027024790310
Старый 18.06.2010, 02:22   #11  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от LEXAR Посмотреть сообщение
Тут описан такой пример

Кстати, попробовал я этот код:
X++:
            string pdfUrl = (string)this.dsMyDataSet.GetDataSet().DataSetRun.AxaptaObjectAdapter.Call("getPdfUrl");
            pdfUrl = "window.open('" + pdfUrl + "', '_blank', '' );";
            ScriptManager.RegisterStartupScript(this, typeof(string), "OPEN_WINDOW", pdfUrl, true);

Символы амперсанда при открытии нового окна трансформируются в &
Соответственно, ничего не открывается.

http://vmax2009chmdev1:8080/sites/ax/_layouts/ep/downloaddocument.aspx?WFNM=28bb82fdfd1a3fблаблаблаbe5dbce3b7cca792&WCMP=cee&WCIV=634124096668411683

В общем, задача с горем пополам решена. Осталось отшлифовать отдельные моменты.
Старый 05.11.2014, 08:43   #12  
jonny is offline
jonny
Участник
Аватар для jonny
Самостоятельные клиенты AX
 
217 / 124 (5) +++++
Регистрация: 10.02.2006
Адрес: СПб-Екб-?
Цитата:
Сообщение от Hyper Посмотреть сообщение
Допилил немного EPDocuGetWebLet. Передаю ему имя файла из X++:
X++:
    menuFunction = new WebUrlMenuFunction(weburlitemstr(EPDocuGet));
    weblink = new WebLink();
    webLink.menufunction(menuFunction);
    weblink.addOrUpdateExtraParam("filename", filename);
    webSession().redirect(webLink);
В веблете его использую:
X++:
webSession.getParm("filename")
Файл отдается пользователю. Но это никуда не годится, потому что в веблет параметры передаются в открытом виде:
httр://EnterprisePortalSite/ax/_layouts/ep/downloaddocument.aspx?filename=C:\Windows\TEMP\tmp13AB.tmp&WCMP=cee&WCIV=634123832942290973

Есть какой-нибудь стандартный способ зашифровки передающегося параметра перед подобным редиректом ? Что порекомендуете?

Подниму тему. Может вспомните, были ли какие то проблемы при модификации вэблета? Сделал так же как вы, но либо изменения в классе не "видятся" либо параметр не передается, в общем открывается пустая страница, файл не отдается.
Старый 06.11.2014, 10:55   #13  
Dreadlock is offline
Dreadlock
Участник
Аватар для Dreadlock
 
298 / 224 (8) ++++++
Регистрация: 07.05.2009
Адрес: Москва
Мы делаем так
C:\Windows\TEMP - или любую другую папку зашили в параметры портала в Ах
Строку для скачивания переделываем в httр://EnterprisePortalSite/ax/_layouts/ep/downloaddocument.aspx?filename=tmp13AB.tmp&WCMP=cee&WCIV=634123832942290973 (расширение можно убрать)

Дальше в EPDocuGet.run смотрим параметр filename: webSession.getParm("filename") != ''
Собираем путь к файлу C:\Windows\TEMP\ + webSession.getParm("filename") и передаем в метод, EPDocuGet::runDocument который надо переписать под свои нужды.

Этот способ уже обсуждался на форуме, только не смог быстро найти тему
Теги
enterprise portal

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AxUpdatePortal.exe does not update Enterprise Portal when not running from an elevated command prompt Blog bot DAX Blogs 0 26.07.2009 15:07
Solutions Monkey: Microsoft Dynamics AX 2009 Enterprise Portal / Role Centers - Deployment Tips-n-Tricks – 3 Blog bot DAX Blogs 0 27.10.2008 08:05
Solutions Monkey: Enterprise Portal Screencasts at Channel9.msdn.com Blog bot DAX Blogs 6 01.07.2008 19:38
jinx: Microsoft Dynamics AX 2009 Enterprise Portal Entwicklung Samples Blog bot DAX auf Deutsch 0 27.06.2008 04:06
JOPX: Integrating MOSS 2007 and Dynamics AX Part II - installing and configuring Dynamics AX Enterprise Portal Blog bot DAX Blogs 0 02.03.2008 06:42

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:45.