17.06.2010, 02:16 | #1 |
Участник
|
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 |
Участник
|
Тут описан такой пример:
Код: 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 |
Участник
|
Или можно просто сделать переадресацию на файл:
Код: Response.Redirect("путь_к_файлу"); |
|
17.06.2010, 15:17 | #4 |
Участник
|
Цитата:
Что-то я не понимаю, как этим способом можно воспользоваться. Редирект ведь надо делать на URL, например response.redirect("http://www.google.com"). Редирект на "C:\Windows\Temp\tmp7B92.tmp" браузер не поймет. Редирект на "file:///Windows/Temp/tmp7B92.tmp" будет искать файл на компьютере клиента, а не на сервере. |
|
17.06.2010, 15:59 | #5 |
Участник
|
из примера выше, взятого с блога по ссылке:
Код: 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 |
Участник
|
Разбираюсь с этим примером
Кстати, URL menu item EPDocuGet из примера как раз и ссылается на "_layouts/ep/downloaddocument.aspx" - местоположение, на которое AX ругается (см. первоначальный пост). Если я захочу создать веблет в том же месте, непонятно как это сделать.
Смотрим на код downloaddocument.aspx: он ссылается на веблет EPDocuGetWebLet, который для моей задачи не подходит. EPDocuGetWebLet принимает как параметр конкретную запись таблицы, генерирует по ней отчет и возвращает pdf. У меня же pdf уже есть, мне надо только вернуть его пользователю. Получается, что надо или допиливать EPDocuGetWebLet или создавать собственный веблет. Других вариантов нет, без веблетов никак? |
|
17.06.2010, 19:23 | #7 |
Участник
|
Допилил немного 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 |
Member
|
Может просто ограничить права доступа для учетной записи, под которой работает бизнес-коннектор?
__________________
С уважением, glibs® |
|
17.06.2010, 23:06 | #9 |
MCTS
|
|
|
18.06.2010, 00:25 | #10 |
Участник
|
Цитата:
Это не спасет: зная путь и имя файла, любой пользователь сможет его скачать. Нужно, чтобы пользователь и не подозревал, где именно на сервере лежит файл. В настройках сайта шифрование, разумеется, включено. Кажется, нашел метод шифрования конкретного параметра. Хак, конечно, но все же: добавляем в метод \Classes\WebSession\paramRequiresEncryption строчку X++: case 'WFNM': httр://vmax2009chmdev1:8080/sites/ax/_layouts/ep/downloaddocument.aspx?WFNM=8c1586207c7ab4f43e22154a96a38db51539556da84d3e740b3f9eae9bab756b00ae4ec95616acb6302bcd1fb1ff0c04c9bc7754ae5302f806488e97a1a00d372a1a13fc017c649294656e8016d1db95cb7749f3df4516bd&WCMP=cee&WCIV=634124027024790310 |
|
18.06.2010, 02:22 | #11 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Мы делаем так
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 |
|
|